s390: add barriers to qeth driver
[safe/jmp/linux-2.6] / drivers / s390 / net / qeth_main.c
1 /*
2  * linux/drivers/s390/net/qeth_main.c
3  *
4  * Linux on zSeries OSA Express and HiperSockets support
5  *
6  * Copyright 2000,2003 IBM Corporation
7  *
8  *    Author(s): Original Code written by
9  *                        Utz Bacher (utz.bacher@de.ibm.com)
10  *               Rewritten by
11  *                        Frank Pavlic (fpavlic@de.ibm.com) and
12  *                        Thomas Spatzier <tspat@de.ibm.com>
13  *
14  * This program is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU General Public License as published by
16  * the Free Software Foundation; either version 2, or (at your option)
17  * any later version.
18  *
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License
25  * along with this program; if not, write to the Free Software
26  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27  */
28
29
30 #include <linux/module.h>
31 #include <linux/moduleparam.h>
32 #include <linux/string.h>
33 #include <linux/errno.h>
34 #include <linux/mm.h>
35 #include <linux/ip.h>
36 #include <linux/inetdevice.h>
37 #include <linux/netdevice.h>
38 #include <linux/sched.h>
39 #include <linux/workqueue.h>
40 #include <linux/kernel.h>
41 #include <linux/slab.h>
42 #include <linux/interrupt.h>
43 #include <linux/tcp.h>
44 #include <linux/icmp.h>
45 #include <linux/skbuff.h>
46 #include <linux/in.h>
47 #include <linux/igmp.h>
48 #include <linux/init.h>
49 #include <linux/reboot.h>
50 #include <linux/mii.h>
51 #include <linux/rcupdate.h>
52 #include <linux/ethtool.h>
53
54 #include <net/arp.h>
55 #include <net/ip.h>
56 #include <net/route.h>
57
58 #include <asm/ebcdic.h>
59 #include <asm/io.h>
60 #include <asm/qeth.h>
61 #include <asm/timex.h>
62 #include <asm/semaphore.h>
63 #include <asm/uaccess.h>
64 #include <asm/s390_rdev.h>
65
66 #include "qeth.h"
67 #include "qeth_mpc.h"
68 #include "qeth_fs.h"
69 #include "qeth_eddp.h"
70 #include "qeth_tso.h"
71
72 static const char *version = "qeth S/390 OSA-Express driver";
73
74 /**
75  * Debug Facility Stuff
76  */
77 static debug_info_t *qeth_dbf_setup = NULL;
78 static debug_info_t *qeth_dbf_data = NULL;
79 static debug_info_t *qeth_dbf_misc = NULL;
80 static debug_info_t *qeth_dbf_control = NULL;
81 debug_info_t *qeth_dbf_trace = NULL;
82 static debug_info_t *qeth_dbf_sense = NULL;
83 static debug_info_t *qeth_dbf_qerr = NULL;
84
85 DEFINE_PER_CPU(char[256], qeth_dbf_txt_buf);
86
87 static struct lock_class_key qdio_out_skb_queue_key;
88
89 /**
90  * some more definitions and declarations
91  */
92 static unsigned int known_devices[][10] = QETH_MODELLIST_ARRAY;
93
94 /* list of our cards */
95 struct qeth_card_list_struct qeth_card_list;
96 /*process list want to be notified*/
97 spinlock_t qeth_notify_lock;
98 struct list_head qeth_notify_list;
99
100 static void qeth_send_control_data_cb(struct qeth_channel *,
101                                       struct qeth_cmd_buffer *);
102
103 /**
104  * here we go with function implementation
105  */
106 static void
107 qeth_init_qdio_info(struct qeth_card *card);
108
109 static int
110 qeth_init_qdio_queues(struct qeth_card *card);
111
112 static int
113 qeth_alloc_qdio_buffers(struct qeth_card *card);
114
115 static void
116 qeth_free_qdio_buffers(struct qeth_card *);
117
118 static void
119 qeth_clear_qdio_buffers(struct qeth_card *);
120
121 static void
122 qeth_clear_ip_list(struct qeth_card *, int, int);
123
124 static void
125 qeth_clear_ipacmd_list(struct qeth_card *);
126
127 static int
128 qeth_qdio_clear_card(struct qeth_card *, int);
129
130 static void
131 qeth_clear_working_pool_list(struct qeth_card *);
132
133 static void
134 qeth_clear_cmd_buffers(struct qeth_channel *);
135
136 static int
137 qeth_stop(struct net_device *);
138
139 static void
140 qeth_clear_ipato_list(struct qeth_card *);
141
142 static int
143 qeth_is_addr_covered_by_ipato(struct qeth_card *, struct qeth_ipaddr *);
144
145 static void
146 qeth_irq_tasklet(unsigned long);
147
148 static int
149 qeth_set_online(struct ccwgroup_device *);
150
151 static int
152 __qeth_set_online(struct ccwgroup_device *gdev, int recovery_mode);
153
154 static struct qeth_ipaddr *
155 qeth_get_addr_buffer(enum qeth_prot_versions);
156
157 static void
158 qeth_set_multicast_list(struct net_device *);
159
160 static void
161 qeth_setadp_promisc_mode(struct qeth_card *);
162
163 static void
164 qeth_notify_processes(void)
165 {
166         /*notify all  registered processes */
167         struct qeth_notify_list_struct *n_entry;
168
169         QETH_DBF_TEXT(trace,3,"procnoti");
170         spin_lock(&qeth_notify_lock);
171         list_for_each_entry(n_entry, &qeth_notify_list, list) {
172                 send_sig(n_entry->signum, n_entry->task, 1);
173         }
174         spin_unlock(&qeth_notify_lock);
175
176 }
177 int
178 qeth_notifier_unregister(struct task_struct *p)
179 {
180         struct qeth_notify_list_struct *n_entry, *tmp;
181
182         QETH_DBF_TEXT(trace, 2, "notunreg");
183         spin_lock(&qeth_notify_lock);
184         list_for_each_entry_safe(n_entry, tmp, &qeth_notify_list, list) {
185                 if (n_entry->task == p) {
186                         list_del(&n_entry->list);
187                         kfree(n_entry);
188                         goto out;
189                 }
190         }
191 out:
192         spin_unlock(&qeth_notify_lock);
193         return 0;
194 }
195 int
196 qeth_notifier_register(struct task_struct *p, int signum)
197 {
198         struct qeth_notify_list_struct *n_entry;
199
200         /*check first if entry already exists*/
201         spin_lock(&qeth_notify_lock);
202         list_for_each_entry(n_entry, &qeth_notify_list, list) {
203                 if (n_entry->task == p) {
204                         n_entry->signum = signum;
205                         spin_unlock(&qeth_notify_lock);
206                         return 0;
207                 }
208         }
209         spin_unlock(&qeth_notify_lock);
210
211         n_entry = (struct qeth_notify_list_struct *)
212                 kmalloc(sizeof(struct qeth_notify_list_struct),GFP_KERNEL);
213         if (!n_entry)
214                 return -ENOMEM;
215         n_entry->task = p;
216         n_entry->signum = signum;
217         spin_lock(&qeth_notify_lock);
218         list_add(&n_entry->list,&qeth_notify_list);
219         spin_unlock(&qeth_notify_lock);
220         return 0;
221 }
222
223
224 /**
225  * free channel command buffers
226  */
227 static void
228 qeth_clean_channel(struct qeth_channel *channel)
229 {
230         int cnt;
231
232         QETH_DBF_TEXT(setup, 2, "freech");
233         for (cnt = 0; cnt < QETH_CMD_BUFFER_NO; cnt++)
234                 kfree(channel->iob[cnt].data);
235 }
236
237 /**
238  * free card
239  */
240 static void
241 qeth_free_card(struct qeth_card *card)
242 {
243
244         QETH_DBF_TEXT(setup, 2, "freecrd");
245         QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
246         qeth_clean_channel(&card->read);
247         qeth_clean_channel(&card->write);
248         if (card->dev)
249                 free_netdev(card->dev);
250         qeth_clear_ip_list(card, 0, 0);
251         qeth_clear_ipato_list(card);
252         kfree(card->ip_tbd_list);
253         qeth_free_qdio_buffers(card);
254         kfree(card);
255 }
256
257 /**
258  * alloc memory for command buffer per channel
259  */
260 static int
261 qeth_setup_channel(struct qeth_channel *channel)
262 {
263         int cnt;
264
265         QETH_DBF_TEXT(setup, 2, "setupch");
266         for (cnt=0; cnt < QETH_CMD_BUFFER_NO; cnt++) {
267                 channel->iob[cnt].data = (char *)
268                         kmalloc(QETH_BUFSIZE, GFP_DMA|GFP_KERNEL);
269                 if (channel->iob[cnt].data == NULL)
270                         break;
271                 channel->iob[cnt].state = BUF_STATE_FREE;
272                 channel->iob[cnt].channel = channel;
273                 channel->iob[cnt].callback = qeth_send_control_data_cb;
274                 channel->iob[cnt].rc = 0;
275         }
276         if (cnt < QETH_CMD_BUFFER_NO) {
277                 while (cnt-- > 0)
278                         kfree(channel->iob[cnt].data);
279                 return -ENOMEM;
280         }
281         channel->buf_no = 0;
282         channel->io_buf_no = 0;
283         atomic_set(&channel->irq_pending, 0);
284         spin_lock_init(&channel->iob_lock);
285
286         init_waitqueue_head(&channel->wait_q);
287         channel->irq_tasklet.data = (unsigned long) channel;
288         channel->irq_tasklet.func = qeth_irq_tasklet;
289         return 0;
290 }
291
292 /**
293  * alloc memory for card structure
294  */
295 static struct qeth_card *
296 qeth_alloc_card(void)
297 {
298         struct qeth_card *card;
299
300         QETH_DBF_TEXT(setup, 2, "alloccrd");
301         card = kzalloc(sizeof(struct qeth_card), GFP_DMA|GFP_KERNEL);
302         if (!card)
303                 return NULL;
304         QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
305         if (qeth_setup_channel(&card->read)) {
306                 kfree(card);
307                 return NULL;
308         }
309         if (qeth_setup_channel(&card->write)) {
310                 qeth_clean_channel(&card->read);
311                 kfree(card);
312                 return NULL;
313         }
314         return card;
315 }
316
317 static long
318 __qeth_check_irb_error(struct ccw_device *cdev, unsigned long intparm,
319                        struct irb *irb)
320 {
321         if (!IS_ERR(irb))
322                 return 0;
323
324         switch (PTR_ERR(irb)) {
325         case -EIO:
326                 PRINT_WARN("i/o-error on device %s\n", cdev->dev.bus_id);
327                 QETH_DBF_TEXT(trace, 2, "ckirberr");
328                 QETH_DBF_TEXT_(trace, 2, "  rc%d", -EIO);
329                 break;
330         case -ETIMEDOUT:
331                 PRINT_WARN("timeout on device %s\n", cdev->dev.bus_id);
332                 QETH_DBF_TEXT(trace, 2, "ckirberr");
333                 QETH_DBF_TEXT_(trace, 2, "  rc%d", -ETIMEDOUT);
334                 if (intparm == QETH_RCD_PARM) {
335                         struct qeth_card *card = CARD_FROM_CDEV(cdev);
336
337                         if (card && (card->data.ccwdev == cdev)) {
338                                 card->data.state = CH_STATE_DOWN;
339                                 wake_up(&card->wait_q);
340                         }
341                 }
342                 break;
343         default:
344                 PRINT_WARN("unknown error %ld on device %s\n", PTR_ERR(irb),
345                            cdev->dev.bus_id);
346                 QETH_DBF_TEXT(trace, 2, "ckirberr");
347                 QETH_DBF_TEXT(trace, 2, "  rc???");
348         }
349         return PTR_ERR(irb);
350 }
351
352 static int
353 qeth_get_problem(struct ccw_device *cdev, struct irb *irb)
354 {
355         int dstat,cstat;
356         char *sense;
357
358         sense = (char *) irb->ecw;
359         cstat = irb->scsw.cstat;
360         dstat = irb->scsw.dstat;
361
362         if (cstat & (SCHN_STAT_CHN_CTRL_CHK | SCHN_STAT_INTF_CTRL_CHK |
363                      SCHN_STAT_CHN_DATA_CHK | SCHN_STAT_CHAIN_CHECK |
364                      SCHN_STAT_PROT_CHECK | SCHN_STAT_PROG_CHECK)) {
365                 QETH_DBF_TEXT(trace,2, "CGENCHK");
366                 PRINT_WARN("check on device %s, dstat=x%x, cstat=x%x ",
367                            cdev->dev.bus_id, dstat, cstat);
368                 HEXDUMP16(WARN, "irb: ", irb);
369                 HEXDUMP16(WARN, "irb: ", ((char *) irb) + 32);
370                 return 1;
371         }
372
373         if (dstat & DEV_STAT_UNIT_CHECK) {
374                 if (sense[SENSE_RESETTING_EVENT_BYTE] &
375                     SENSE_RESETTING_EVENT_FLAG) {
376                         QETH_DBF_TEXT(trace,2,"REVIND");
377                         return 1;
378                 }
379                 if (sense[SENSE_COMMAND_REJECT_BYTE] &
380                     SENSE_COMMAND_REJECT_FLAG) {
381                         QETH_DBF_TEXT(trace,2,"CMDREJi");
382                         return 0;
383                 }
384                 if ((sense[2] == 0xaf) && (sense[3] == 0xfe)) {
385                         QETH_DBF_TEXT(trace,2,"AFFE");
386                         return 1;
387                 }
388                 if ((!sense[0]) && (!sense[1]) && (!sense[2]) && (!sense[3])) {
389                         QETH_DBF_TEXT(trace,2,"ZEROSEN");
390                         return 0;
391                 }
392                 QETH_DBF_TEXT(trace,2,"DGENCHK");
393                         return 1;
394         }
395         return 0;
396 }
397 static int qeth_issue_next_read(struct qeth_card *);
398
399 /**
400  * interrupt handler
401  */
402 static void
403 qeth_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
404 {
405         int rc;
406         int cstat,dstat;
407         struct qeth_cmd_buffer *buffer;
408         struct qeth_channel *channel;
409         struct qeth_card *card;
410
411         QETH_DBF_TEXT(trace,5,"irq");
412
413         if (__qeth_check_irb_error(cdev, intparm, irb))
414                 return;
415         cstat = irb->scsw.cstat;
416         dstat = irb->scsw.dstat;
417
418         card = CARD_FROM_CDEV(cdev);
419         if (!card)
420                 return;
421
422         if (card->read.ccwdev == cdev){
423                 channel = &card->read;
424                 QETH_DBF_TEXT(trace,5,"read");
425         } else if (card->write.ccwdev == cdev) {
426                 channel = &card->write;
427                 QETH_DBF_TEXT(trace,5,"write");
428         } else {
429                 channel = &card->data;
430                 QETH_DBF_TEXT(trace,5,"data");
431         }
432         atomic_set(&channel->irq_pending, 0);
433
434         if (irb->scsw.fctl & (SCSW_FCTL_CLEAR_FUNC))
435                 channel->state = CH_STATE_STOPPED;
436
437         if (irb->scsw.fctl & (SCSW_FCTL_HALT_FUNC))
438                 channel->state = CH_STATE_HALTED;
439
440         /*let's wake up immediately on data channel*/
441         if ((channel == &card->data) && (intparm != 0) &&
442             (intparm != QETH_RCD_PARM))
443                 goto out;
444
445         if (intparm == QETH_CLEAR_CHANNEL_PARM) {
446                 QETH_DBF_TEXT(trace, 6, "clrchpar");
447                 /* we don't have to handle this further */
448                 intparm = 0;
449         }
450         if (intparm == QETH_HALT_CHANNEL_PARM) {
451                 QETH_DBF_TEXT(trace, 6, "hltchpar");
452                 /* we don't have to handle this further */
453                 intparm = 0;
454         }
455         if ((dstat & DEV_STAT_UNIT_EXCEP) ||
456             (dstat & DEV_STAT_UNIT_CHECK) ||
457             (cstat)) {
458                 if (irb->esw.esw0.erw.cons) {
459                         /* TODO: we should make this s390dbf */
460                         PRINT_WARN("sense data available on channel %s.\n",
461                                    CHANNEL_ID(channel));
462                         PRINT_WARN(" cstat 0x%X\n dstat 0x%X\n", cstat, dstat);
463                         HEXDUMP16(WARN,"irb: ",irb);
464                         HEXDUMP16(WARN,"sense data: ",irb->ecw);
465                 }
466                 if (intparm == QETH_RCD_PARM) {
467                         channel->state = CH_STATE_DOWN;
468                         goto out;
469                 }
470                 rc = qeth_get_problem(cdev,irb);
471                 if (rc) {
472                         qeth_schedule_recovery(card);
473                         goto out;
474                 }
475         }
476
477         if (intparm == QETH_RCD_PARM) {
478                 channel->state = CH_STATE_RCD_DONE;
479                 goto out;
480         }
481         if (intparm) {
482                 buffer = (struct qeth_cmd_buffer *) __va((addr_t)intparm);
483                 buffer->state = BUF_STATE_PROCESSED;
484         }
485         if (channel == &card->data)
486                 return;
487
488         if (channel == &card->read &&
489             channel->state == CH_STATE_UP)
490                 qeth_issue_next_read(card);
491
492         qeth_irq_tasklet((unsigned long)channel);
493         return;
494 out:
495         wake_up(&card->wait_q);
496 }
497
498 /**
499  * tasklet function scheduled from irq handler
500  */
501 static void
502 qeth_irq_tasklet(unsigned long data)
503 {
504         struct qeth_card *card;
505         struct qeth_channel *channel;
506         struct qeth_cmd_buffer *iob;
507         __u8 index;
508
509         QETH_DBF_TEXT(trace,5,"irqtlet");
510         channel = (struct qeth_channel *) data;
511         iob = channel->iob;
512         index = channel->buf_no;
513         card = CARD_FROM_CDEV(channel->ccwdev);
514         while (iob[index].state == BUF_STATE_PROCESSED) {
515                 if (iob[index].callback !=NULL) {
516                         iob[index].callback(channel,iob + index);
517                 }
518                 index = (index + 1) % QETH_CMD_BUFFER_NO;
519         }
520         channel->buf_no = index;
521         wake_up(&card->wait_q);
522 }
523
524 static int qeth_stop_card(struct qeth_card *, int);
525
526 static int
527 __qeth_set_offline(struct ccwgroup_device *cgdev, int recovery_mode)
528 {
529         struct qeth_card *card = (struct qeth_card *) cgdev->dev.driver_data;
530         int rc = 0, rc2 = 0, rc3 = 0;
531         enum qeth_card_states recover_flag;
532
533         QETH_DBF_TEXT(setup, 3, "setoffl");
534         QETH_DBF_HEX(setup, 3, &card, sizeof(void *));
535
536         if (card->dev && netif_carrier_ok(card->dev))
537                 netif_carrier_off(card->dev);
538         recover_flag = card->state;
539         if (qeth_stop_card(card, recovery_mode) == -ERESTARTSYS){
540                 PRINT_WARN("Stopping card %s interrupted by user!\n",
541                            CARD_BUS_ID(card));
542                 return -ERESTARTSYS;
543         }
544         rc  = ccw_device_set_offline(CARD_DDEV(card));
545         rc2 = ccw_device_set_offline(CARD_WDEV(card));
546         rc3 = ccw_device_set_offline(CARD_RDEV(card));
547         if (!rc)
548                 rc = (rc2) ? rc2 : rc3;
549         if (rc)
550                 QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
551         if (recover_flag == CARD_STATE_UP)
552                 card->state = CARD_STATE_RECOVER;
553         qeth_notify_processes();
554         return 0;
555 }
556
557 static int
558 qeth_set_offline(struct ccwgroup_device *cgdev)
559 {
560         return  __qeth_set_offline(cgdev, 0);
561 }
562
563 static int
564 qeth_wait_for_threads(struct qeth_card *card, unsigned long threads);
565
566
567 static void
568 qeth_remove_device(struct ccwgroup_device *cgdev)
569 {
570         struct qeth_card *card = (struct qeth_card *) cgdev->dev.driver_data;
571         unsigned long flags;
572
573         QETH_DBF_TEXT(setup, 3, "rmdev");
574         QETH_DBF_HEX(setup, 3, &card, sizeof(void *));
575
576         if (!card)
577                 return;
578
579         if (qeth_wait_for_threads(card, 0xffffffff))
580                 return;
581
582         if (cgdev->state == CCWGROUP_ONLINE){
583                 card->use_hard_stop = 1;
584                 qeth_set_offline(cgdev);
585         }
586         /* remove form our internal list */
587         write_lock_irqsave(&qeth_card_list.rwlock, flags);
588         list_del(&card->list);
589         write_unlock_irqrestore(&qeth_card_list.rwlock, flags);
590         if (card->dev)
591                 unregister_netdev(card->dev);
592         qeth_remove_device_attributes(&cgdev->dev);
593         qeth_free_card(card);
594         cgdev->dev.driver_data = NULL;
595         put_device(&cgdev->dev);
596 }
597
598 static int
599 qeth_register_addr_entry(struct qeth_card *, struct qeth_ipaddr *);
600 static int
601 qeth_deregister_addr_entry(struct qeth_card *, struct qeth_ipaddr *);
602
603 /**
604  * Add/remove address to/from card's ip list, i.e. try to add or remove
605  * reference to/from an IP address that is already registered on the card.
606  * Returns:
607  *      0  address was on card and its reference count has been adjusted,
608  *         but is still > 0, so nothing has to be done
609  *         also returns 0 if card was not on card and the todo was to delete
610  *         the address -> there is also nothing to be done
611  *      1  address was not on card and the todo is to add it to the card's ip
612  *         list
613  *      -1 address was on card and its reference count has been decremented
614  *         to <= 0 by the todo -> address must be removed from card
615  */
616 static int
617 __qeth_ref_ip_on_card(struct qeth_card *card, struct qeth_ipaddr *todo,
618                       struct qeth_ipaddr **__addr)
619 {
620         struct qeth_ipaddr *addr;
621         int found = 0;
622
623         list_for_each_entry(addr, &card->ip_list, entry) {
624                 if (card->options.layer2) {
625                         if ((addr->type == todo->type) &&
626                             (memcmp(&addr->mac, &todo->mac,
627                                     OSA_ADDR_LEN) == 0)) {
628                                 found = 1;
629                                 break;
630                         }
631                         continue;
632                 }
633                 if ((addr->proto     == QETH_PROT_IPV4)  &&
634                     (todo->proto     == QETH_PROT_IPV4)  &&
635                     (addr->type      == todo->type)      &&
636                     (addr->u.a4.addr == todo->u.a4.addr) &&
637                     (addr->u.a4.mask == todo->u.a4.mask)) {
638                         found = 1;
639                         break;
640                 }
641                 if ((addr->proto       == QETH_PROT_IPV6)     &&
642                     (todo->proto       == QETH_PROT_IPV6)     &&
643                     (addr->type        == todo->type)         &&
644                     (addr->u.a6.pfxlen == todo->u.a6.pfxlen)  &&
645                     (memcmp(&addr->u.a6.addr, &todo->u.a6.addr,
646                             sizeof(struct in6_addr)) == 0)) {
647                         found = 1;
648                         break;
649                 }
650         }
651         if (found) {
652                 addr->users += todo->users;
653                 if (addr->users <= 0){
654                         *__addr = addr;
655                         return -1;
656                 } else {
657                         /* for VIPA and RXIP limit refcount to 1 */
658                         if (addr->type != QETH_IP_TYPE_NORMAL)
659                                 addr->users = 1;
660                         return 0;
661                 }
662         }
663         if (todo->users > 0) {
664                 /* for VIPA and RXIP limit refcount to 1 */
665                 if (todo->type != QETH_IP_TYPE_NORMAL)
666                         todo->users = 1;
667                 return 1;
668         } else
669                 return 0;
670 }
671
672 static int
673 __qeth_address_exists_in_list(struct list_head *list, struct qeth_ipaddr *addr,
674                               int same_type)
675 {
676         struct qeth_ipaddr *tmp;
677
678         list_for_each_entry(tmp, list, entry) {
679                 if ((tmp->proto     == QETH_PROT_IPV4)            &&
680                     (addr->proto    == QETH_PROT_IPV4)            &&
681                     ((same_type && (tmp->type == addr->type)) ||
682                      (!same_type && (tmp->type != addr->type))  ) &&
683                     (tmp->u.a4.addr == addr->u.a4.addr)             ){
684                         return 1;
685                 }
686                 if ((tmp->proto  == QETH_PROT_IPV6)               &&
687                     (addr->proto == QETH_PROT_IPV6)               &&
688                     ((same_type && (tmp->type == addr->type)) ||
689                      (!same_type && (tmp->type != addr->type))  ) &&
690                     (memcmp(&tmp->u.a6.addr, &addr->u.a6.addr,
691                             sizeof(struct in6_addr)) == 0)          ) {
692                         return 1;
693                 }
694         }
695         return 0;
696 }
697
698 /*
699  * Add IP to be added to todo list. If there is already an "add todo"
700  * in this list we just incremenent the reference count.
701  * Returns 0 if we  just incremented reference count.
702  */
703 static int
704 __qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add)
705 {
706         struct qeth_ipaddr *tmp, *t;
707         int found = 0;
708
709         list_for_each_entry_safe(tmp, t, card->ip_tbd_list, entry) {
710                 if ((addr->type == QETH_IP_TYPE_DEL_ALL_MC) &&
711                     (tmp->type == QETH_IP_TYPE_DEL_ALL_MC))
712                         return 0;
713                 if (card->options.layer2) {
714                         if ((tmp->type  == addr->type)  &&
715                             (tmp->is_multicast == addr->is_multicast) &&
716                             (memcmp(&tmp->mac, &addr->mac,
717                                     OSA_ADDR_LEN) == 0)) {
718                                 found = 1;
719                                 break;
720                         }
721                         continue;
722                 }
723                 if ((tmp->proto        == QETH_PROT_IPV4)     &&
724                     (addr->proto       == QETH_PROT_IPV4)     &&
725                     (tmp->type         == addr->type)         &&
726                     (tmp->is_multicast == addr->is_multicast) &&
727                     (tmp->u.a4.addr    == addr->u.a4.addr)    &&
728                     (tmp->u.a4.mask    == addr->u.a4.mask)) {
729                         found = 1;
730                         break;
731                 }
732                 if ((tmp->proto        == QETH_PROT_IPV6)      &&
733                     (addr->proto       == QETH_PROT_IPV6)      &&
734                     (tmp->type         == addr->type)          &&
735                     (tmp->is_multicast == addr->is_multicast)  &&
736                     (tmp->u.a6.pfxlen  == addr->u.a6.pfxlen)   &&
737                     (memcmp(&tmp->u.a6.addr, &addr->u.a6.addr,
738                             sizeof(struct in6_addr)) == 0)) {
739                         found = 1;
740                         break;
741                 }
742         }
743         if (found){
744                 if (addr->users != 0)
745                         tmp->users += addr->users;
746                 else
747                         tmp->users += add? 1:-1;
748                 if (tmp->users == 0) {
749                         list_del(&tmp->entry);
750                         kfree(tmp);
751                 }
752                 return 0;
753         } else {
754                 if (addr->type == QETH_IP_TYPE_DEL_ALL_MC)
755                         list_add(&addr->entry, card->ip_tbd_list);
756                 else {
757                         if (addr->users == 0)
758                                 addr->users += add? 1:-1;
759                         if (add && (addr->type == QETH_IP_TYPE_NORMAL) &&
760                             qeth_is_addr_covered_by_ipato(card, addr)){
761                                 QETH_DBF_TEXT(trace, 2, "tkovaddr");
762                                 addr->set_flags |= QETH_IPA_SETIP_TAKEOVER_FLAG;
763                         }
764                         list_add_tail(&addr->entry, card->ip_tbd_list);
765                 }
766                 return 1;
767         }
768 }
769
770 /**
771  * Remove IP address from list
772  */
773 static int
774 qeth_delete_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
775 {
776         unsigned long flags;
777         int rc = 0;
778
779         QETH_DBF_TEXT(trace, 4, "delip");
780
781         if (card->options.layer2)
782                 QETH_DBF_HEX(trace, 4, &addr->mac, 6);
783         else if (addr->proto == QETH_PROT_IPV4)
784                 QETH_DBF_HEX(trace, 4, &addr->u.a4.addr, 4);
785         else {
786                 QETH_DBF_HEX(trace, 4, &addr->u.a6.addr, 8);
787                 QETH_DBF_HEX(trace, 4, ((char *)&addr->u.a6.addr) + 8, 8);
788         }
789         spin_lock_irqsave(&card->ip_lock, flags);
790         rc = __qeth_insert_ip_todo(card, addr, 0);
791         spin_unlock_irqrestore(&card->ip_lock, flags);
792         return rc;
793 }
794
795 static int
796 qeth_add_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
797 {
798         unsigned long flags;
799         int rc = 0;
800
801         QETH_DBF_TEXT(trace, 4, "addip");
802         if (card->options.layer2)
803                 QETH_DBF_HEX(trace, 4, &addr->mac, 6);
804         else if (addr->proto == QETH_PROT_IPV4)
805                 QETH_DBF_HEX(trace, 4, &addr->u.a4.addr, 4);
806         else {
807                 QETH_DBF_HEX(trace, 4, &addr->u.a6.addr, 8);
808                 QETH_DBF_HEX(trace, 4, ((char *)&addr->u.a6.addr) + 8, 8);
809         }
810         spin_lock_irqsave(&card->ip_lock, flags);
811         rc = __qeth_insert_ip_todo(card, addr, 1);
812         spin_unlock_irqrestore(&card->ip_lock, flags);
813         return rc;
814 }
815
816 static void
817 __qeth_delete_all_mc(struct qeth_card *card, unsigned long *flags)
818 {
819         struct qeth_ipaddr *addr, *tmp;
820         int rc;
821 again:
822         list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) {
823                 if (addr->is_multicast) {
824                         spin_unlock_irqrestore(&card->ip_lock, *flags);
825                         rc = qeth_deregister_addr_entry(card, addr);
826                         spin_lock_irqsave(&card->ip_lock, *flags);
827                         if (!rc) {
828                                 list_del(&addr->entry);
829                                 kfree(addr);
830                                 goto again;
831                         }
832                 }
833         }
834 }
835
836 static void
837 qeth_set_ip_addr_list(struct qeth_card *card)
838 {
839         struct list_head *tbd_list;
840         struct qeth_ipaddr *todo, *addr;
841         unsigned long flags;
842         int rc;
843
844         QETH_DBF_TEXT(trace, 2, "sdiplist");
845         QETH_DBF_HEX(trace, 2, &card, sizeof(void *));
846
847         spin_lock_irqsave(&card->ip_lock, flags);
848         tbd_list = card->ip_tbd_list;
849         card->ip_tbd_list = kmalloc(sizeof(struct list_head), GFP_ATOMIC);
850         if (!card->ip_tbd_list) {
851                 QETH_DBF_TEXT(trace, 0, "silnomem");
852                 card->ip_tbd_list = tbd_list;
853                 spin_unlock_irqrestore(&card->ip_lock, flags);
854                 return;
855         } else
856                 INIT_LIST_HEAD(card->ip_tbd_list);
857
858         while (!list_empty(tbd_list)){
859                 todo = list_entry(tbd_list->next, struct qeth_ipaddr, entry);
860                 list_del(&todo->entry);
861                 if (todo->type == QETH_IP_TYPE_DEL_ALL_MC){
862                         __qeth_delete_all_mc(card, &flags);
863                         kfree(todo);
864                         continue;
865                 }
866                 rc = __qeth_ref_ip_on_card(card, todo, &addr);
867                 if (rc == 0) {
868                         /* nothing to be done; only adjusted refcount */
869                         kfree(todo);
870                 } else if (rc == 1) {
871                         /* new entry to be added to on-card list */
872                         spin_unlock_irqrestore(&card->ip_lock, flags);
873                         rc = qeth_register_addr_entry(card, todo);
874                         spin_lock_irqsave(&card->ip_lock, flags);
875                         if (!rc)
876                                 list_add_tail(&todo->entry, &card->ip_list);
877                         else
878                                 kfree(todo);
879                 } else if (rc == -1) {
880                         /* on-card entry to be removed */
881                         list_del_init(&addr->entry);
882                         spin_unlock_irqrestore(&card->ip_lock, flags);
883                         rc = qeth_deregister_addr_entry(card, addr);
884                         spin_lock_irqsave(&card->ip_lock, flags);
885                         if (!rc)
886                                 kfree(addr);
887                         else
888                                 list_add_tail(&addr->entry, &card->ip_list);
889                         kfree(todo);
890                 }
891         }
892         spin_unlock_irqrestore(&card->ip_lock, flags);
893         kfree(tbd_list);
894 }
895
896 static void qeth_delete_mc_addresses(struct qeth_card *);
897 static void qeth_add_multicast_ipv4(struct qeth_card *);
898 static void qeth_layer2_add_multicast(struct qeth_card *);
899 #ifdef CONFIG_QETH_IPV6
900 static void qeth_add_multicast_ipv6(struct qeth_card *);
901 #endif
902
903 static int
904 qeth_set_thread_start_bit(struct qeth_card *card, unsigned long thread)
905 {
906         unsigned long flags;
907
908         spin_lock_irqsave(&card->thread_mask_lock, flags);
909         if ( !(card->thread_allowed_mask & thread) ||
910               (card->thread_start_mask & thread) ) {
911                 spin_unlock_irqrestore(&card->thread_mask_lock, flags);
912                 return -EPERM;
913         }
914         card->thread_start_mask |= thread;
915         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
916         return 0;
917 }
918
919 static void
920 qeth_clear_thread_start_bit(struct qeth_card *card, unsigned long thread)
921 {
922         unsigned long flags;
923
924         spin_lock_irqsave(&card->thread_mask_lock, flags);
925         card->thread_start_mask &= ~thread;
926         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
927         wake_up(&card->wait_q);
928 }
929
930 static void
931 qeth_clear_thread_running_bit(struct qeth_card *card, unsigned long thread)
932 {
933         unsigned long flags;
934
935         spin_lock_irqsave(&card->thread_mask_lock, flags);
936         card->thread_running_mask &= ~thread;
937         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
938         wake_up(&card->wait_q);
939 }
940
941 static int
942 __qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
943 {
944         unsigned long flags;
945         int rc = 0;
946
947         spin_lock_irqsave(&card->thread_mask_lock, flags);
948         if (card->thread_start_mask & thread){
949                 if ((card->thread_allowed_mask & thread) &&
950                     !(card->thread_running_mask & thread)){
951                         rc = 1;
952                         card->thread_start_mask &= ~thread;
953                         card->thread_running_mask |= thread;
954                 } else
955                         rc = -EPERM;
956         }
957         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
958         return rc;
959 }
960
961 static int
962 qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
963 {
964         int rc = 0;
965
966         wait_event(card->wait_q,
967                    (rc = __qeth_do_run_thread(card, thread)) >= 0);
968         return rc;
969 }
970
971 static int
972 qeth_recover(void *ptr)
973 {
974         struct qeth_card *card;
975         int rc = 0;
976
977         card = (struct qeth_card *) ptr;
978         daemonize("qeth_recover");
979         QETH_DBF_TEXT(trace,2,"recover1");
980         QETH_DBF_HEX(trace, 2, &card, sizeof(void *));
981         if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD))
982                 return 0;
983         QETH_DBF_TEXT(trace,2,"recover2");
984         PRINT_WARN("Recovery of device %s started ...\n",
985                    CARD_BUS_ID(card));
986         card->use_hard_stop = 1;
987         __qeth_set_offline(card->gdev,1);
988         rc = __qeth_set_online(card->gdev,1);
989         /* don't run another scheduled recovery */
990         qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
991         qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD);
992         if (!rc)
993                 PRINT_INFO("Device %s successfully recovered!\n",
994                            CARD_BUS_ID(card));
995         else
996                 PRINT_INFO("Device %s could not be recovered!\n",
997                            CARD_BUS_ID(card));
998         return 0;
999 }
1000
1001 void
1002 qeth_schedule_recovery(struct qeth_card *card)
1003 {
1004         QETH_DBF_TEXT(trace,2,"startrec");
1005         if (qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD) == 0)
1006                 schedule_work(&card->kernel_thread_starter);
1007 }
1008
1009 static int
1010 qeth_do_start_thread(struct qeth_card *card, unsigned long thread)
1011 {
1012         unsigned long flags;
1013         int rc = 0;
1014
1015         spin_lock_irqsave(&card->thread_mask_lock, flags);
1016         QETH_DBF_TEXT_(trace, 4, "  %02x%02x%02x",
1017                         (u8) card->thread_start_mask,
1018                         (u8) card->thread_allowed_mask,
1019                         (u8) card->thread_running_mask);
1020         rc = (card->thread_start_mask & thread);
1021         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
1022         return rc;
1023 }
1024
1025 static void
1026 qeth_start_kernel_thread(struct work_struct *work)
1027 {
1028         struct qeth_card *card = container_of(work, struct qeth_card, kernel_thread_starter);
1029         QETH_DBF_TEXT(trace , 2, "strthrd");
1030
1031         if (card->read.state != CH_STATE_UP &&
1032             card->write.state != CH_STATE_UP)
1033                 return;
1034         if (qeth_do_start_thread(card, QETH_RECOVER_THREAD))
1035                 kernel_thread(qeth_recover, (void *) card, SIGCHLD);
1036 }
1037
1038
1039 static void
1040 qeth_set_intial_options(struct qeth_card *card)
1041 {
1042         card->options.route4.type = NO_ROUTER;
1043 #ifdef CONFIG_QETH_IPV6
1044         card->options.route6.type = NO_ROUTER;
1045 #endif /* QETH_IPV6 */
1046         card->options.checksum_type = QETH_CHECKSUM_DEFAULT;
1047         card->options.broadcast_mode = QETH_TR_BROADCAST_ALLRINGS;
1048         card->options.macaddr_mode = QETH_TR_MACADDR_NONCANONICAL;
1049         card->options.fake_broadcast = 0;
1050         card->options.add_hhlen = DEFAULT_ADD_HHLEN;
1051         card->options.fake_ll = 0;
1052         if (card->info.type == QETH_CARD_TYPE_OSN)
1053                 card->options.layer2 = 1;
1054         else
1055                 card->options.layer2 = 0;
1056         card->options.performance_stats = 0;
1057         card->options.rx_sg_cb = QETH_RX_SG_CB;
1058 }
1059
1060 /**
1061  * initialize channels ,card and all state machines
1062  */
1063 static int
1064 qeth_setup_card(struct qeth_card *card)
1065 {
1066
1067         QETH_DBF_TEXT(setup, 2, "setupcrd");
1068         QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
1069
1070         card->read.state  = CH_STATE_DOWN;
1071         card->write.state = CH_STATE_DOWN;
1072         card->data.state  = CH_STATE_DOWN;
1073         card->state = CARD_STATE_DOWN;
1074         card->lan_online = 0;
1075         card->use_hard_stop = 0;
1076         card->dev = NULL;
1077 #ifdef CONFIG_QETH_VLAN
1078         spin_lock_init(&card->vlanlock);
1079         card->vlangrp = NULL;
1080 #endif
1081         spin_lock_init(&card->lock);
1082         spin_lock_init(&card->ip_lock);
1083         spin_lock_init(&card->thread_mask_lock);
1084         card->thread_start_mask = 0;
1085         card->thread_allowed_mask = 0;
1086         card->thread_running_mask = 0;
1087         INIT_WORK(&card->kernel_thread_starter, qeth_start_kernel_thread);
1088         INIT_LIST_HEAD(&card->ip_list);
1089         card->ip_tbd_list = kmalloc(sizeof(struct list_head), GFP_KERNEL);
1090         if (!card->ip_tbd_list) {
1091                 QETH_DBF_TEXT(setup, 0, "iptbdnom");
1092                 return -ENOMEM;
1093         }
1094         INIT_LIST_HEAD(card->ip_tbd_list);
1095         INIT_LIST_HEAD(&card->cmd_waiter_list);
1096         init_waitqueue_head(&card->wait_q);
1097         /* intial options */
1098         qeth_set_intial_options(card);
1099         /* IP address takeover */
1100         INIT_LIST_HEAD(&card->ipato.entries);
1101         card->ipato.enabled = 0;
1102         card->ipato.invert4 = 0;
1103         card->ipato.invert6 = 0;
1104         /* init QDIO stuff */
1105         qeth_init_qdio_info(card);
1106         return 0;
1107 }
1108
1109 static int
1110 is_1920_device (struct qeth_card *card)
1111 {
1112         int single_queue = 0;
1113         struct ccw_device *ccwdev;
1114         struct channelPath_dsc {
1115                 u8 flags;
1116                 u8 lsn;
1117                 u8 desc;
1118                 u8 chpid;
1119                 u8 swla;
1120                 u8 zeroes;
1121                 u8 chla;
1122                 u8 chpp;
1123         } *chp_dsc;
1124
1125         QETH_DBF_TEXT(setup, 2, "chk_1920");
1126
1127         ccwdev = card->data.ccwdev;
1128         chp_dsc = (struct channelPath_dsc *)ccw_device_get_chp_desc(ccwdev, 0);
1129         if (chp_dsc != NULL) {
1130                 /* CHPP field bit 6 == 1 -> single queue */
1131                 single_queue = ((chp_dsc->chpp & 0x02) == 0x02);
1132                 kfree(chp_dsc);
1133         }
1134         QETH_DBF_TEXT_(setup, 2, "rc:%x", single_queue);
1135         return single_queue;
1136 }
1137
1138 static int
1139 qeth_determine_card_type(struct qeth_card *card)
1140 {
1141         int i = 0;
1142
1143         QETH_DBF_TEXT(setup, 2, "detcdtyp");
1144
1145         card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT;
1146         card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
1147         while (known_devices[i][4]) {
1148                 if ((CARD_RDEV(card)->id.dev_type == known_devices[i][2]) &&
1149                     (CARD_RDEV(card)->id.dev_model == known_devices[i][3])) {
1150                         card->info.type = known_devices[i][4];
1151                         card->qdio.no_out_queues = known_devices[i][8];
1152                         card->info.is_multicast_different = known_devices[i][9];
1153                         if (is_1920_device(card)) {
1154                                 PRINT_INFO("Priority Queueing not able "
1155                                            "due to hardware limitations!\n");
1156                                 card->qdio.no_out_queues = 1;
1157                                 card->qdio.default_out_queue = 0;
1158                         }
1159                         return 0;
1160                 }
1161                 i++;
1162         }
1163         card->info.type = QETH_CARD_TYPE_UNKNOWN;
1164         PRINT_ERR("unknown card type on device %s\n", CARD_BUS_ID(card));
1165         return -ENOENT;
1166 }
1167
1168 static int
1169 qeth_probe_device(struct ccwgroup_device *gdev)
1170 {
1171         struct qeth_card *card;
1172         struct device *dev;
1173         unsigned long flags;
1174         int rc;
1175
1176         QETH_DBF_TEXT(setup, 2, "probedev");
1177
1178         dev = &gdev->dev;
1179         if (!get_device(dev))
1180                 return -ENODEV;
1181
1182         QETH_DBF_TEXT_(setup, 2, "%s", gdev->dev.bus_id);
1183
1184         card = qeth_alloc_card();
1185         if (!card) {
1186                 put_device(dev);
1187                 QETH_DBF_TEXT_(setup, 2, "1err%d", -ENOMEM);
1188                 return -ENOMEM;
1189         }
1190         card->read.ccwdev  = gdev->cdev[0];
1191         card->write.ccwdev = gdev->cdev[1];
1192         card->data.ccwdev  = gdev->cdev[2];
1193         gdev->dev.driver_data = card;
1194         card->gdev = gdev;
1195         gdev->cdev[0]->handler = qeth_irq;
1196         gdev->cdev[1]->handler = qeth_irq;
1197         gdev->cdev[2]->handler = qeth_irq;
1198
1199         if ((rc = qeth_determine_card_type(card))){
1200                 PRINT_WARN("%s: not a valid card type\n", __func__);
1201                 QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
1202                 put_device(dev);
1203                 qeth_free_card(card);
1204                 return rc;
1205         }
1206         if ((rc = qeth_setup_card(card))){
1207                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
1208                 put_device(dev);
1209                 qeth_free_card(card);
1210                 return rc;
1211         }
1212         rc = qeth_create_device_attributes(dev);
1213         if (rc) {
1214                 put_device(dev);
1215                 qeth_free_card(card);
1216                 return rc;
1217         }
1218         /* insert into our internal list */
1219         write_lock_irqsave(&qeth_card_list.rwlock, flags);
1220         list_add_tail(&card->list, &qeth_card_list.list);
1221         write_unlock_irqrestore(&qeth_card_list.rwlock, flags);
1222         return rc;
1223 }
1224
1225
1226 static int qeth_read_conf_data(struct qeth_card *card, void **buffer,
1227                                int *length)
1228 {
1229         struct ciw *ciw;
1230         char *rcd_buf;
1231         int ret;
1232         struct qeth_channel *channel = &card->data;
1233         unsigned long flags;
1234
1235         /*
1236          * scan for RCD command in extended SenseID data
1237          */
1238         ciw = ccw_device_get_ciw(channel->ccwdev, CIW_TYPE_RCD);
1239         if (!ciw || ciw->cmd == 0)
1240                 return -EOPNOTSUPP;
1241         rcd_buf = kzalloc(ciw->count, GFP_KERNEL | GFP_DMA);
1242         if (!rcd_buf)
1243                 return -ENOMEM;
1244
1245         channel->ccw.cmd_code = ciw->cmd;
1246         channel->ccw.cda = (__u32) __pa (rcd_buf);
1247         channel->ccw.count = ciw->count;
1248         channel->ccw.flags = CCW_FLAG_SLI;
1249         channel->state = CH_STATE_RCD;
1250         spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
1251         ret = ccw_device_start_timeout(channel->ccwdev, &channel->ccw,
1252                                        QETH_RCD_PARM, LPM_ANYPATH, 0,
1253                                        QETH_RCD_TIMEOUT);
1254         spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
1255         if (!ret)
1256                 wait_event(card->wait_q,
1257                            (channel->state == CH_STATE_RCD_DONE ||
1258                             channel->state == CH_STATE_DOWN));
1259         if (channel->state == CH_STATE_DOWN)
1260                 ret = -EIO;
1261         else
1262                 channel->state = CH_STATE_DOWN;
1263         if (ret) {
1264                 kfree(rcd_buf);
1265                 *buffer = NULL;
1266                 *length = 0;
1267         } else {
1268                 *length = ciw->count;
1269                 *buffer = rcd_buf;
1270         }
1271         return ret;
1272 }
1273
1274 static int
1275 qeth_get_unitaddr(struct qeth_card *card)
1276 {
1277         int length;
1278         char *prcd;
1279         int rc;
1280
1281         QETH_DBF_TEXT(setup, 2, "getunit");
1282         rc = qeth_read_conf_data(card, (void **) &prcd, &length);
1283         if (rc) {
1284                 PRINT_ERR("qeth_read_conf_data for device %s returned %i\n",
1285                           CARD_DDEV_ID(card), rc);
1286                 return rc;
1287         }
1288         card->info.chpid = prcd[30];
1289         card->info.unit_addr2 = prcd[31];
1290         card->info.cula = prcd[63];
1291         card->info.guestlan = ((prcd[0x10] == _ascebc['V']) &&
1292                                (prcd[0x11] == _ascebc['M']));
1293         kfree(prcd);
1294         return 0;
1295 }
1296
1297 static void
1298 qeth_init_tokens(struct qeth_card *card)
1299 {
1300         card->token.issuer_rm_w = 0x00010103UL;
1301         card->token.cm_filter_w = 0x00010108UL;
1302         card->token.cm_connection_w = 0x0001010aUL;
1303         card->token.ulp_filter_w = 0x0001010bUL;
1304         card->token.ulp_connection_w = 0x0001010dUL;
1305 }
1306
1307 static inline __u16
1308 raw_devno_from_bus_id(char *id)
1309 {
1310         id += (strlen(id) - 4);
1311         return (__u16) simple_strtoul(id, &id, 16);
1312 }
1313 /**
1314  * setup channel
1315  */
1316 static void
1317 qeth_setup_ccw(struct qeth_channel *channel,unsigned char *iob, __u32 len)
1318 {
1319         struct qeth_card *card;
1320
1321         QETH_DBF_TEXT(trace, 4, "setupccw");
1322         card = CARD_FROM_CDEV(channel->ccwdev);
1323         if (channel == &card->read)
1324                 memcpy(&channel->ccw, READ_CCW, sizeof(struct ccw1));
1325         else
1326                 memcpy(&channel->ccw, WRITE_CCW, sizeof(struct ccw1));
1327         channel->ccw.count = len;
1328         channel->ccw.cda = (__u32) __pa(iob);
1329 }
1330
1331 /**
1332  * get free buffer for ccws (IDX activation, lancmds,ipassists...)
1333  */
1334 static struct qeth_cmd_buffer *
1335 __qeth_get_buffer(struct qeth_channel *channel)
1336 {
1337         __u8 index;
1338
1339         QETH_DBF_TEXT(trace, 6, "getbuff");
1340         index = channel->io_buf_no;
1341         do {
1342                 if (channel->iob[index].state == BUF_STATE_FREE) {
1343                         channel->iob[index].state = BUF_STATE_LOCKED;
1344                         channel->io_buf_no = (channel->io_buf_no + 1) %
1345                                 QETH_CMD_BUFFER_NO;
1346                         memset(channel->iob[index].data, 0, QETH_BUFSIZE);
1347                         return channel->iob + index;
1348                 }
1349                 index = (index + 1) % QETH_CMD_BUFFER_NO;
1350         } while(index != channel->io_buf_no);
1351
1352         return NULL;
1353 }
1354
1355 /**
1356  * release command buffer
1357  */
1358 static void
1359 qeth_release_buffer(struct qeth_channel *channel, struct qeth_cmd_buffer *iob)
1360 {
1361         unsigned long flags;
1362
1363         QETH_DBF_TEXT(trace, 6, "relbuff");
1364         spin_lock_irqsave(&channel->iob_lock, flags);
1365         memset(iob->data, 0, QETH_BUFSIZE);
1366         iob->state = BUF_STATE_FREE;
1367         iob->callback = qeth_send_control_data_cb;
1368         iob->rc = 0;
1369         spin_unlock_irqrestore(&channel->iob_lock, flags);
1370 }
1371
1372 static struct qeth_cmd_buffer *
1373 qeth_get_buffer(struct qeth_channel *channel)
1374 {
1375         struct qeth_cmd_buffer *buffer = NULL;
1376         unsigned long flags;
1377
1378         spin_lock_irqsave(&channel->iob_lock, flags);
1379         buffer = __qeth_get_buffer(channel);
1380         spin_unlock_irqrestore(&channel->iob_lock, flags);
1381         return buffer;
1382 }
1383
1384 static struct qeth_cmd_buffer *
1385 qeth_wait_for_buffer(struct qeth_channel *channel)
1386 {
1387         struct qeth_cmd_buffer *buffer;
1388         wait_event(channel->wait_q,
1389                    ((buffer = qeth_get_buffer(channel)) != NULL));
1390         return buffer;
1391 }
1392
1393 static void
1394 qeth_clear_cmd_buffers(struct qeth_channel *channel)
1395 {
1396         int cnt;
1397
1398         for (cnt=0; cnt < QETH_CMD_BUFFER_NO; cnt++)
1399                 qeth_release_buffer(channel,&channel->iob[cnt]);
1400         channel->buf_no = 0;
1401         channel->io_buf_no = 0;
1402 }
1403
1404 /**
1405  * start IDX for read and write channel
1406  */
1407 static int
1408 qeth_idx_activate_get_answer(struct qeth_channel *channel,
1409                               void (*idx_reply_cb)(struct qeth_channel *,
1410                                                    struct qeth_cmd_buffer *))
1411 {
1412         struct qeth_cmd_buffer *iob;
1413         unsigned long flags;
1414         int rc;
1415         struct qeth_card *card;
1416
1417         QETH_DBF_TEXT(setup, 2, "idxanswr");
1418         card = CARD_FROM_CDEV(channel->ccwdev);
1419         iob = qeth_get_buffer(channel);
1420         iob->callback = idx_reply_cb;
1421         memcpy(&channel->ccw, READ_CCW, sizeof(struct ccw1));
1422         channel->ccw.count = QETH_BUFSIZE;
1423         channel->ccw.cda = (__u32) __pa(iob->data);
1424
1425         wait_event(card->wait_q,
1426                    atomic_cmpxchg(&channel->irq_pending, 0, 1) == 0);
1427         QETH_DBF_TEXT(setup, 6, "noirqpnd");
1428         spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
1429         rc = ccw_device_start(channel->ccwdev,
1430                               &channel->ccw,(addr_t) iob, 0, 0);
1431         spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
1432
1433         if (rc) {
1434                 PRINT_ERR("qeth: Error2 in activating channel rc=%d\n",rc);
1435                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
1436                 atomic_set(&channel->irq_pending, 0);
1437                 wake_up(&card->wait_q);
1438                 return rc;
1439         }
1440         rc = wait_event_interruptible_timeout(card->wait_q,
1441                          channel->state == CH_STATE_UP, QETH_TIMEOUT);
1442         if (rc == -ERESTARTSYS)
1443                 return rc;
1444         if (channel->state != CH_STATE_UP){
1445                 rc = -ETIME;
1446                 QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
1447                 qeth_clear_cmd_buffers(channel);
1448         } else
1449                 rc = 0;
1450         return rc;
1451 }
1452
1453 static int
1454 qeth_idx_activate_channel(struct qeth_channel *channel,
1455                            void (*idx_reply_cb)(struct qeth_channel *,
1456                                                 struct qeth_cmd_buffer *))
1457 {
1458         struct qeth_card *card;
1459         struct qeth_cmd_buffer *iob;
1460         unsigned long flags;
1461         __u16 temp;
1462         int rc;
1463
1464         card = CARD_FROM_CDEV(channel->ccwdev);
1465
1466         QETH_DBF_TEXT(setup, 2, "idxactch");
1467
1468         iob = qeth_get_buffer(channel);
1469         iob->callback = idx_reply_cb;
1470         memcpy(&channel->ccw, WRITE_CCW, sizeof(struct ccw1));
1471         channel->ccw.count = IDX_ACTIVATE_SIZE;
1472         channel->ccw.cda = (__u32) __pa(iob->data);
1473         if (channel == &card->write) {
1474                 memcpy(iob->data, IDX_ACTIVATE_WRITE, IDX_ACTIVATE_SIZE);
1475                 memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data),
1476                        &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
1477                 card->seqno.trans_hdr++;
1478         } else {
1479                 memcpy(iob->data, IDX_ACTIVATE_READ, IDX_ACTIVATE_SIZE);
1480                 memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data),
1481                        &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
1482         }
1483         memcpy(QETH_IDX_ACT_ISSUER_RM_TOKEN(iob->data),
1484                &card->token.issuer_rm_w,QETH_MPC_TOKEN_LENGTH);
1485         memcpy(QETH_IDX_ACT_FUNC_LEVEL(iob->data),
1486                &card->info.func_level,sizeof(__u16));
1487         temp = raw_devno_from_bus_id(CARD_DDEV_ID(card));
1488         memcpy(QETH_IDX_ACT_QDIO_DEV_CUA(iob->data), &temp, 2);
1489         temp = (card->info.cula << 8) + card->info.unit_addr2;
1490         memcpy(QETH_IDX_ACT_QDIO_DEV_REALADDR(iob->data), &temp, 2);
1491
1492         wait_event(card->wait_q,
1493                    atomic_cmpxchg(&channel->irq_pending, 0, 1) == 0);
1494         QETH_DBF_TEXT(setup, 6, "noirqpnd");
1495         spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
1496         rc = ccw_device_start(channel->ccwdev,
1497                               &channel->ccw,(addr_t) iob, 0, 0);
1498         spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
1499
1500         if (rc) {
1501                 PRINT_ERR("qeth: Error1 in activating channel. rc=%d\n",rc);
1502                 QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
1503                 atomic_set(&channel->irq_pending, 0);
1504                 wake_up(&card->wait_q);
1505                 return rc;
1506         }
1507         rc = wait_event_interruptible_timeout(card->wait_q,
1508                         channel->state == CH_STATE_ACTIVATING, QETH_TIMEOUT);
1509         if (rc == -ERESTARTSYS)
1510                 return rc;
1511         if (channel->state != CH_STATE_ACTIVATING) {
1512                 PRINT_WARN("qeth: IDX activate timed out!\n");
1513                 QETH_DBF_TEXT_(setup, 2, "2err%d", -ETIME);
1514                 qeth_clear_cmd_buffers(channel);
1515                 return -ETIME;
1516         }
1517         return qeth_idx_activate_get_answer(channel,idx_reply_cb);
1518 }
1519
1520 static int
1521 qeth_peer_func_level(int level)
1522 {
1523         if ((level & 0xff) == 8)
1524                 return (level & 0xff) + 0x400;
1525         if (((level >> 8) & 3) == 1)
1526                 return (level & 0xff) + 0x200;
1527         return level;
1528 }
1529
1530 static void
1531 qeth_idx_write_cb(struct qeth_channel *channel, struct qeth_cmd_buffer *iob)
1532 {
1533         struct qeth_card *card;
1534         __u16 temp;
1535
1536         QETH_DBF_TEXT(setup ,2, "idxwrcb");
1537
1538         if (channel->state == CH_STATE_DOWN) {
1539                 channel->state = CH_STATE_ACTIVATING;
1540                 goto out;
1541         }
1542         card = CARD_FROM_CDEV(channel->ccwdev);
1543
1544         if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) {
1545                 PRINT_ERR("IDX_ACTIVATE on write channel device %s: negative "
1546                           "reply\n", CARD_WDEV_ID(card));
1547                 goto out;
1548         }
1549         memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2);
1550         if ((temp & ~0x0100) != qeth_peer_func_level(card->info.func_level)) {
1551                 PRINT_WARN("IDX_ACTIVATE on write channel device %s: "
1552                            "function level mismatch "
1553                            "(sent: 0x%x, received: 0x%x)\n",
1554                            CARD_WDEV_ID(card), card->info.func_level, temp);
1555                 goto out;
1556         }
1557         channel->state = CH_STATE_UP;
1558 out:
1559         qeth_release_buffer(channel, iob);
1560 }
1561
1562 static int
1563 qeth_check_idx_response(unsigned char *buffer)
1564 {
1565         if (!buffer)
1566                 return 0;
1567
1568         QETH_DBF_HEX(control, 2, buffer, QETH_DBF_CONTROL_LEN);
1569         if ((buffer[2] & 0xc0) == 0xc0) {
1570                 PRINT_WARN("received an IDX TERMINATE "
1571                            "with cause code 0x%02x%s\n",
1572                            buffer[4],
1573                            ((buffer[4] == 0x22) ?
1574                             " -- try another portname" : ""));
1575                 QETH_DBF_TEXT(trace, 2, "ckidxres");
1576                 QETH_DBF_TEXT(trace, 2, " idxterm");
1577                 QETH_DBF_TEXT_(trace, 2, "  rc%d", -EIO);
1578                 return -EIO;
1579         }
1580         return 0;
1581 }
1582
1583 static void
1584 qeth_idx_read_cb(struct qeth_channel *channel, struct qeth_cmd_buffer *iob)
1585 {
1586         struct qeth_card *card;
1587         __u16 temp;
1588
1589         QETH_DBF_TEXT(setup , 2, "idxrdcb");
1590         if (channel->state == CH_STATE_DOWN) {
1591                 channel->state = CH_STATE_ACTIVATING;
1592                 goto out;
1593         }
1594
1595         card = CARD_FROM_CDEV(channel->ccwdev);
1596         if (qeth_check_idx_response(iob->data)) {
1597                         goto out;
1598         }
1599         if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) {
1600                 PRINT_ERR("IDX_ACTIVATE on read channel device %s: negative "
1601                           "reply\n", CARD_RDEV_ID(card));
1602                 goto out;
1603         }
1604
1605 /**
1606  * temporary fix for microcode bug
1607  * to revert it,replace OR by AND
1608  */
1609         if ( (!QETH_IDX_NO_PORTNAME_REQUIRED(iob->data)) ||
1610              (card->info.type == QETH_CARD_TYPE_OSAE) )
1611                 card->info.portname_required = 1;
1612
1613         memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2);
1614         if (temp != qeth_peer_func_level(card->info.func_level)) {
1615                 PRINT_WARN("IDX_ACTIVATE on read channel device %s: function "
1616                            "level mismatch (sent: 0x%x, received: 0x%x)\n",
1617                            CARD_RDEV_ID(card), card->info.func_level, temp);
1618                 goto out;
1619         }
1620         memcpy(&card->token.issuer_rm_r,
1621                QETH_IDX_ACT_ISSUER_RM_TOKEN(iob->data),
1622                QETH_MPC_TOKEN_LENGTH);
1623         memcpy(&card->info.mcl_level[0],
1624                QETH_IDX_REPLY_LEVEL(iob->data), QETH_MCL_LENGTH);
1625         channel->state = CH_STATE_UP;
1626 out:
1627         qeth_release_buffer(channel,iob);
1628 }
1629
1630 static int
1631 qeth_issue_next_read(struct qeth_card *card)
1632 {
1633         int rc;
1634         struct qeth_cmd_buffer *iob;
1635
1636         QETH_DBF_TEXT(trace,5,"issnxrd");
1637         if (card->read.state != CH_STATE_UP)
1638                 return -EIO;
1639         iob = qeth_get_buffer(&card->read);
1640         if (!iob) {
1641                 PRINT_WARN("issue_next_read failed: no iob available!\n");
1642                 return -ENOMEM;
1643         }
1644         qeth_setup_ccw(&card->read, iob->data, QETH_BUFSIZE);
1645         QETH_DBF_TEXT(trace, 6, "noirqpnd");
1646         rc = ccw_device_start(card->read.ccwdev, &card->read.ccw,
1647                               (addr_t) iob, 0, 0);
1648         if (rc) {
1649                 PRINT_ERR("Error in starting next read ccw! rc=%i\n", rc);
1650                 atomic_set(&card->read.irq_pending, 0);
1651                 qeth_schedule_recovery(card);
1652                 wake_up(&card->wait_q);
1653         }
1654         return rc;
1655 }
1656
1657 static struct qeth_reply *
1658 qeth_alloc_reply(struct qeth_card *card)
1659 {
1660         struct qeth_reply *reply;
1661
1662         reply = kzalloc(sizeof(struct qeth_reply), GFP_ATOMIC);
1663         if (reply){
1664                 atomic_set(&reply->refcnt, 1);
1665                 atomic_set(&reply->received, 0);
1666                 reply->card = card;
1667         };
1668         return reply;
1669 }
1670
1671 static void
1672 qeth_get_reply(struct qeth_reply *reply)
1673 {
1674         WARN_ON(atomic_read(&reply->refcnt) <= 0);
1675         atomic_inc(&reply->refcnt);
1676 }
1677
1678 static void
1679 qeth_put_reply(struct qeth_reply *reply)
1680 {
1681         WARN_ON(atomic_read(&reply->refcnt) <= 0);
1682         if (atomic_dec_and_test(&reply->refcnt))
1683                 kfree(reply);
1684 }
1685
1686 static void
1687 qeth_issue_ipa_msg(struct qeth_ipa_cmd *cmd, struct qeth_card *card)
1688 {
1689         int rc;
1690         int com;
1691         char * ipa_name;
1692
1693         com = cmd->hdr.command;
1694         rc  = cmd->hdr.return_code;
1695         ipa_name = qeth_get_ipa_cmd_name(com);
1696
1697         PRINT_ERR("%s(x%X) for %s returned x%X \"%s\"\n", ipa_name, com,
1698                    QETH_CARD_IFNAME(card), rc, qeth_get_ipa_msg(rc));
1699 }
1700
1701 static struct qeth_ipa_cmd *
1702 qeth_check_ipa_data(struct qeth_card *card, struct qeth_cmd_buffer *iob)
1703 {
1704         struct qeth_ipa_cmd *cmd = NULL;
1705
1706         QETH_DBF_TEXT(trace,5,"chkipad");
1707         if (IS_IPA(iob->data)){
1708                 cmd = (struct qeth_ipa_cmd *) PDU_ENCAPSULATION(iob->data);
1709                 if (IS_IPA_REPLY(cmd)) {
1710                         if (cmd->hdr.return_code)
1711                                 qeth_issue_ipa_msg(cmd, card);
1712                         return cmd;
1713                 }
1714                 else {
1715                         switch (cmd->hdr.command) {
1716                         case IPA_CMD_STOPLAN:
1717                                 PRINT_WARN("Link failure on %s (CHPID 0x%X) - "
1718                                            "there is a network problem or "
1719                                            "someone pulled the cable or "
1720                                            "disabled the port.\n",
1721                                            QETH_CARD_IFNAME(card),
1722                                            card->info.chpid);
1723                                 card->lan_online = 0;
1724                                 if (card->dev && netif_carrier_ok(card->dev))
1725                                         netif_carrier_off(card->dev);
1726                                 return NULL;
1727                         case IPA_CMD_STARTLAN:
1728                                 PRINT_INFO("Link reestablished on %s "
1729                                            "(CHPID 0x%X). Scheduling "
1730                                            "IP address reset.\n",
1731                                            QETH_CARD_IFNAME(card),
1732                                            card->info.chpid);
1733                                 netif_carrier_on(card->dev);
1734                                 qeth_schedule_recovery(card);
1735                                 return NULL;
1736                         case IPA_CMD_MODCCID:
1737                                 return cmd;
1738                         case IPA_CMD_REGISTER_LOCAL_ADDR:
1739                                 QETH_DBF_TEXT(trace,3, "irla");
1740                                 break;
1741                         case IPA_CMD_UNREGISTER_LOCAL_ADDR:
1742                                 QETH_DBF_TEXT(trace,3, "urla");
1743                                 break;
1744                         default:
1745                                 PRINT_WARN("Received data is IPA "
1746                                            "but not a reply!\n");
1747                                 break;
1748                         }
1749                 }
1750         }
1751         return cmd;
1752 }
1753
1754 /**
1755  * wake all waiting ipa commands
1756  */
1757 static void
1758 qeth_clear_ipacmd_list(struct qeth_card *card)
1759 {
1760         struct qeth_reply *reply, *r;
1761         unsigned long flags;
1762
1763         QETH_DBF_TEXT(trace, 4, "clipalst");
1764
1765         spin_lock_irqsave(&card->lock, flags);
1766         list_for_each_entry_safe(reply, r, &card->cmd_waiter_list, list) {
1767                 qeth_get_reply(reply);
1768                 reply->rc = -EIO;
1769                 atomic_inc(&reply->received);
1770                 list_del_init(&reply->list);
1771                 wake_up(&reply->wait_q);
1772                 qeth_put_reply(reply);
1773         }
1774         spin_unlock_irqrestore(&card->lock, flags);
1775 }
1776
1777 static void
1778 qeth_send_control_data_cb(struct qeth_channel *channel,
1779                           struct qeth_cmd_buffer *iob)
1780 {
1781         struct qeth_card *card;
1782         struct qeth_reply *reply, *r;
1783         struct qeth_ipa_cmd *cmd;
1784         unsigned long flags;
1785         int keep_reply;
1786
1787         QETH_DBF_TEXT(trace,4,"sndctlcb");
1788
1789         card = CARD_FROM_CDEV(channel->ccwdev);
1790         if (qeth_check_idx_response(iob->data)) {
1791                 qeth_clear_ipacmd_list(card);
1792                 qeth_schedule_recovery(card);
1793                 goto out;
1794         }
1795
1796         cmd = qeth_check_ipa_data(card, iob);
1797         if ((cmd == NULL) && (card->state != CARD_STATE_DOWN))
1798                 goto out;
1799         /*in case of OSN : check if cmd is set */
1800         if (card->info.type == QETH_CARD_TYPE_OSN &&
1801             cmd &&
1802             cmd->hdr.command != IPA_CMD_STARTLAN &&
1803             card->osn_info.assist_cb != NULL) {
1804                 card->osn_info.assist_cb(card->dev, cmd);
1805                 goto out;
1806         }
1807
1808         spin_lock_irqsave(&card->lock, flags);
1809         list_for_each_entry_safe(reply, r, &card->cmd_waiter_list, list) {
1810                 if ((reply->seqno == QETH_IDX_COMMAND_SEQNO) ||
1811                     ((cmd) && (reply->seqno == cmd->hdr.seqno))) {
1812                         qeth_get_reply(reply);
1813                         list_del_init(&reply->list);
1814                         spin_unlock_irqrestore(&card->lock, flags);
1815                         keep_reply = 0;
1816                         if (reply->callback != NULL) {
1817                                 if (cmd) {
1818                                         reply->offset = (__u16)((char*)cmd -
1819                                                                 (char *)iob->data);
1820                                         keep_reply = reply->callback(card,
1821                                                         reply,
1822                                                         (unsigned long)cmd);
1823                                 } else
1824                                         keep_reply = reply->callback(card,
1825                                                         reply,
1826                                                         (unsigned long)iob);
1827                         }
1828                         if (cmd)
1829                                 reply->rc = (u16) cmd->hdr.return_code;
1830                         else if (iob->rc)
1831                                 reply->rc = iob->rc;
1832                         if (keep_reply) {
1833                                 spin_lock_irqsave(&card->lock, flags);
1834                                 list_add_tail(&reply->list,
1835                                               &card->cmd_waiter_list);
1836                                 spin_unlock_irqrestore(&card->lock, flags);
1837                         } else {
1838                                 atomic_inc(&reply->received);
1839                                 wake_up(&reply->wait_q);
1840                         }
1841                         qeth_put_reply(reply);
1842                         goto out;
1843                 }
1844         }
1845         spin_unlock_irqrestore(&card->lock, flags);
1846 out:
1847         memcpy(&card->seqno.pdu_hdr_ack,
1848                 QETH_PDU_HEADER_SEQ_NO(iob->data),
1849                 QETH_SEQ_NO_LENGTH);
1850         qeth_release_buffer(channel,iob);
1851 }
1852
1853 static void
1854 qeth_prepare_control_data(struct qeth_card *card, int len,
1855                           struct qeth_cmd_buffer *iob)
1856 {
1857         qeth_setup_ccw(&card->write,iob->data,len);
1858         iob->callback = qeth_release_buffer;
1859
1860         memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data),
1861                &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
1862         card->seqno.trans_hdr++;
1863         memcpy(QETH_PDU_HEADER_SEQ_NO(iob->data),
1864                &card->seqno.pdu_hdr, QETH_SEQ_NO_LENGTH);
1865         card->seqno.pdu_hdr++;
1866         memcpy(QETH_PDU_HEADER_ACK_SEQ_NO(iob->data),
1867                &card->seqno.pdu_hdr_ack, QETH_SEQ_NO_LENGTH);
1868         QETH_DBF_HEX(control, 2, iob->data, QETH_DBF_CONTROL_LEN);
1869 }
1870
1871 static int
1872 qeth_send_control_data(struct qeth_card *card, int len,
1873                        struct qeth_cmd_buffer *iob,
1874                        int (*reply_cb)
1875                        (struct qeth_card *, struct qeth_reply*, unsigned long),
1876                        void *reply_param)
1877
1878 {
1879         int rc;
1880         unsigned long flags;
1881         struct qeth_reply *reply = NULL;
1882         unsigned long timeout;
1883
1884         QETH_DBF_TEXT(trace, 2, "sendctl");
1885
1886         reply = qeth_alloc_reply(card);
1887         if (!reply) {
1888                 PRINT_WARN("Could no alloc qeth_reply!\n");
1889                 return -ENOMEM;
1890         }
1891         reply->callback = reply_cb;
1892         reply->param = reply_param;
1893         if (card->state == CARD_STATE_DOWN)
1894                 reply->seqno = QETH_IDX_COMMAND_SEQNO;
1895         else
1896                 reply->seqno = card->seqno.ipa++;
1897         init_waitqueue_head(&reply->wait_q);
1898         spin_lock_irqsave(&card->lock, flags);
1899         list_add_tail(&reply->list, &card->cmd_waiter_list);
1900         spin_unlock_irqrestore(&card->lock, flags);
1901         QETH_DBF_HEX(control, 2, iob->data, QETH_DBF_CONTROL_LEN);
1902
1903         while (atomic_cmpxchg(&card->write.irq_pending, 0, 1)) ;
1904         qeth_prepare_control_data(card, len, iob);
1905
1906         if (IS_IPA(iob->data))
1907                 timeout = jiffies + QETH_IPA_TIMEOUT;
1908         else
1909                 timeout = jiffies + QETH_TIMEOUT;
1910
1911         QETH_DBF_TEXT(trace, 6, "noirqpnd");
1912         spin_lock_irqsave(get_ccwdev_lock(card->write.ccwdev), flags);
1913         rc = ccw_device_start(card->write.ccwdev, &card->write.ccw,
1914                               (addr_t) iob, 0, 0);
1915         spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags);
1916         if (rc){
1917                 PRINT_WARN("qeth_send_control_data: "
1918                            "ccw_device_start rc = %i\n", rc);
1919                 QETH_DBF_TEXT_(trace, 2, " err%d", rc);
1920                 spin_lock_irqsave(&card->lock, flags);
1921                 list_del_init(&reply->list);
1922                 qeth_put_reply(reply);
1923                 spin_unlock_irqrestore(&card->lock, flags);
1924                 qeth_release_buffer(iob->channel, iob);
1925                 atomic_set(&card->write.irq_pending, 0);
1926                 wake_up(&card->wait_q);
1927                 return rc;
1928         }
1929         while (!atomic_read(&reply->received)) {
1930                 if (time_after(jiffies, timeout)) {
1931                         spin_lock_irqsave(&reply->card->lock, flags);
1932                         list_del_init(&reply->list);
1933                         spin_unlock_irqrestore(&reply->card->lock, flags);
1934                         reply->rc = -ETIME;
1935                         atomic_inc(&reply->received);
1936                         wake_up(&reply->wait_q);
1937                 }
1938                 cpu_relax();
1939         };
1940         rc = reply->rc;
1941         qeth_put_reply(reply);
1942         return rc;
1943 }
1944
1945 static int
1946 qeth_osn_send_control_data(struct qeth_card *card, int len,
1947                            struct qeth_cmd_buffer *iob)
1948 {
1949         unsigned long flags;
1950         int rc = 0;
1951
1952         QETH_DBF_TEXT(trace, 5, "osndctrd");
1953
1954         wait_event(card->wait_q,
1955                    atomic_cmpxchg(&card->write.irq_pending, 0, 1) == 0);
1956         qeth_prepare_control_data(card, len, iob);
1957         QETH_DBF_TEXT(trace, 6, "osnoirqp");
1958         spin_lock_irqsave(get_ccwdev_lock(card->write.ccwdev), flags);
1959         rc = ccw_device_start(card->write.ccwdev, &card->write.ccw,
1960                               (addr_t) iob, 0, 0);
1961         spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags);
1962         if (rc){
1963                 PRINT_WARN("qeth_osn_send_control_data: "
1964                            "ccw_device_start rc = %i\n", rc);
1965                 QETH_DBF_TEXT_(trace, 2, " err%d", rc);
1966                 qeth_release_buffer(iob->channel, iob);
1967                 atomic_set(&card->write.irq_pending, 0);
1968                 wake_up(&card->wait_q);
1969         }
1970         return rc;
1971 }
1972
1973 static inline void
1974 qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
1975                      char prot_type)
1976 {
1977         memcpy(iob->data, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE);
1978         memcpy(QETH_IPA_CMD_PROT_TYPE(iob->data),&prot_type,1);
1979         memcpy(QETH_IPA_CMD_DEST_ADDR(iob->data),
1980                &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
1981 }
1982
1983 static int
1984 qeth_osn_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
1985                       int data_len)
1986 {
1987         u16 s1, s2;
1988
1989         QETH_DBF_TEXT(trace,4,"osndipa");
1990
1991         qeth_prepare_ipa_cmd(card, iob, QETH_PROT_OSN2);
1992         s1 = (u16)(IPA_PDU_HEADER_SIZE + data_len);
1993         s2 = (u16)data_len;
1994         memcpy(QETH_IPA_PDU_LEN_TOTAL(iob->data), &s1, 2);
1995         memcpy(QETH_IPA_PDU_LEN_PDU1(iob->data), &s2, 2);
1996         memcpy(QETH_IPA_PDU_LEN_PDU2(iob->data), &s2, 2);
1997         memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2);
1998         return qeth_osn_send_control_data(card, s1, iob);
1999 }
2000
2001 static int
2002 qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
2003                   int (*reply_cb)
2004                   (struct qeth_card *,struct qeth_reply*, unsigned long),
2005                   void *reply_param)
2006 {
2007         int rc;
2008         char prot_type;
2009
2010         QETH_DBF_TEXT(trace,4,"sendipa");
2011
2012         if (card->options.layer2)
2013                 if (card->info.type == QETH_CARD_TYPE_OSN)
2014                         prot_type = QETH_PROT_OSN2;
2015                 else
2016                         prot_type = QETH_PROT_LAYER2;
2017         else
2018                 prot_type = QETH_PROT_TCPIP;
2019         qeth_prepare_ipa_cmd(card,iob,prot_type);
2020         rc = qeth_send_control_data(card, IPA_CMD_LENGTH, iob,
2021                                     reply_cb, reply_param);
2022         return rc;
2023 }
2024
2025
2026 static int
2027 qeth_cm_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
2028                   unsigned long data)
2029 {
2030         struct qeth_cmd_buffer *iob;
2031
2032         QETH_DBF_TEXT(setup, 2, "cmenblcb");
2033
2034         iob = (struct qeth_cmd_buffer *) data;
2035         memcpy(&card->token.cm_filter_r,
2036                QETH_CM_ENABLE_RESP_FILTER_TOKEN(iob->data),
2037                QETH_MPC_TOKEN_LENGTH);
2038         QETH_DBF_TEXT_(setup, 2, "  rc%d", iob->rc);
2039         return 0;
2040 }
2041
2042 static int
2043 qeth_cm_enable(struct qeth_card *card)
2044 {
2045         int rc;
2046         struct qeth_cmd_buffer *iob;
2047
2048         QETH_DBF_TEXT(setup,2,"cmenable");
2049
2050         iob = qeth_wait_for_buffer(&card->write);
2051         memcpy(iob->data, CM_ENABLE, CM_ENABLE_SIZE);
2052         memcpy(QETH_CM_ENABLE_ISSUER_RM_TOKEN(iob->data),
2053                &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
2054         memcpy(QETH_CM_ENABLE_FILTER_TOKEN(iob->data),
2055                &card->token.cm_filter_w, QETH_MPC_TOKEN_LENGTH);
2056
2057         rc = qeth_send_control_data(card, CM_ENABLE_SIZE, iob,
2058                                     qeth_cm_enable_cb, NULL);
2059         return rc;
2060 }
2061
2062 static int
2063 qeth_cm_setup_cb(struct qeth_card *card, struct qeth_reply *reply,
2064                  unsigned long data)
2065 {
2066
2067         struct qeth_cmd_buffer *iob;
2068
2069         QETH_DBF_TEXT(setup, 2, "cmsetpcb");
2070
2071         iob = (struct qeth_cmd_buffer *) data;
2072         memcpy(&card->token.cm_connection_r,
2073                QETH_CM_SETUP_RESP_DEST_ADDR(iob->data),
2074                QETH_MPC_TOKEN_LENGTH);
2075         QETH_DBF_TEXT_(setup, 2, "  rc%d", iob->rc);
2076         return 0;
2077 }
2078
2079 static int
2080 qeth_cm_setup(struct qeth_card *card)
2081 {
2082         int rc;
2083         struct qeth_cmd_buffer *iob;
2084
2085         QETH_DBF_TEXT(setup,2,"cmsetup");
2086
2087         iob = qeth_wait_for_buffer(&card->write);
2088         memcpy(iob->data, CM_SETUP, CM_SETUP_SIZE);
2089         memcpy(QETH_CM_SETUP_DEST_ADDR(iob->data),
2090                &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
2091         memcpy(QETH_CM_SETUP_CONNECTION_TOKEN(iob->data),
2092                &card->token.cm_connection_w, QETH_MPC_TOKEN_LENGTH);
2093         memcpy(QETH_CM_SETUP_FILTER_TOKEN(iob->data),
2094                &card->token.cm_filter_r, QETH_MPC_TOKEN_LENGTH);
2095         rc = qeth_send_control_data(card, CM_SETUP_SIZE, iob,
2096                                     qeth_cm_setup_cb, NULL);
2097         return rc;
2098
2099 }
2100
2101 static int
2102 qeth_ulp_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
2103                    unsigned long data)
2104 {
2105
2106         __u16 mtu, framesize;
2107         __u16 len;
2108         __u8 link_type;
2109         struct qeth_cmd_buffer *iob;
2110
2111         QETH_DBF_TEXT(setup, 2, "ulpenacb");
2112
2113         iob = (struct qeth_cmd_buffer *) data;
2114         memcpy(&card->token.ulp_filter_r,
2115                QETH_ULP_ENABLE_RESP_FILTER_TOKEN(iob->data),
2116                QETH_MPC_TOKEN_LENGTH);
2117         if (qeth_get_mtu_out_of_mpc(card->info.type)) {
2118                 memcpy(&framesize, QETH_ULP_ENABLE_RESP_MAX_MTU(iob->data), 2);
2119                 mtu = qeth_get_mtu_outof_framesize(framesize);
2120                 if (!mtu) {
2121                         iob->rc = -EINVAL;
2122                         QETH_DBF_TEXT_(setup, 2, "  rc%d", iob->rc);
2123                         return 0;
2124                 }
2125                 card->info.max_mtu = mtu;
2126                 card->info.initial_mtu = mtu;
2127                 card->qdio.in_buf_size = mtu + 2 * PAGE_SIZE;
2128         } else {
2129                 card->info.initial_mtu = qeth_get_initial_mtu_for_card(card);
2130                 card->info.max_mtu = qeth_get_max_mtu_for_card(card->info.type);
2131                 card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
2132         }
2133
2134         memcpy(&len, QETH_ULP_ENABLE_RESP_DIFINFO_LEN(iob->data), 2);
2135         if (len >= QETH_MPC_DIFINFO_LEN_INDICATES_LINK_TYPE) {
2136                 memcpy(&link_type,
2137                        QETH_ULP_ENABLE_RESP_LINK_TYPE(iob->data), 1);
2138                 card->info.link_type = link_type;
2139         } else
2140                 card->info.link_type = 0;
2141         QETH_DBF_TEXT_(setup, 2, "  rc%d", iob->rc);
2142         return 0;
2143 }
2144
2145 static int
2146 qeth_ulp_enable(struct qeth_card *card)
2147 {
2148         int rc;
2149         char prot_type;
2150         struct qeth_cmd_buffer *iob;
2151
2152         /*FIXME: trace view callbacks*/
2153         QETH_DBF_TEXT(setup,2,"ulpenabl");
2154
2155         iob = qeth_wait_for_buffer(&card->write);
2156         memcpy(iob->data, ULP_ENABLE, ULP_ENABLE_SIZE);
2157
2158         *(QETH_ULP_ENABLE_LINKNUM(iob->data)) =
2159                 (__u8) card->info.portno;
2160         if (card->options.layer2)
2161                 if (card->info.type == QETH_CARD_TYPE_OSN)
2162                         prot_type = QETH_PROT_OSN2;
2163                 else
2164                         prot_type = QETH_PROT_LAYER2;
2165         else
2166                 prot_type = QETH_PROT_TCPIP;
2167
2168         memcpy(QETH_ULP_ENABLE_PROT_TYPE(iob->data),&prot_type,1);
2169         memcpy(QETH_ULP_ENABLE_DEST_ADDR(iob->data),
2170                &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
2171         memcpy(QETH_ULP_ENABLE_FILTER_TOKEN(iob->data),
2172                &card->token.ulp_filter_w, QETH_MPC_TOKEN_LENGTH);
2173         memcpy(QETH_ULP_ENABLE_PORTNAME_AND_LL(iob->data),
2174                card->info.portname, 9);
2175         rc = qeth_send_control_data(card, ULP_ENABLE_SIZE, iob,
2176                                     qeth_ulp_enable_cb, NULL);
2177         return rc;
2178
2179 }
2180
2181 static int
2182 qeth_ulp_setup_cb(struct qeth_card *card, struct qeth_reply *reply,
2183                   unsigned long data)
2184 {
2185         struct qeth_cmd_buffer *iob;
2186
2187         QETH_DBF_TEXT(setup, 2, "ulpstpcb");
2188
2189         iob = (struct qeth_cmd_buffer *) data;
2190         memcpy(&card->token.ulp_connection_r,
2191                QETH_ULP_SETUP_RESP_CONNECTION_TOKEN(iob->data),
2192                QETH_MPC_TOKEN_LENGTH);
2193         QETH_DBF_TEXT_(setup, 2, "  rc%d", iob->rc);
2194         return 0;
2195 }
2196
2197 static int
2198 qeth_ulp_setup(struct qeth_card *card)
2199 {
2200         int rc;
2201         __u16 temp;
2202         struct qeth_cmd_buffer *iob;
2203         struct ccw_dev_id dev_id;
2204
2205         QETH_DBF_TEXT(setup,2,"ulpsetup");
2206
2207         iob = qeth_wait_for_buffer(&card->write);
2208         memcpy(iob->data, ULP_SETUP, ULP_SETUP_SIZE);
2209
2210         memcpy(QETH_ULP_SETUP_DEST_ADDR(iob->data),
2211                &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
2212         memcpy(QETH_ULP_SETUP_CONNECTION_TOKEN(iob->data),
2213                &card->token.ulp_connection_w, QETH_MPC_TOKEN_LENGTH);
2214         memcpy(QETH_ULP_SETUP_FILTER_TOKEN(iob->data),
2215                &card->token.ulp_filter_r, QETH_MPC_TOKEN_LENGTH);
2216
2217         ccw_device_get_id(CARD_DDEV(card), &dev_id);
2218         memcpy(QETH_ULP_SETUP_CUA(iob->data), &dev_id.devno, 2);
2219         temp = (card->info.cula << 8) + card->info.unit_addr2;
2220         memcpy(QETH_ULP_SETUP_REAL_DEVADDR(iob->data), &temp, 2);
2221         rc = qeth_send_control_data(card, ULP_SETUP_SIZE, iob,
2222                                     qeth_ulp_setup_cb, NULL);
2223         return rc;
2224 }
2225
2226 static inline int
2227 qeth_check_qdio_errors(struct qdio_buffer *buf, unsigned int qdio_error,
2228                        unsigned int siga_error, const char *dbftext)
2229 {
2230         if (qdio_error || siga_error) {
2231                 QETH_DBF_TEXT(trace, 2, dbftext);
2232                 QETH_DBF_TEXT(qerr, 2, dbftext);
2233                 QETH_DBF_TEXT_(qerr, 2, " F15=%02X",
2234                                buf->element[15].flags & 0xff);
2235                 QETH_DBF_TEXT_(qerr, 2, " F14=%02X",
2236                                buf->element[14].flags & 0xff);
2237                 QETH_DBF_TEXT_(qerr, 2, " qerr=%X", qdio_error);
2238                 QETH_DBF_TEXT_(qerr, 2, " serr=%X", siga_error);
2239                 return 1;
2240         }
2241         return 0;
2242 }
2243
2244 static struct sk_buff *
2245 qeth_get_skb(unsigned int length, struct qeth_hdr *hdr)
2246 {
2247         struct sk_buff* skb;
2248         int add_len;
2249
2250         add_len = 0;
2251         if (hdr->hdr.osn.id == QETH_HEADER_TYPE_OSN)
2252                 add_len = sizeof(struct qeth_hdr);
2253 #ifdef CONFIG_QETH_VLAN
2254         else
2255                 add_len = VLAN_HLEN;
2256 #endif
2257         skb = dev_alloc_skb(length + add_len);
2258         if (skb && add_len)
2259                 skb_reserve(skb, add_len);
2260         return skb;
2261 }
2262
2263 static inline int
2264 qeth_create_skb_frag(struct qdio_buffer_element *element,
2265                      struct sk_buff **pskb,
2266                      int offset, int *pfrag, int data_len)
2267 {
2268         struct page *page = virt_to_page(element->addr);
2269         if (*pfrag == 0) {
2270                 /* the upper protocol layers assume that there is data in the
2271                  * skb itself. Copy a small amount (64 bytes) to make them
2272                  * happy. */
2273                 *pskb = dev_alloc_skb(64 + QETH_FAKE_LL_LEN_ETH);
2274                 if (!(*pskb))
2275                         return -ENOMEM;
2276                 skb_reserve(*pskb, QETH_FAKE_LL_LEN_ETH);
2277                 if (data_len <= 64) {
2278                         memcpy(skb_put(*pskb, data_len), element->addr + offset,
2279                                 data_len);
2280                 } else {
2281                         get_page(page);
2282                         memcpy(skb_put(*pskb, 64), element->addr + offset, 64);
2283                         skb_fill_page_desc(*pskb, *pfrag, page, offset + 64,
2284                                 data_len - 64);
2285                         (*pskb)->data_len += data_len - 64;
2286                         (*pskb)->len      += data_len - 64;
2287                         (*pskb)->truesize += data_len - 64;
2288                 }
2289         } else {
2290                 get_page(page);
2291                 skb_fill_page_desc(*pskb, *pfrag, page, offset, data_len);
2292                 (*pskb)->data_len += data_len;
2293                 (*pskb)->len      += data_len;
2294                 (*pskb)->truesize += data_len;
2295         }
2296         (*pfrag)++;
2297         return 0;
2298 }
2299
2300 static inline struct qeth_buffer_pool_entry *
2301 qeth_find_free_buffer_pool_entry(struct qeth_card *card)
2302 {
2303         struct list_head *plh;
2304         struct qeth_buffer_pool_entry *entry;
2305         int i, free;
2306         struct page *page;
2307
2308         if (list_empty(&card->qdio.in_buf_pool.entry_list))
2309                 return NULL;
2310
2311         list_for_each(plh, &card->qdio.in_buf_pool.entry_list) {
2312                 entry = list_entry(plh, struct qeth_buffer_pool_entry, list);
2313                 free = 1;
2314                 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
2315                         if (page_count(virt_to_page(entry->elements[i])) > 1) {
2316                                 free = 0;
2317                                 break;
2318                         }
2319                 }
2320                 if (free) {
2321                         list_del_init(&entry->list);
2322                         return entry;
2323                 }
2324         }
2325
2326         /* no free buffer in pool so take first one and swap pages */
2327         entry = list_entry(card->qdio.in_buf_pool.entry_list.next,
2328                         struct qeth_buffer_pool_entry, list);
2329         for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i) {
2330                 if (page_count(virt_to_page(entry->elements[i])) > 1) {
2331                         page = alloc_page(GFP_ATOMIC|GFP_DMA);
2332                         if (!page) {
2333                                 return NULL;
2334                         } else {
2335                                 free_page((unsigned long)entry->elements[i]);
2336                                 entry->elements[i] = page_address(page);
2337                                 if (card->options.performance_stats)
2338                                         card->perf_stats.sg_alloc_page_rx++;
2339                         }
2340                 }
2341         }
2342         list_del_init(&entry->list);
2343         return entry;
2344 }
2345
2346 static struct sk_buff *
2347 qeth_get_next_skb(struct qeth_card *card, struct qdio_buffer *buffer,
2348                   struct qdio_buffer_element **__element, int *__offset,
2349                   struct qeth_hdr **hdr)
2350 {
2351         struct qdio_buffer_element *element = *__element;
2352         int offset = *__offset;
2353         struct sk_buff *skb = NULL;
2354         int skb_len;
2355         void *data_ptr;
2356         int data_len;
2357         int use_rx_sg = 0;
2358         int frag = 0;
2359
2360         QETH_DBF_TEXT(trace,6,"nextskb");
2361         /* qeth_hdr must not cross element boundaries */
2362         if (element->length < offset + sizeof(struct qeth_hdr)){
2363                 if (qeth_is_last_sbale(element))
2364                         return NULL;
2365                 element++;
2366                 offset = 0;
2367                 if (element->length < sizeof(struct qeth_hdr))
2368                         return NULL;
2369         }
2370         *hdr = element->addr + offset;
2371
2372         offset += sizeof(struct qeth_hdr);
2373         if (card->options.layer2)
2374                 if (card->info.type == QETH_CARD_TYPE_OSN)
2375                         skb_len = (*hdr)->hdr.osn.pdu_length;
2376                 else
2377                         skb_len = (*hdr)->hdr.l2.pkt_length;
2378         else
2379                 skb_len = (*hdr)->hdr.l3.length;
2380
2381         if (!skb_len)
2382                 return NULL;
2383         if ((skb_len >= card->options.rx_sg_cb) &&
2384             (!(card->info.type == QETH_CARD_TYPE_OSN)) &&
2385             (!atomic_read(&card->force_alloc_skb))) {
2386                 use_rx_sg = 1;
2387         } else {
2388                 if (card->options.fake_ll) {
2389                         if (card->dev->type == ARPHRD_IEEE802_TR) {
2390                                 if (!(skb = qeth_get_skb(skb_len +
2391                                                 QETH_FAKE_LL_LEN_TR, *hdr)))
2392                                         goto no_mem;
2393                                 skb_reserve(skb, QETH_FAKE_LL_LEN_TR);
2394                         } else {
2395                                 if (!(skb = qeth_get_skb(skb_len +
2396                                                 QETH_FAKE_LL_LEN_ETH, *hdr)))
2397                                         goto no_mem;
2398                                 skb_reserve(skb, QETH_FAKE_LL_LEN_ETH);
2399                         }
2400                 } else {
2401                         skb = qeth_get_skb(skb_len, *hdr);
2402                         if (!skb)
2403                                 goto no_mem;
2404                 }
2405         }
2406
2407         data_ptr = element->addr + offset;
2408         while (skb_len) {
2409                 data_len = min(skb_len, (int)(element->length - offset));
2410                 if (data_len) {
2411                         if (use_rx_sg) {
2412                                 if (qeth_create_skb_frag(element, &skb, offset,
2413                                     &frag, data_len))
2414                                         goto no_mem;
2415                         } else {
2416                                 memcpy(skb_put(skb, data_len), data_ptr,
2417                                         data_len);
2418                         }
2419                 }
2420                 skb_len -= data_len;
2421                 if (skb_len){
2422                         if (qeth_is_last_sbale(element)){
2423                                 QETH_DBF_TEXT(trace,4,"unexeob");
2424                                 QETH_DBF_TEXT_(trace,4,"%s",CARD_BUS_ID(card));
2425                                 QETH_DBF_TEXT(qerr,2,"unexeob");
2426                                 QETH_DBF_TEXT_(qerr,2,"%s",CARD_BUS_ID(card));
2427                                 QETH_DBF_HEX(misc,4,buffer,sizeof(*buffer));
2428                                 dev_kfree_skb_any(skb);
2429                                 card->stats.rx_errors++;
2430                                 return NULL;
2431                         }
2432                         element++;
2433                         offset = 0;
2434                         data_ptr = element->addr;
2435                 } else {
2436                         offset += data_len;
2437                 }
2438         }
2439         *__element = element;
2440         *__offset = offset;
2441         if (use_rx_sg && card->options.performance_stats) {
2442                 card->perf_stats.sg_skbs_rx++;
2443                 card->perf_stats.sg_frags_rx += skb_shinfo(skb)->nr_frags;
2444         }
2445         return skb;
2446 no_mem:
2447         if (net_ratelimit()){
2448                 PRINT_WARN("No memory for packet received on %s.\n",
2449                            QETH_CARD_IFNAME(card));
2450                 QETH_DBF_TEXT(trace,2,"noskbmem");
2451                 QETH_DBF_TEXT_(trace,2,"%s",CARD_BUS_ID(card));
2452         }
2453         card->stats.rx_dropped++;
2454         return NULL;
2455 }
2456
2457 static __be16
2458 qeth_type_trans(struct sk_buff *skb, struct net_device *dev)
2459 {
2460         struct qeth_card *card;
2461         struct ethhdr *eth;
2462
2463         QETH_DBF_TEXT(trace,6,"typtrans");
2464
2465         card = (struct qeth_card *)dev->priv;
2466 #ifdef CONFIG_TR
2467         if ((card->info.link_type == QETH_LINK_TYPE_HSTR) ||
2468             (card->info.link_type == QETH_LINK_TYPE_LANE_TR))
2469                 return tr_type_trans(skb,dev);
2470 #endif /* CONFIG_TR */
2471         skb_reset_mac_header(skb);
2472         skb_pull(skb, ETH_HLEN );
2473         eth = eth_hdr(skb);
2474
2475         if (*eth->h_dest & 1) {
2476                 if (memcmp(eth->h_dest, dev->broadcast, ETH_ALEN) == 0)
2477                         skb->pkt_type = PACKET_BROADCAST;
2478                 else
2479                         skb->pkt_type = PACKET_MULTICAST;
2480         } else if (memcmp(eth->h_dest, dev->dev_addr, ETH_ALEN))
2481                 skb->pkt_type = PACKET_OTHERHOST;
2482
2483         if (ntohs(eth->h_proto) >= 1536)
2484                 return eth->h_proto;
2485         if (*(unsigned short *) (skb->data) == 0xFFFF)
2486                 return htons(ETH_P_802_3);
2487         return htons(ETH_P_802_2);
2488 }
2489
2490 static void
2491 qeth_rebuild_skb_fake_ll_tr(struct qeth_card *card, struct sk_buff *skb,
2492                          struct qeth_hdr *hdr)
2493 {
2494         struct trh_hdr *fake_hdr;
2495         struct trllc *fake_llc;
2496         struct iphdr *ip_hdr;
2497
2498         QETH_DBF_TEXT(trace,5,"skbfktr");
2499         skb_set_mac_header(skb, -QETH_FAKE_LL_LEN_TR);
2500         /* this is a fake ethernet header */
2501         fake_hdr = tr_hdr(skb);
2502
2503         /* the destination MAC address */
2504         switch (skb->pkt_type){
2505         case PACKET_MULTICAST:
2506                 switch (skb->protocol){
2507 #ifdef CONFIG_QETH_IPV6
2508                 case __constant_htons(ETH_P_IPV6):
2509                         ndisc_mc_map((struct in6_addr *)
2510                                      skb->data + QETH_FAKE_LL_V6_ADDR_POS,
2511                                      fake_hdr->daddr, card->dev, 0);
2512                         break;
2513 #endif /* CONFIG_QETH_IPV6 */
2514                 case __constant_htons(ETH_P_IP):
2515                         ip_hdr = (struct iphdr *)skb->data;
2516                         ip_tr_mc_map(ip_hdr->daddr, fake_hdr->daddr);
2517                         break;
2518                 default:
2519                         memcpy(fake_hdr->daddr, card->dev->dev_addr, TR_ALEN);
2520                 }
2521                 break;
2522         case PACKET_BROADCAST:
2523                 memset(fake_hdr->daddr, 0xff, TR_ALEN);
2524                 break;
2525         default:
2526                 memcpy(fake_hdr->daddr, card->dev->dev_addr, TR_ALEN);
2527         }
2528         /* the source MAC address */
2529         if (hdr->hdr.l3.ext_flags & QETH_HDR_EXT_SRC_MAC_ADDR)
2530                 memcpy(fake_hdr->saddr, &hdr->hdr.l3.dest_addr[2], TR_ALEN);
2531         else
2532                 memset(fake_hdr->saddr, 0, TR_ALEN);
2533         fake_hdr->rcf=0;
2534         fake_llc = (struct trllc*)&(fake_hdr->rcf);
2535         fake_llc->dsap = EXTENDED_SAP;
2536         fake_llc->ssap = EXTENDED_SAP;
2537         fake_llc->llc  = UI_CMD;
2538         fake_llc->protid[0] = 0;
2539         fake_llc->protid[1] = 0;
2540         fake_llc->protid[2] = 0;
2541         fake_llc->ethertype = ETH_P_IP;
2542 }
2543
2544 static void
2545 qeth_rebuild_skb_fake_ll_eth(struct qeth_card *card, struct sk_buff *skb,
2546                          struct qeth_hdr *hdr)
2547 {
2548         struct ethhdr *fake_hdr;
2549         struct iphdr *ip_hdr;
2550
2551         QETH_DBF_TEXT(trace,5,"skbfketh");
2552         skb_set_mac_header(skb, -QETH_FAKE_LL_LEN_ETH);
2553         /* this is a fake ethernet header */
2554         fake_hdr = eth_hdr(skb);
2555
2556         /* the destination MAC address */
2557         switch (skb->pkt_type){
2558         case PACKET_MULTICAST:
2559                 switch (skb->protocol){
2560 #ifdef CONFIG_QETH_IPV6
2561                 case __constant_htons(ETH_P_IPV6):
2562                         ndisc_mc_map((struct in6_addr *)
2563                                      skb->data + QETH_FAKE_LL_V6_ADDR_POS,
2564                                      fake_hdr->h_dest, card->dev, 0);
2565                         break;
2566 #endif /* CONFIG_QETH_IPV6 */
2567                 case __constant_htons(ETH_P_IP):
2568                         ip_hdr = (struct iphdr *)skb->data;
2569                         ip_eth_mc_map(ip_hdr->daddr, fake_hdr->h_dest);
2570                         break;
2571                 default:
2572                         memcpy(fake_hdr->h_dest, card->dev->dev_addr, ETH_ALEN);
2573                 }
2574                 break;
2575         case PACKET_BROADCAST:
2576                 memset(fake_hdr->h_dest, 0xff, ETH_ALEN);
2577                 break;
2578         default:
2579                 memcpy(fake_hdr->h_dest, card->dev->dev_addr, ETH_ALEN);
2580         }
2581         /* the source MAC address */
2582         if (hdr->hdr.l3.ext_flags & QETH_HDR_EXT_SRC_MAC_ADDR)
2583                 memcpy(fake_hdr->h_source, &hdr->hdr.l3.dest_addr[2], ETH_ALEN);
2584         else
2585                 memset(fake_hdr->h_source, 0, ETH_ALEN);
2586         /* the protocol */
2587         fake_hdr->h_proto = skb->protocol;
2588 }
2589
2590 static inline void
2591 qeth_rebuild_skb_fake_ll(struct qeth_card *card, struct sk_buff *skb,
2592                         struct qeth_hdr *hdr)
2593 {
2594         if (card->dev->type == ARPHRD_IEEE802_TR)
2595                 qeth_rebuild_skb_fake_ll_tr(card, skb, hdr);
2596         else
2597                 qeth_rebuild_skb_fake_ll_eth(card, skb, hdr);
2598 }
2599
2600 static inline void
2601 qeth_layer2_rebuild_skb(struct qeth_card *card, struct sk_buff *skb,
2602                         struct qeth_hdr *hdr)
2603 {
2604         skb->pkt_type = PACKET_HOST;
2605         skb->protocol = qeth_type_trans(skb, skb->dev);
2606         if (card->options.checksum_type == NO_CHECKSUMMING)
2607                 skb->ip_summed = CHECKSUM_UNNECESSARY;
2608         else
2609                 skb->ip_summed = CHECKSUM_NONE;
2610         *((__u32 *)skb->cb) = ++card->seqno.pkt_seqno;
2611 }
2612
2613 static __u16
2614 qeth_rebuild_skb(struct qeth_card *card, struct sk_buff *skb,
2615                  struct qeth_hdr *hdr)
2616 {
2617         unsigned short vlan_id = 0;
2618 #ifdef CONFIG_QETH_IPV6
2619         if (hdr->hdr.l3.flags & QETH_HDR_PASSTHRU) {
2620                 skb->pkt_type = PACKET_HOST;
2621                 skb->protocol = qeth_type_trans(skb, card->dev);
2622                 return 0;
2623         }
2624 #endif /* CONFIG_QETH_IPV6 */
2625         skb->protocol = htons((hdr->hdr.l3.flags & QETH_HDR_IPV6)? ETH_P_IPV6 :
2626                               ETH_P_IP);
2627         switch (hdr->hdr.l3.flags & QETH_HDR_CAST_MASK){
2628         case QETH_CAST_UNICAST:
2629                 skb->pkt_type = PACKET_HOST;
2630                 break;
2631         case QETH_CAST_MULTICAST:
2632                 skb->pkt_type = PACKET_MULTICAST;
2633                 card->stats.multicast++;
2634                 break;
2635         case QETH_CAST_BROADCAST:
2636                 skb->pkt_type = PACKET_BROADCAST;
2637                 card->stats.multicast++;
2638                 break;
2639         case QETH_CAST_ANYCAST:
2640         case QETH_CAST_NOCAST:
2641         default:
2642                 skb->pkt_type = PACKET_HOST;
2643         }
2644
2645         if (hdr->hdr.l3.ext_flags &
2646             (QETH_HDR_EXT_VLAN_FRAME | QETH_HDR_EXT_INCLUDE_VLAN_TAG)) {
2647                 vlan_id = (hdr->hdr.l3.ext_flags & QETH_HDR_EXT_VLAN_FRAME)?
2648                         hdr->hdr.l3.vlan_id : *((u16 *)&hdr->hdr.l3.dest_addr[12]);
2649         }
2650
2651         if (card->options.fake_ll)
2652                 qeth_rebuild_skb_fake_ll(card, skb, hdr);
2653         else
2654                 skb_reset_mac_header(skb);
2655         skb->ip_summed = card->options.checksum_type;
2656         if (card->options.checksum_type == HW_CHECKSUMMING){
2657                 if ( (hdr->hdr.l3.ext_flags &
2658                       (QETH_HDR_EXT_CSUM_HDR_REQ |
2659                        QETH_HDR_EXT_CSUM_TRANSP_REQ)) ==
2660                      (QETH_HDR_EXT_CSUM_HDR_REQ |
2661                       QETH_HDR_EXT_CSUM_TRANSP_REQ) )
2662                         skb->ip_summed = CHECKSUM_UNNECESSARY;
2663                 else
2664                         skb->ip_summed = SW_CHECKSUMMING;
2665         }
2666         return vlan_id;
2667 }
2668
2669 static void
2670 qeth_process_inbound_buffer(struct qeth_card *card,
2671                             struct qeth_qdio_buffer *buf, int index)
2672 {
2673         struct qdio_buffer_element *element;
2674         struct sk_buff *skb;
2675         struct qeth_hdr *hdr;
2676         int offset;
2677         int rxrc;
2678         __u16 vlan_tag = 0;
2679
2680         /* get first element of current buffer */
2681         element = (struct qdio_buffer_element *)&buf->buffer->element[0];
2682         offset = 0;
2683         if (card->options.performance_stats)
2684                 card->perf_stats.bufs_rec++;
2685         while((skb = qeth_get_next_skb(card, buf->buffer, &element,
2686                                        &offset, &hdr))) {
2687                 skb->dev = card->dev;
2688                 if (hdr->hdr.l2.id == QETH_HEADER_TYPE_LAYER2)
2689                         qeth_layer2_rebuild_skb(card, skb, hdr);
2690                 else if (hdr->hdr.l3.id == QETH_HEADER_TYPE_LAYER3)
2691                         vlan_tag = qeth_rebuild_skb(card, skb, hdr);
2692                 else { /*in case of OSN*/
2693                         skb_push(skb, sizeof(struct qeth_hdr));
2694                         skb_copy_to_linear_data(skb, hdr,
2695                                                 sizeof(struct qeth_hdr));
2696                 }
2697                 /* is device UP ? */
2698                 if (!(card->dev->flags & IFF_UP)){
2699                         dev_kfree_skb_any(skb);
2700                         continue;
2701                 }
2702                 if (card->info.type == QETH_CARD_TYPE_OSN)
2703                         rxrc = card->osn_info.data_cb(skb);
2704                 else
2705 #ifdef CONFIG_QETH_VLAN
2706                 if (vlan_tag)
2707                         if (card->vlangrp)
2708                                 vlan_hwaccel_rx(skb, card->vlangrp, vlan_tag);
2709                         else {
2710                                 dev_kfree_skb_any(skb);
2711                                 continue;
2712                         }
2713                 else
2714 #endif
2715                         rxrc = netif_rx(skb);
2716                 card->dev->last_rx = jiffies;
2717                 card->stats.rx_packets++;
2718                 card->stats.rx_bytes += skb->len;
2719         }
2720 }
2721
2722 static int
2723 qeth_init_input_buffer(struct qeth_card *card, struct qeth_qdio_buffer *buf)
2724 {
2725         struct qeth_buffer_pool_entry *pool_entry;
2726         int i;
2727
2728         pool_entry = qeth_find_free_buffer_pool_entry(card);
2729         if (!pool_entry)
2730                 return 1;
2731         /*
2732          * since the buffer is accessed only from the input_tasklet
2733          * there shouldn't be a need to synchronize; also, since we use
2734          * the QETH_IN_BUF_REQUEUE_THRESHOLD we should never run  out off
2735          * buffers
2736          */
2737         BUG_ON(!pool_entry);
2738
2739         buf->pool_entry = pool_entry;
2740         for(i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i){
2741                 buf->buffer->element[i].length = PAGE_SIZE;
2742                 buf->buffer->element[i].addr =  pool_entry->elements[i];
2743                 if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1)
2744                         buf->buffer->element[i].flags = SBAL_FLAGS_LAST_ENTRY;
2745                 else
2746                         buf->buffer->element[i].flags = 0;
2747         }
2748         buf->state = QETH_QDIO_BUF_EMPTY;
2749         return 0;
2750 }
2751
2752 static void
2753 qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,
2754                          struct qeth_qdio_out_buffer *buf)
2755 {
2756         int i;
2757         struct sk_buff *skb;
2758
2759         /* is PCI flag set on buffer? */
2760         if (buf->buffer->element[0].flags & 0x40)
2761                 atomic_dec(&queue->set_pci_flags_count);
2762
2763         while ((skb = skb_dequeue(&buf->skb_list))){
2764                 atomic_dec(&skb->users);
2765                 dev_kfree_skb_any(skb);
2766         }
2767         qeth_eddp_buf_release_contexts(buf);
2768         for(i = 0; i < QETH_MAX_BUFFER_ELEMENTS(queue->card); ++i){
2769                 buf->buffer->element[i].length = 0;
2770                 buf->buffer->element[i].addr = NULL;
2771                 buf->buffer->element[i].flags = 0;
2772         }
2773         buf->next_element_to_fill = 0;
2774         atomic_set(&buf->state, QETH_QDIO_BUF_EMPTY);
2775 }
2776
2777 static void
2778 qeth_queue_input_buffer(struct qeth_card *card, int index)
2779 {
2780         struct qeth_qdio_q *queue = card->qdio.in_q;
2781         int count;
2782         int i;
2783         int rc;
2784         int newcount = 0;
2785
2786         QETH_DBF_TEXT(trace,6,"queinbuf");
2787         count = (index < queue->next_buf_to_init)?
2788                 card->qdio.in_buf_pool.buf_count -
2789                 (queue->next_buf_to_init - index) :
2790                 card->qdio.in_buf_pool.buf_count -
2791                 (queue->next_buf_to_init + QDIO_MAX_BUFFERS_PER_Q - index);
2792         /* only requeue at a certain threshold to avoid SIGAs */
2793         if (count >= QETH_IN_BUF_REQUEUE_THRESHOLD(card)){
2794                 for (i = queue->next_buf_to_init;
2795                      i < queue->next_buf_to_init + count; ++i) {
2796                         if (qeth_init_input_buffer(card,
2797                                 &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q])) {
2798                                 break;
2799                         } else {
2800                                 newcount++;
2801                         }
2802                 }
2803
2804                 if (newcount < count) {
2805                         /* we are in memory shortage so we switch back to
2806                            traditional skb allocation and drop packages */
2807                         if (atomic_cmpxchg(&card->force_alloc_skb, 0, 1))
2808                                 printk(KERN_WARNING
2809                                         "qeth: switch to alloc skb\n");
2810                         count = newcount;
2811                 } else {
2812                         if (atomic_cmpxchg(&card->force_alloc_skb, 1, 0))
2813                                 printk(KERN_WARNING "qeth: switch to sg\n");
2814                 }
2815
2816                 /*
2817                  * according to old code it should be avoided to requeue all
2818                  * 128 buffers in order to benefit from PCI avoidance.
2819                  * this function keeps at least one buffer (the buffer at
2820                  * 'index') un-requeued -> this buffer is the first buffer that
2821                  * will be requeued the next time
2822                  */
2823                 if (card->options.performance_stats) {
2824                         card->perf_stats.inbound_do_qdio_cnt++;
2825                         card->perf_stats.inbound_do_qdio_start_time =
2826                                 qeth_get_micros();
2827                 }
2828                 rc = do_QDIO(CARD_DDEV(card),
2829                              QDIO_FLAG_SYNC_INPUT | QDIO_FLAG_UNDER_INTERRUPT,
2830                              0, queue->next_buf_to_init, count, NULL);
2831                 if (card->options.performance_stats)
2832                         card->perf_stats.inbound_do_qdio_time +=
2833                                 qeth_get_micros() -
2834                                 card->perf_stats.inbound_do_qdio_start_time;
2835                 if (rc){
2836                         PRINT_WARN("qeth_queue_input_buffer's do_QDIO "
2837                                    "return %i (device %s).\n",
2838                                    rc, CARD_DDEV_ID(card));
2839                         QETH_DBF_TEXT(trace,2,"qinberr");
2840                         QETH_DBF_TEXT_(trace,2,"%s",CARD_BUS_ID(card));
2841                 }
2842                 queue->next_buf_to_init = (queue->next_buf_to_init + count) %
2843                                           QDIO_MAX_BUFFERS_PER_Q;
2844         }
2845 }
2846
2847 static inline void
2848 qeth_put_buffer_pool_entry(struct qeth_card *card,
2849                            struct qeth_buffer_pool_entry *entry)
2850 {
2851         QETH_DBF_TEXT(trace, 6, "ptbfplen");
2852         list_add_tail(&entry->list, &card->qdio.in_buf_pool.entry_list);
2853 }
2854
2855 static void
2856 qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status,
2857                         unsigned int qdio_err, unsigned int siga_err,
2858                         unsigned int queue, int first_element, int count,
2859                         unsigned long card_ptr)
2860 {
2861         struct net_device *net_dev;
2862         struct qeth_card *card;
2863         struct qeth_qdio_buffer *buffer;
2864         int index;
2865         int i;
2866
2867         QETH_DBF_TEXT(trace, 6, "qdinput");
2868         card = (struct qeth_card *) card_ptr;
2869         net_dev = card->dev;
2870         if (card->options.performance_stats) {
2871                 card->perf_stats.inbound_cnt++;
2872                 card->perf_stats.inbound_start_time = qeth_get_micros();
2873         }
2874         if (status & QDIO_STATUS_LOOK_FOR_ERROR) {
2875                 if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION){
2876                         QETH_DBF_TEXT(trace, 1,"qdinchk");
2877                         QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card));
2878                         QETH_DBF_TEXT_(trace,1,"%04X%04X",first_element,count);
2879                         QETH_DBF_TEXT_(trace,1,"%04X%04X", queue, status);
2880                         qeth_schedule_recovery(card);
2881                         return;
2882                 }
2883         }
2884         for (i = first_element; i < (first_element + count); ++i) {
2885                 index = i % QDIO_MAX_BUFFERS_PER_Q;
2886                 buffer = &card->qdio.in_q->bufs[index];
2887                 if (!((status & QDIO_STATUS_LOOK_FOR_ERROR) &&
2888                       qeth_check_qdio_errors(buffer->buffer,
2889                                              qdio_err, siga_err,"qinerr")))
2890                         qeth_process_inbound_buffer(card, buffer, index);
2891                 /* clear buffer and give back to hardware */
2892                 qeth_put_buffer_pool_entry(card, buffer->pool_entry);
2893                 qeth_queue_input_buffer(card, index);
2894         }
2895         if (card->options.performance_stats)
2896                 card->perf_stats.inbound_time += qeth_get_micros() -
2897                         card->perf_stats.inbound_start_time;
2898 }
2899
2900 static int
2901 qeth_handle_send_error(struct qeth_card *card,
2902                        struct qeth_qdio_out_buffer *buffer,
2903                        unsigned int qdio_err, unsigned int siga_err)
2904 {
2905         int sbalf15 = buffer->buffer->element[15].flags & 0xff;
2906         int cc = siga_err & 3;
2907
2908         QETH_DBF_TEXT(trace, 6, "hdsnderr");
2909         qeth_check_qdio_errors(buffer->buffer, qdio_err, siga_err, "qouterr");
2910         switch (cc) {
2911         case 0:
2912                 if (qdio_err){
2913                         QETH_DBF_TEXT(trace, 1,"lnkfail");
2914                         QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card));
2915                         QETH_DBF_TEXT_(trace,1,"%04x %02x",
2916                                        (u16)qdio_err, (u8)sbalf15);
2917                         return QETH_SEND_ERROR_LINK_FAILURE;
2918                 }
2919                 return QETH_SEND_ERROR_NONE;
2920         case 2:
2921                 if (siga_err & QDIO_SIGA_ERROR_B_BIT_SET) {
2922                         QETH_DBF_TEXT(trace, 1, "SIGAcc2B");
2923                         QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card));
2924                         return QETH_SEND_ERROR_KICK_IT;
2925                 }
2926                 if ((sbalf15 >= 15) && (sbalf15 <= 31))
2927                         return QETH_SEND_ERROR_RETRY;
2928                 return QETH_SEND_ERROR_LINK_FAILURE;
2929                 /* look at qdio_error and sbalf 15 */
2930         case 1:
2931                 QETH_DBF_TEXT(trace, 1, "SIGAcc1");
2932                 QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card));
2933                 return QETH_SEND_ERROR_LINK_FAILURE;
2934         case 3:
2935         default:
2936                 QETH_DBF_TEXT(trace, 1, "SIGAcc3");
2937                 QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card));
2938                 return QETH_SEND_ERROR_KICK_IT;
2939         }
2940 }
2941
2942 void
2943 qeth_flush_buffers(struct qeth_qdio_out_q *queue, int under_int,
2944                    int index, int count)
2945 {
2946         struct qeth_qdio_out_buffer *buf;
2947         int rc;
2948         int i;
2949         unsigned int qdio_flags;
2950
2951         QETH_DBF_TEXT(trace, 6, "flushbuf");
2952
2953         for (i = index; i < index + count; ++i) {
2954                 buf = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q];
2955                 buf->buffer->element[buf->next_element_to_fill - 1].flags |=
2956                                 SBAL_FLAGS_LAST_ENTRY;
2957
2958                 if (queue->card->info.type == QETH_CARD_TYPE_IQD)
2959                         continue;
2960
2961                 if (!queue->do_pack){
2962                         if ((atomic_read(&queue->used_buffers) >=
2963                                 (QETH_HIGH_WATERMARK_PACK -
2964                                  QETH_WATERMARK_PACK_FUZZ)) &&
2965                             !atomic_read(&queue->set_pci_flags_count)){
2966                                 /* it's likely that we'll go to packing
2967                                  * mode soon */
2968                                 atomic_inc(&queue->set_pci_flags_count);
2969                                 buf->buffer->element[0].flags |= 0x40;
2970                         }
2971                 } else {
2972                         if (!atomic_read(&queue->set_pci_flags_count)){
2973                                 /*
2974                                  * there's no outstanding PCI any more, so we
2975                                  * have to request a PCI to be sure that the PCI
2976                                  * will wake at some time in the future then we
2977                                  * can flush packed buffers that might still be
2978                                  * hanging around, which can happen if no
2979                                  * further send was requested by the stack
2980                                  */
2981                                 atomic_inc(&queue->set_pci_flags_count);
2982                                 buf->buffer->element[0].flags |= 0x40;
2983                         }
2984                 }
2985         }
2986
2987         queue->card->dev->trans_start = jiffies;
2988         if (queue->card->options.performance_stats) {
2989                 queue->card->perf_stats.outbound_do_qdio_cnt++;
2990                 queue->card->perf_stats.outbound_do_qdio_start_time =
2991                         qeth_get_micros();
2992         }
2993         qdio_flags = QDIO_FLAG_SYNC_OUTPUT;
2994         if (under_int)
2995                 qdio_flags |= QDIO_FLAG_UNDER_INTERRUPT;
2996         if (atomic_read(&queue->set_pci_flags_count))
2997                 qdio_flags |= QDIO_FLAG_PCI_OUT;
2998         rc = do_QDIO(CARD_DDEV(queue->card), qdio_flags,
2999                      queue->queue_no, index, count, NULL);
3000         if (queue->card->options.performance_stats)
3001                 queue->card->perf_stats.outbound_do_qdio_time +=
3002                         qeth_get_micros() -
3003                         queue->card->perf_stats.outbound_do_qdio_start_time;
3004         if (rc){
3005                 QETH_DBF_TEXT(trace, 2, "flushbuf");
3006                 QETH_DBF_TEXT_(trace, 2, " err%d", rc);
3007                 QETH_DBF_TEXT_(trace, 2, "%s", CARD_DDEV_ID(queue->card));
3008                 queue->card->stats.tx_errors += count;
3009                 /* this must not happen under normal circumstances. if it
3010                  * happens something is really wrong -> recover */
3011                 qeth_schedule_recovery(queue->card);
3012                 return;
3013         }
3014         atomic_add(count, &queue->used_buffers);
3015         if (queue->card->options.performance_stats)
3016                 queue->card->perf_stats.bufs_sent += count;
3017 }
3018
3019 /*
3020  * Switched to packing state if the number of used buffers on a queue
3021  * reaches a certain limit.
3022  */
3023 static void
3024 qeth_switch_to_packing_if_needed(struct qeth_qdio_out_q *queue)
3025 {
3026         if (!queue->do_pack) {
3027                 if (atomic_read(&queue->used_buffers)
3028                     >= QETH_HIGH_WATERMARK_PACK){
3029                         /* switch non-PACKING -> PACKING */
3030                         QETH_DBF_TEXT(trace, 6, "np->pack");
3031                         if (queue->card->options.performance_stats)
3032                                 queue->card->perf_stats.sc_dp_p++;
3033                         queue->do_pack = 1;
3034                 }
3035         }
3036 }
3037
3038 /*
3039  * Switches from packing to non-packing mode. If there is a packing
3040  * buffer on the queue this buffer will be prepared to be flushed.
3041  * In that case 1 is returned to inform the caller. If no buffer
3042  * has to be flushed, zero is returned.
3043  */
3044 static int
3045 qeth_switch_to_nonpacking_if_needed(struct qeth_qdio_out_q *queue)
3046 {
3047         struct qeth_qdio_out_buffer *buffer;
3048         int flush_count = 0;
3049
3050         if (queue->do_pack) {
3051                 if (atomic_read(&queue->used_buffers)
3052                     <= QETH_LOW_WATERMARK_PACK) {
3053                         /* switch PACKING -> non-PACKING */
3054                         QETH_DBF_TEXT(trace, 6, "pack->np");
3055                         if (queue->card->options.performance_stats)
3056                                 queue->card->perf_stats.sc_p_dp++;
3057                         queue->do_pack = 0;
3058                         /* flush packing buffers */
3059                         buffer = &queue->bufs[queue->next_buf_to_fill];
3060                         if ((atomic_read(&buffer->state) ==
3061                                                 QETH_QDIO_BUF_EMPTY) &&
3062                             (buffer->next_element_to_fill > 0)) {
3063                                 atomic_set(&buffer->state,QETH_QDIO_BUF_PRIMED);
3064                                 flush_count++;
3065                                 queue->next_buf_to_fill =
3066                                         (queue->next_buf_to_fill + 1) %
3067                                         QDIO_MAX_BUFFERS_PER_Q;
3068                         }
3069                 }
3070         }
3071         return flush_count;
3072 }
3073
3074 /*
3075  * Called to flush a packing buffer if no more pci flags are on the queue.
3076  * Checks if there is a packing buffer and prepares it to be flushed.
3077  * In that case returns 1, otherwise zero.
3078  */
3079 static int
3080 qeth_flush_buffers_on_no_pci(struct qeth_qdio_out_q *queue)
3081 {
3082         struct qeth_qdio_out_buffer *buffer;
3083
3084         buffer = &queue->bufs[queue->next_buf_to_fill];
3085         if((atomic_read(&buffer->state) == QETH_QDIO_BUF_EMPTY) &&
3086            (buffer->next_element_to_fill > 0)){
3087                 /* it's a packing buffer */
3088                 atomic_set(&buffer->state, QETH_QDIO_BUF_PRIMED);
3089                 queue->next_buf_to_fill =
3090                         (queue->next_buf_to_fill + 1) % QDIO_MAX_BUFFERS_PER_Q;
3091                 return 1;
3092         }
3093         return 0;
3094 }
3095
3096 static void
3097 qeth_check_outbound_queue(struct qeth_qdio_out_q *queue)
3098 {
3099         int index;
3100         int flush_cnt = 0;
3101         int q_was_packing = 0;
3102
3103         /*
3104          * check if weed have to switch to non-packing mode or if
3105          * we have to get a pci flag out on the queue
3106          */
3107         if ((atomic_read(&queue->used_buffers) <= QETH_LOW_WATERMARK_PACK) ||
3108             !atomic_read(&queue->set_pci_flags_count)){
3109                 if (atomic_xchg(&queue->state, QETH_OUT_Q_LOCKED_FLUSH) ==
3110                                 QETH_OUT_Q_UNLOCKED) {
3111                         /*
3112                          * If we get in here, there was no action in
3113                          * do_send_packet. So, we check if there is a
3114                          * packing buffer to be flushed here.
3115                          */
3116                         netif_stop_queue(queue->card->dev);
3117                         index = queue->next_buf_to_fill;
3118                         q_was_packing = queue->do_pack;
3119                         flush_cnt += qeth_switch_to_nonpacking_if_needed(queue);
3120                         if (!flush_cnt &&
3121                             !atomic_read(&queue->set_pci_flags_count))
3122                                 flush_cnt +=
3123                                         qeth_flush_buffers_on_no_pci(queue);
3124                         if (queue->card->options.performance_stats &&
3125                             q_was_packing)
3126                                 queue->card->perf_stats.bufs_sent_pack +=
3127                                         flush_cnt;
3128                         if (flush_cnt)
3129                                 qeth_flush_buffers(queue, 1, index, flush_cnt);
3130                         atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
3131                 }
3132         }
3133 }
3134
3135 static void
3136 qeth_qdio_output_handler(struct ccw_device * ccwdev, unsigned int status,
3137                         unsigned int qdio_error, unsigned int siga_error,
3138                         unsigned int __queue, int first_element, int count,
3139                         unsigned long card_ptr)
3140 {
3141         struct qeth_card *card        = (struct qeth_card *) card_ptr;
3142         struct qeth_qdio_out_q *queue = card->qdio.out_qs[__queue];
3143         struct qeth_qdio_out_buffer *buffer;
3144         int i;
3145
3146         QETH_DBF_TEXT(trace, 6, "qdouhdl");
3147         if (status & QDIO_STATUS_LOOK_FOR_ERROR) {
3148                 if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION){
3149                         QETH_DBF_TEXT(trace, 2, "achkcond");
3150                         QETH_DBF_TEXT_(trace, 2, "%s", CARD_BUS_ID(card));
3151                         QETH_DBF_TEXT_(trace, 2, "%08x", status);
3152                         netif_stop_queue(card->dev);
3153                         qeth_schedule_recovery(card);
3154                         return;
3155                 }
3156         }
3157         if (card->options.performance_stats) {
3158                 card->perf_stats.outbound_handler_cnt++;
3159                 card->perf_stats.outbound_handler_start_time =
3160                         qeth_get_micros();
3161         }
3162         for(i = first_element; i < (first_element + count); ++i){
3163                 buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q];
3164                 /*we only handle the KICK_IT error by doing a recovery */
3165                 if (qeth_handle_send_error(card, buffer,
3166                                            qdio_error, siga_error)
3167                                 == QETH_SEND_ERROR_KICK_IT){
3168                         netif_stop_queue(card->dev);
3169                         qeth_schedule_recovery(card);
3170                         return;
3171                 }
3172                 qeth_clear_output_buffer(queue, buffer);
3173         }
3174         atomic_sub(count, &queue->used_buffers);
3175         /* check if we need to do something on this outbound queue */
3176         if (card->info.type != QETH_CARD_TYPE_IQD)
3177                 qeth_check_outbound_queue(queue);
3178
3179         netif_wake_queue(queue->card->dev);
3180         if (card->options.performance_stats)
3181                 card->perf_stats.outbound_handler_time += qeth_get_micros() -
3182                         card->perf_stats.outbound_handler_start_time;
3183 }
3184
3185 static void
3186 qeth_create_qib_param_field(struct qeth_card *card, char *param_field)
3187 {
3188
3189         param_field[0] = _ascebc['P'];
3190         param_field[1] = _ascebc['C'];
3191         param_field[2] = _ascebc['I'];
3192         param_field[3] = _ascebc['T'];
3193         *((unsigned int *) (&param_field[4])) = QETH_PCI_THRESHOLD_A(card);
3194         *((unsigned int *) (&param_field[8])) = QETH_PCI_THRESHOLD_B(card);
3195         *((unsigned int *) (&param_field[12])) = QETH_PCI_TIMER_VALUE(card);
3196 }
3197
3198 static void
3199 qeth_create_qib_param_field_blkt(struct qeth_card *card, char *param_field)
3200 {
3201         param_field[16] = _ascebc['B'];
3202         param_field[17] = _ascebc['L'];
3203         param_field[18] = _ascebc['K'];
3204         param_field[19] = _ascebc['T'];
3205         *((unsigned int *) (&param_field[20])) = card->info.blkt.time_total;
3206         *((unsigned int *) (&param_field[24])) = card->info.blkt.inter_packet;
3207         *((unsigned int *) (&param_field[28])) = card->info.blkt.inter_packet_jumbo;
3208 }
3209
3210 static void
3211 qeth_initialize_working_pool_list(struct qeth_card *card)
3212 {
3213         struct qeth_buffer_pool_entry *entry;
3214
3215         QETH_DBF_TEXT(trace,5,"inwrklst");
3216
3217         list_for_each_entry(entry,
3218                             &card->qdio.init_pool.entry_list, init_list) {
3219                 qeth_put_buffer_pool_entry(card,entry);
3220         }
3221 }
3222
3223 static void
3224 qeth_clear_working_pool_list(struct qeth_card *card)
3225 {
3226         struct qeth_buffer_pool_entry *pool_entry, *tmp;
3227
3228         QETH_DBF_TEXT(trace,5,"clwrklst");
3229         list_for_each_entry_safe(pool_entry, tmp,
3230                             &card->qdio.in_buf_pool.entry_list, list){
3231                         list_del(&pool_entry->list);
3232         }
3233 }
3234
3235 static void
3236 qeth_free_buffer_pool(struct qeth_card *card)
3237 {
3238         struct qeth_buffer_pool_entry *pool_entry, *tmp;
3239         int i=0;
3240         QETH_DBF_TEXT(trace,5,"freepool");
3241         list_for_each_entry_safe(pool_entry, tmp,
3242                                  &card->qdio.init_pool.entry_list, init_list){
3243                 for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i)
3244                         free_page((unsigned long)pool_entry->elements[i]);
3245                 list_del(&pool_entry->init_list);
3246                 kfree(pool_entry);
3247         }
3248 }
3249
3250 static int
3251 qeth_alloc_buffer_pool(struct qeth_card *card)
3252 {
3253         struct qeth_buffer_pool_entry *pool_entry;
3254         void *ptr;
3255         int i, j;
3256
3257         QETH_DBF_TEXT(trace,5,"alocpool");
3258         for (i = 0; i < card->qdio.init_pool.buf_count; ++i){
3259                 pool_entry = kmalloc(sizeof(*pool_entry), GFP_KERNEL);
3260                 if (!pool_entry){
3261                         qeth_free_buffer_pool(card);
3262                         return -ENOMEM;
3263                 }
3264                 for(j = 0; j < QETH_MAX_BUFFER_ELEMENTS(card); ++j){
3265                         ptr = (void *) __get_free_page(GFP_KERNEL|GFP_DMA);
3266                         if (!ptr) {
3267                                 while (j > 0)
3268                                         free_page((unsigned long)
3269                                                   pool_entry->elements[--j]);
3270                                 kfree(pool_entry);
3271                                 qeth_free_buffer_pool(card);
3272                                 return -ENOMEM;
3273                         }
3274                         pool_entry->elements[j] = ptr;
3275                 }
3276                 list_add(&pool_entry->init_list,
3277                          &card->qdio.init_pool.entry_list);
3278         }
3279         return 0;
3280 }
3281
3282 int
3283 qeth_realloc_buffer_pool(struct qeth_card *card, int bufcnt)
3284 {
3285         QETH_DBF_TEXT(trace, 2, "realcbp");
3286
3287         if ((card->state != CARD_STATE_DOWN) &&
3288             (card->state != CARD_STATE_RECOVER))
3289                 return -EPERM;
3290
3291         /* TODO: steel/add buffers from/to a running card's buffer pool (?) */
3292         qeth_clear_working_pool_list(card);
3293         qeth_free_buffer_pool(card);
3294         card->qdio.in_buf_pool.buf_count = bufcnt;
3295         card->qdio.init_pool.buf_count = bufcnt;
3296         return qeth_alloc_buffer_pool(card);
3297 }
3298
3299 static int
3300 qeth_alloc_qdio_buffers(struct qeth_card *card)
3301 {
3302         int i, j;
3303
3304         QETH_DBF_TEXT(setup, 2, "allcqdbf");
3305
3306         if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED,
3307                 QETH_QDIO_ALLOCATED) != QETH_QDIO_UNINITIALIZED)
3308                 return 0;
3309
3310         card->qdio.in_q = kmalloc(sizeof(struct qeth_qdio_q),
3311                                   GFP_KERNEL|GFP_DMA);
3312         if (!card->qdio.in_q)
3313                 goto out_nomem;
3314         QETH_DBF_TEXT(setup, 2, "inq");
3315         QETH_DBF_HEX(setup, 2, &card->qdio.in_q, sizeof(void *));
3316         memset(card->qdio.in_q, 0, sizeof(struct qeth_qdio_q));
3317         /* give inbound qeth_qdio_buffers their qdio_buffers */
3318         for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i)
3319                 card->qdio.in_q->bufs[i].buffer =
3320                         &card->qdio.in_q->qdio_bufs[i];
3321         /* inbound buffer pool */
3322         if (qeth_alloc_buffer_pool(card))
3323                 goto out_freeinq;
3324         /* outbound */
3325         card->qdio.out_qs =
3326                 kmalloc(card->qdio.no_out_queues *
3327                         sizeof(struct qeth_qdio_out_q *), GFP_KERNEL);
3328         if (!card->qdio.out_qs)
3329                 goto out_freepool;
3330         for (i = 0; i < card->qdio.no_out_queues; ++i) {
3331                 card->qdio.out_qs[i] = kmalloc(sizeof(struct qeth_qdio_out_q),
3332                                                GFP_KERNEL|GFP_DMA);
3333                 if (!card->qdio.out_qs[i])
3334                         goto out_freeoutq;
3335                 QETH_DBF_TEXT_(setup, 2, "outq %i", i);
3336                 QETH_DBF_HEX(setup, 2, &card->qdio.out_qs[i], sizeof(void *));
3337                 memset(card->qdio.out_qs[i], 0, sizeof(struct qeth_qdio_out_q));
3338                 card->qdio.out_qs[i]->queue_no = i;
3339                 /* give outbound qeth_qdio_buffers their qdio_buffers */
3340                 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j){
3341                         card->qdio.out_qs[i]->bufs[j].buffer =
3342                                 &card->qdio.out_qs[i]->qdio_bufs[j];
3343                         skb_queue_head_init(&card->qdio.out_qs[i]->bufs[j].
3344                                             skb_list);
3345                         lockdep_set_class(
3346                                 &card->qdio.out_qs[i]->bufs[j].skb_list.lock,
3347                                 &qdio_out_skb_queue_key);
3348                         INIT_LIST_HEAD(&card->qdio.out_qs[i]->bufs[j].ctx_list);
3349                 }
3350         }
3351         return 0;
3352
3353 out_freeoutq:
3354         while (i > 0)
3355                 kfree(card->qdio.out_qs[--i]);
3356         kfree(card->qdio.out_qs);
3357 out_freepool:
3358         qeth_free_buffer_pool(card);
3359 out_freeinq:
3360         kfree(card->qdio.in_q);
3361 out_nomem:
3362         atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED);
3363         return -ENOMEM;
3364 }
3365
3366 static void
3367 qeth_free_qdio_buffers(struct qeth_card *card)
3368 {
3369         int i, j;
3370
3371         QETH_DBF_TEXT(trace, 2, "freeqdbf");
3372         if (atomic_xchg(&card->qdio.state, QETH_QDIO_UNINITIALIZED) ==
3373                 QETH_QDIO_UNINITIALIZED)
3374                 return;
3375         kfree(card->qdio.in_q);
3376         /* inbound buffer pool */
3377         qeth_free_buffer_pool(card);
3378         /* free outbound qdio_qs */
3379         for (i = 0; i < card->qdio.no_out_queues; ++i){
3380                 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j)
3381                         qeth_clear_output_buffer(card->qdio.out_qs[i],
3382                                         &card->qdio.out_qs[i]->bufs[j]);
3383                 kfree(card->qdio.out_qs[i]);
3384         }
3385         kfree(card->qdio.out_qs);
3386 }
3387
3388 static void
3389 qeth_clear_qdio_buffers(struct qeth_card *card)
3390 {
3391         int i, j;
3392
3393         QETH_DBF_TEXT(trace, 2, "clearqdbf");
3394         /* clear outbound buffers to free skbs */
3395         for (i = 0; i < card->qdio.no_out_queues; ++i)
3396                 if (card->qdio.out_qs[i]){
3397                         for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j)
3398                                 qeth_clear_output_buffer(card->qdio.out_qs[i],
3399                                                 &card->qdio.out_qs[i]->bufs[j]);
3400                 }
3401 }
3402
3403 static void
3404 qeth_init_qdio_info(struct qeth_card *card)
3405 {
3406         QETH_DBF_TEXT(setup, 4, "intqdinf");
3407         atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED);
3408         /* inbound */
3409         card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
3410         card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_DEFAULT;
3411         card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count;
3412         INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list);
3413         INIT_LIST_HEAD(&card->qdio.init_pool.entry_list);
3414 }
3415
3416 static int
3417 qeth_init_qdio_queues(struct qeth_card *card)
3418 {
3419         int i, j;
3420         int rc;
3421
3422         QETH_DBF_TEXT(setup, 2, "initqdqs");
3423
3424         /* inbound queue */
3425         memset(card->qdio.in_q->qdio_bufs, 0,
3426                QDIO_MAX_BUFFERS_PER_Q * sizeof(struct qdio_buffer));
3427         qeth_initialize_working_pool_list(card);
3428         /*give only as many buffers to hardware as we have buffer pool entries*/
3429         for (i = 0; i < card->qdio.in_buf_pool.buf_count - 1; ++i)
3430                 qeth_init_input_buffer(card, &card->qdio.in_q->bufs[i]);
3431         card->qdio.in_q->next_buf_to_init = card->qdio.in_buf_pool.buf_count - 1;
3432         rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0, 0,
3433                      card->qdio.in_buf_pool.buf_count - 1, NULL);
3434         if (rc) {
3435                 QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
3436                 return rc;
3437         }
3438         rc = qdio_synchronize(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0);
3439         if (rc) {
3440                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
3441                 return rc;
3442         }
3443         /* outbound queue */
3444         for (i = 0; i < card->qdio.no_out_queues; ++i){
3445                 memset(card->qdio.out_qs[i]->qdio_bufs, 0,
3446                        QDIO_MAX_BUFFERS_PER_Q * sizeof(struct qdio_buffer));
3447                 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j){
3448                         qeth_clear_output_buffer(card->qdio.out_qs[i],
3449                                         &card->qdio.out_qs[i]->bufs[j]);
3450                 }
3451                 card->qdio.out_qs[i]->card = card;
3452                 card->qdio.out_qs[i]->next_buf_to_fill = 0;
3453                 card->qdio.out_qs[i]->do_pack = 0;
3454                 atomic_set(&card->qdio.out_qs[i]->used_buffers,0);
3455                 atomic_set(&card->qdio.out_qs[i]->set_pci_flags_count, 0);
3456                 atomic_set(&card->qdio.out_qs[i]->state,
3457                            QETH_OUT_Q_UNLOCKED);
3458         }
3459         return 0;
3460 }
3461
3462 static int
3463 qeth_qdio_establish(struct qeth_card *card)
3464 {
3465         struct qdio_initialize init_data;
3466         char *qib_param_field;
3467         struct qdio_buffer **in_sbal_ptrs;
3468         struct qdio_buffer **out_sbal_ptrs;
3469         int i, j, k;
3470         int rc = 0;
3471
3472         QETH_DBF_TEXT(setup, 2, "qdioest");
3473
3474         qib_param_field = kzalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof(char),
3475                               GFP_KERNEL);
3476         if (!qib_param_field)
3477                 return -ENOMEM;
3478
3479         qeth_create_qib_param_field(card, qib_param_field);
3480         qeth_create_qib_param_field_blkt(card, qib_param_field);
3481
3482         in_sbal_ptrs = kmalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof(void *),
3483                                GFP_KERNEL);
3484         if (!in_sbal_ptrs) {
3485                 kfree(qib_param_field);
3486                 return -ENOMEM;
3487         }
3488         for(i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i)
3489                 in_sbal_ptrs[i] = (struct qdio_buffer *)
3490                         virt_to_phys(card->qdio.in_q->bufs[i].buffer);
3491
3492         out_sbal_ptrs =
3493                 kmalloc(card->qdio.no_out_queues * QDIO_MAX_BUFFERS_PER_Q *
3494                         sizeof(void *), GFP_KERNEL);
3495         if (!out_sbal_ptrs) {
3496                 kfree(in_sbal_ptrs);
3497                 kfree(qib_param_field);
3498                 return -ENOMEM;
3499         }
3500         for(i = 0, k = 0; i < card->qdio.no_out_queues; ++i)
3501                 for(j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j, ++k){
3502                         out_sbal_ptrs[k] = (struct qdio_buffer *)
3503                                 virt_to_phys(card->qdio.out_qs[i]->
3504                                              bufs[j].buffer);
3505                 }
3506
3507         memset(&init_data, 0, sizeof(struct qdio_initialize));
3508         init_data.cdev                   = CARD_DDEV(card);
3509         init_data.q_format               = qeth_get_qdio_q_format(card);
3510         init_data.qib_param_field_format = 0;
3511         init_data.qib_param_field        = qib_param_field;
3512         init_data.min_input_threshold    = QETH_MIN_INPUT_THRESHOLD;
3513         init_data.max_input_threshold    = QETH_MAX_INPUT_THRESHOLD;
3514         init_data.min_output_threshold   = QETH_MIN_OUTPUT_THRESHOLD;
3515         init_data.max_output_threshold   = QETH_MAX_OUTPUT_THRESHOLD;
3516         init_data.no_input_qs            = 1;
3517         init_data.no_output_qs           = card->qdio.no_out_queues;
3518         init_data.input_handler          = (qdio_handler_t *)
3519                                            qeth_qdio_input_handler;
3520         init_data.output_handler         = (qdio_handler_t *)
3521                                            qeth_qdio_output_handler;
3522         init_data.int_parm               = (unsigned long) card;
3523         init_data.flags                  = QDIO_INBOUND_0COPY_SBALS |
3524                                            QDIO_OUTBOUND_0COPY_SBALS |
3525                                            QDIO_USE_OUTBOUND_PCIS;
3526         init_data.input_sbal_addr_array  = (void **) in_sbal_ptrs;
3527         init_data.output_sbal_addr_array = (void **) out_sbal_ptrs;
3528
3529         if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED,
3530                 QETH_QDIO_ESTABLISHED) == QETH_QDIO_ALLOCATED)
3531                 if ((rc = qdio_initialize(&init_data)))
3532                         atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
3533
3534         kfree(out_sbal_ptrs);
3535         kfree(in_sbal_ptrs);
3536         kfree(qib_param_field);
3537         return rc;
3538 }
3539
3540 static int
3541 qeth_qdio_activate(struct qeth_card *card)
3542 {
3543         QETH_DBF_TEXT(setup,3,"qdioact");
3544         return qdio_activate(CARD_DDEV(card), 0);
3545 }
3546
3547 static int
3548 qeth_clear_channel(struct qeth_channel *channel)
3549 {
3550         unsigned long flags;
3551         struct qeth_card *card;
3552         int rc;
3553
3554         QETH_DBF_TEXT(trace,3,"clearch");
3555         card = CARD_FROM_CDEV(channel->ccwdev);
3556         spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
3557         rc = ccw_device_clear(channel->ccwdev, QETH_CLEAR_CHANNEL_PARM);
3558         spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
3559
3560         if (rc)
3561                 return rc;
3562         rc = wait_event_interruptible_timeout(card->wait_q,
3563                         channel->state==CH_STATE_STOPPED, QETH_TIMEOUT);
3564         if (rc == -ERESTARTSYS)
3565                 return rc;
3566         if (channel->state != CH_STATE_STOPPED)
3567                 return -ETIME;
3568         channel->state = CH_STATE_DOWN;
3569         return 0;
3570 }
3571
3572 static int
3573 qeth_halt_channel(struct qeth_channel *channel)
3574 {
3575         unsigned long flags;
3576         struct qeth_card *card;
3577         int rc;
3578
3579         QETH_DBF_TEXT(trace,3,"haltch");
3580         card = CARD_FROM_CDEV(channel->ccwdev);
3581         spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
3582         rc = ccw_device_halt(channel->ccwdev, QETH_HALT_CHANNEL_PARM);
3583         spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
3584
3585         if (rc)
3586                 return rc;
3587         rc = wait_event_interruptible_timeout(card->wait_q,
3588                         channel->state==CH_STATE_HALTED, QETH_TIMEOUT);
3589         if (rc == -ERESTARTSYS)
3590                 return rc;
3591         if (channel->state != CH_STATE_HALTED)
3592                 return -ETIME;
3593         return 0;
3594 }
3595
3596 static int
3597 qeth_halt_channels(struct qeth_card *card)
3598 {
3599         int rc1 = 0, rc2=0, rc3 = 0;
3600
3601         QETH_DBF_TEXT(trace,3,"haltchs");
3602         rc1 = qeth_halt_channel(&card->read);
3603         rc2 = qeth_halt_channel(&card->write);
3604         rc3 = qeth_halt_channel(&card->data);
3605         if (rc1)
3606                 return rc1;
3607         if (rc2)
3608                 return rc2;
3609         return rc3;
3610 }
3611 static int
3612 qeth_clear_channels(struct qeth_card *card)
3613 {
3614         int rc1 = 0, rc2=0, rc3 = 0;
3615
3616         QETH_DBF_TEXT(trace,3,"clearchs");
3617         rc1 = qeth_clear_channel(&card->read);
3618         rc2 = qeth_clear_channel(&card->write);
3619         rc3 = qeth_clear_channel(&card->data);
3620         if (rc1)
3621                 return rc1;
3622         if (rc2)
3623                 return rc2;
3624         return rc3;
3625 }
3626
3627 static int
3628 qeth_clear_halt_card(struct qeth_card *card, int halt)
3629 {
3630         int rc = 0;
3631
3632         QETH_DBF_TEXT(trace,3,"clhacrd");
3633         QETH_DBF_HEX(trace, 3, &card, sizeof(void *));
3634
3635         if (halt)
3636                 rc = qeth_halt_channels(card);
3637         if (rc)
3638                 return rc;
3639         return qeth_clear_channels(card);
3640 }
3641
3642 static int
3643 qeth_qdio_clear_card(struct qeth_card *card, int use_halt)
3644 {
3645         int rc = 0;
3646
3647         QETH_DBF_TEXT(trace,3,"qdioclr");
3648         switch (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ESTABLISHED,
3649                 QETH_QDIO_CLEANING)) {
3650         case QETH_QDIO_ESTABLISHED:
3651                 if ((rc = qdio_cleanup(CARD_DDEV(card),
3652                                 (card->info.type == QETH_CARD_TYPE_IQD) ?
3653                                 QDIO_FLAG_CLEANUP_USING_HALT :
3654                                 QDIO_FLAG_CLEANUP_USING_CLEAR)))
3655                         QETH_DBF_TEXT_(trace, 3, "1err%d", rc);
3656                 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
3657                 break;
3658         case QETH_QDIO_CLEANING:
3659                 return rc;
3660         default:
3661                 break;
3662         }
3663         if ((rc = qeth_clear_halt_card(card, use_halt)))
3664                 QETH_DBF_TEXT_(trace, 3, "2err%d", rc);
3665         card->state = CARD_STATE_DOWN;
3666         return rc;
3667 }
3668
3669 static int
3670 qeth_dm_act(struct qeth_card *card)
3671 {
3672         int rc;
3673         struct qeth_cmd_buffer *iob;
3674
3675         QETH_DBF_TEXT(setup,2,"dmact");
3676
3677         iob = qeth_wait_for_buffer(&card->write);
3678         memcpy(iob->data, DM_ACT, DM_ACT_SIZE);
3679
3680         memcpy(QETH_DM_ACT_DEST_ADDR(iob->data),
3681                &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
3682         memcpy(QETH_DM_ACT_CONNECTION_TOKEN(iob->data),
3683                &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
3684         rc = qeth_send_control_data(card, DM_ACT_SIZE, iob, NULL, NULL);
3685         return rc;
3686 }
3687
3688 static int
3689 qeth_mpc_initialize(struct qeth_card *card)
3690 {
3691         int rc;
3692
3693         QETH_DBF_TEXT(setup,2,"mpcinit");
3694
3695         if ((rc = qeth_issue_next_read(card))){
3696                 QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
3697                 return rc;
3698         }
3699         if ((rc = qeth_cm_enable(card))){
3700                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
3701                 goto out_qdio;
3702         }
3703         if ((rc = qeth_cm_setup(card))){
3704                 QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
3705                 goto out_qdio;
3706         }
3707         if ((rc = qeth_ulp_enable(card))){
3708                 QETH_DBF_TEXT_(setup, 2, "4err%d", rc);
3709                 goto out_qdio;
3710         }
3711         if ((rc = qeth_ulp_setup(card))){
3712                 QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
3713                 goto out_qdio;
3714         }
3715         if ((rc = qeth_alloc_qdio_buffers(card))){
3716                 QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
3717                 goto out_qdio;
3718         }
3719         if ((rc = qeth_qdio_establish(card))){
3720                 QETH_DBF_TEXT_(setup, 2, "6err%d", rc);
3721                 qeth_free_qdio_buffers(card);
3722                 goto out_qdio;
3723         }
3724         if ((rc = qeth_qdio_activate(card))){
3725                 QETH_DBF_TEXT_(setup, 2, "7err%d", rc);
3726                 goto out_qdio;
3727         }
3728         if ((rc = qeth_dm_act(card))){
3729                 QETH_DBF_TEXT_(setup, 2, "8err%d", rc);
3730                 goto out_qdio;
3731         }
3732
3733         return 0;
3734 out_qdio:
3735         qeth_qdio_clear_card(card, card->info.type!=QETH_CARD_TYPE_IQD);
3736         return rc;
3737 }
3738
3739 static struct net_device *
3740 qeth_get_netdevice(enum qeth_card_types type, enum qeth_link_types linktype)
3741 {
3742         struct net_device *dev = NULL;
3743
3744         switch (type) {
3745         case QETH_CARD_TYPE_OSAE:
3746                 switch (linktype) {
3747                 case QETH_LINK_TYPE_LANE_TR:
3748                 case QETH_LINK_TYPE_HSTR:
3749 #ifdef CONFIG_TR
3750                         dev = alloc_trdev(0);
3751 #endif /* CONFIG_TR */
3752                         break;
3753                 default:
3754                         dev = alloc_etherdev(0);
3755                 }
3756                 break;
3757         case QETH_CARD_TYPE_IQD:
3758                 dev = alloc_netdev(0, "hsi%d", ether_setup);
3759                 break;
3760         case QETH_CARD_TYPE_OSN:
3761                 dev = alloc_netdev(0, "osn%d", ether_setup);
3762                 break;
3763         default:
3764                 dev = alloc_etherdev(0);
3765         }
3766         return dev;
3767 }
3768
3769 /*hard_header fake function; used in case fake_ll is set */
3770 static int
3771 qeth_fake_header(struct sk_buff *skb, struct net_device *dev,
3772                      unsigned short type, void *daddr, void *saddr,
3773                      unsigned len)
3774 {
3775         if(dev->type == ARPHRD_IEEE802_TR){
3776                 struct trh_hdr *hdr;
3777                 hdr = (struct trh_hdr *)skb_push(skb, QETH_FAKE_LL_LEN_TR);
3778                 memcpy(hdr->saddr, dev->dev_addr, TR_ALEN);
3779                 memcpy(hdr->daddr, "FAKELL", TR_ALEN);
3780                 return QETH_FAKE_LL_LEN_TR;
3781
3782         } else {
3783                 struct ethhdr *hdr;
3784                 hdr = (struct ethhdr *)skb_push(skb, QETH_FAKE_LL_LEN_ETH);
3785                 memcpy(hdr->h_source, dev->dev_addr, ETH_ALEN);
3786                 memcpy(hdr->h_dest, "FAKELL", ETH_ALEN);
3787                 if (type != ETH_P_802_3)
3788                         hdr->h_proto = htons(type);
3789                 else
3790                         hdr->h_proto = htons(len);
3791                 return QETH_FAKE_LL_LEN_ETH;
3792
3793         }
3794 }
3795
3796 static int
3797 qeth_send_packet(struct qeth_card *, struct sk_buff *);
3798
3799 static int
3800 qeth_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
3801 {
3802         int rc;
3803         struct qeth_card *card;
3804
3805         QETH_DBF_TEXT(trace, 6, "hrdstxmi");
3806         card = (struct qeth_card *)dev->priv;
3807         if (skb==NULL) {
3808                 card->stats.tx_dropped++;
3809                 card->stats.tx_errors++;
3810                 /* return OK; otherwise ksoftirqd goes to 100% */
3811                 return NETDEV_TX_OK;
3812         }
3813         if ((card->state != CARD_STATE_UP) || !card->lan_online) {
3814                 card->stats.tx_dropped++;
3815                 card->stats.tx_errors++;
3816                 card->stats.tx_carrier_errors++;
3817                 dev_kfree_skb_any(skb);
3818                 /* return OK; otherwise ksoftirqd goes to 100% */
3819                 return NETDEV_TX_OK;
3820         }
3821         if (card->options.performance_stats) {
3822                 card->perf_stats.outbound_cnt++;
3823                 card->perf_stats.outbound_start_time = qeth_get_micros();
3824         }
3825         netif_stop_queue(dev);
3826         if ((rc = qeth_send_packet(card, skb))) {
3827                 if (rc == -EBUSY) {
3828                         return NETDEV_TX_BUSY;
3829                 } else {
3830                         card->stats.tx_errors++;
3831                         card->stats.tx_dropped++;
3832                         dev_kfree_skb_any(skb);
3833                         /*set to OK; otherwise ksoftirqd goes to 100% */
3834                         rc = NETDEV_TX_OK;
3835                 }
3836         }
3837         netif_wake_queue(dev);
3838         if (card->options.performance_stats)
3839                 card->perf_stats.outbound_time += qeth_get_micros() -
3840                         card->perf_stats.outbound_start_time;
3841         return rc;
3842 }
3843
3844 static int
3845 qeth_verify_vlan_dev(struct net_device *dev, struct qeth_card *card)
3846 {
3847         int rc = 0;
3848 #ifdef CONFIG_QETH_VLAN
3849         struct vlan_group *vg;
3850         int i;
3851
3852         if (!(vg = card->vlangrp))
3853                 return rc;
3854
3855         for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++){
3856                 if (vlan_group_get_device(vg, i) == dev){
3857                         rc = QETH_VLAN_CARD;
3858                         break;
3859                 }
3860         }
3861         if (rc && !(VLAN_DEV_INFO(dev)->real_dev->priv == (void *)card))
3862                 return 0;
3863
3864 #endif
3865         return rc;
3866 }
3867
3868 static int
3869 qeth_verify_dev(struct net_device *dev)
3870 {
3871         struct qeth_card *card;
3872         unsigned long flags;
3873         int rc = 0;
3874
3875         read_lock_irqsave(&qeth_card_list.rwlock, flags);
3876         list_for_each_entry(card, &qeth_card_list.list, list){
3877                 if (card->dev == dev){
3878                         rc = QETH_REAL_CARD;
3879                         break;
3880                 }
3881                 rc = qeth_verify_vlan_dev(dev, card);
3882                 if (rc)
3883                         break;
3884         }
3885         read_unlock_irqrestore(&qeth_card_list.rwlock, flags);
3886
3887         return rc;
3888 }
3889
3890 static struct qeth_card *
3891 qeth_get_card_from_dev(struct net_device *dev)
3892 {
3893         struct qeth_card *card = NULL;
3894         int rc;
3895
3896         rc = qeth_verify_dev(dev);
3897         if (rc == QETH_REAL_CARD)
3898                 card = (struct qeth_card *)dev->priv;
3899         else if (rc == QETH_VLAN_CARD)
3900                 card = (struct qeth_card *)
3901                         VLAN_DEV_INFO(dev)->real_dev->priv;
3902
3903         QETH_DBF_TEXT_(trace, 4, "%d", rc);
3904         return card ;
3905 }
3906
3907 static void
3908 qeth_tx_timeout(struct net_device *dev)
3909 {
3910         struct qeth_card *card;
3911
3912         card = (struct qeth_card *) dev->priv;
3913         card->stats.tx_errors++;
3914         qeth_schedule_recovery(card);
3915 }
3916
3917 static int
3918 qeth_open(struct net_device *dev)
3919 {
3920         struct qeth_card *card;
3921
3922         QETH_DBF_TEXT(trace, 4, "qethopen");
3923
3924         card = (struct qeth_card *) dev->priv;
3925
3926         if (card->state != CARD_STATE_SOFTSETUP)
3927                 return -ENODEV;
3928
3929         if ( (card->info.type != QETH_CARD_TYPE_OSN) &&
3930              (card->options.layer2) &&
3931              (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))) {
3932                 QETH_DBF_TEXT(trace,4,"nomacadr");
3933                 return -EPERM;
3934         }
3935         card->data.state = CH_STATE_UP;
3936         card->state = CARD_STATE_UP;
3937         card->dev->flags |= IFF_UP;
3938         netif_start_queue(dev);
3939
3940         if (!card->lan_online && netif_carrier_ok(dev))
3941                 netif_carrier_off(dev);
3942         return 0;
3943 }
3944
3945 static int
3946 qeth_stop(struct net_device *dev)
3947 {
3948         struct qeth_card *card;
3949
3950         QETH_DBF_TEXT(trace, 4, "qethstop");
3951
3952         card = (struct qeth_card *) dev->priv;
3953
3954         netif_tx_disable(dev);
3955         card->dev->flags &= ~IFF_UP;
3956         if (card->state == CARD_STATE_UP)
3957                 card->state = CARD_STATE_SOFTSETUP;
3958         return 0;
3959 }
3960
3961 static int
3962 qeth_get_cast_type(struct qeth_card *card, struct sk_buff *skb)
3963 {
3964         int cast_type = RTN_UNSPEC;
3965
3966         if (card->info.type == QETH_CARD_TYPE_OSN)
3967                 return cast_type;
3968
3969         if (skb->dst && skb->dst->neighbour){
3970                 cast_type = skb->dst->neighbour->type;
3971                 if ((cast_type == RTN_BROADCAST) ||
3972                     (cast_type == RTN_MULTICAST) ||
3973                     (cast_type == RTN_ANYCAST))
3974                         return cast_type;
3975                 else
3976                         return RTN_UNSPEC;
3977         }
3978         /* try something else */
3979         if (skb->protocol == ETH_P_IPV6)
3980                 return (skb_network_header(skb)[24] == 0xff) ?
3981                                 RTN_MULTICAST : 0;
3982         else if (skb->protocol == ETH_P_IP)
3983                 return ((skb_network_header(skb)[16] & 0xf0) == 0xe0) ?
3984                                 RTN_MULTICAST : 0;
3985         /* ... */
3986         if (!memcmp(skb->data, skb->dev->broadcast, 6))
3987                 return RTN_BROADCAST;
3988         else {
3989                 u16 hdr_mac;
3990
3991                 hdr_mac = *((u16 *)skb->data);
3992                 /* tr multicast? */
3993                 switch (card->info.link_type) {
3994                 case QETH_LINK_TYPE_HSTR:
3995                 case QETH_LINK_TYPE_LANE_TR:
3996                         if ((hdr_mac == QETH_TR_MAC_NC) ||
3997                             (hdr_mac == QETH_TR_MAC_C))
3998                                 return RTN_MULTICAST;
3999                         break;
4000                 /* eth or so multicast? */
4001                 default:
4002                         if ((hdr_mac == QETH_ETH_MAC_V4) ||
4003                             (hdr_mac == QETH_ETH_MAC_V6))
4004                                 return RTN_MULTICAST;
4005                 }
4006         }
4007         return cast_type;
4008 }
4009
4010 static int
4011 qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb,
4012                         int ipv, int cast_type)
4013 {
4014         if (!ipv && (card->info.type == QETH_CARD_TYPE_OSAE))
4015                 return card->qdio.default_out_queue;
4016         switch (card->qdio.no_out_queues) {
4017         case 4:
4018                 if (cast_type && card->info.is_multicast_different)
4019                         return card->info.is_multicast_different &
4020                                 (card->qdio.no_out_queues - 1);
4021                 if (card->qdio.do_prio_queueing && (ipv == 4)) {
4022                         const u8 tos = ip_hdr(skb)->tos;
4023
4024                         if (card->qdio.do_prio_queueing==QETH_PRIO_Q_ING_TOS){
4025                                 if (tos & IP_TOS_NOTIMPORTANT)
4026                                         return 3;
4027                                 if (tos & IP_TOS_HIGHRELIABILITY)
4028                                         return 2;
4029                                 if (tos & IP_TOS_HIGHTHROUGHPUT)
4030                                         return 1;
4031                                 if (tos & IP_TOS_LOWDELAY)
4032                                         return 0;
4033                         }
4034                         if (card->qdio.do_prio_queueing==QETH_PRIO_Q_ING_PREC)
4035                                 return 3 - (tos >> 6);
4036                 } else if (card->qdio.do_prio_queueing && (ipv == 6)) {
4037                         /* TODO: IPv6!!! */
4038                 }
4039                 return card->qdio.default_out_queue;
4040         case 1: /* fallthrough for single-out-queue 1920-device */
4041         default:
4042                 return card->qdio.default_out_queue;
4043         }
4044 }
4045
4046 static inline int
4047 qeth_get_ip_version(struct sk_buff *skb)
4048 {
4049         switch (skb->protocol) {
4050         case ETH_P_IPV6:
4051                 return 6;
4052         case ETH_P_IP:
4053                 return 4;
4054         default:
4055                 return 0;
4056         }
4057 }
4058
4059 static struct qeth_hdr *
4060 __qeth_prepare_skb(struct qeth_card *card, struct sk_buff *skb, int ipv)
4061 {
4062 #ifdef CONFIG_QETH_VLAN
4063         u16 *tag;
4064         if (card->vlangrp && vlan_tx_tag_present(skb) &&
4065             ((ipv == 6) || card->options.layer2) ) {
4066                 /*
4067                  * Move the mac addresses (6 bytes src, 6 bytes dest)
4068                  * to the beginning of the new header.  We are using three
4069                  * memcpys instead of one memmove to save cycles.
4070                  */
4071                 skb_push(skb, VLAN_HLEN);
4072                 skb_copy_to_linear_data(skb, skb->data + 4, 4);
4073                 skb_copy_to_linear_data_offset(skb, 4, skb->data + 8, 4);
4074                 skb_copy_to_linear_data_offset(skb, 8, skb->data + 12, 4);
4075                 tag = (u16 *)(skb->data + 12);
4076                 /*
4077                  * first two bytes  = ETH_P_8021Q (0x8100)
4078                  * second two bytes = VLANID
4079                  */
4080                 *tag = __constant_htons(ETH_P_8021Q);
4081                 *(tag + 1) = htons(vlan_tx_tag_get(skb));
4082         }
4083 #endif
4084         return ((struct qeth_hdr *)
4085                 qeth_push_skb(card, skb, sizeof(struct qeth_hdr)));
4086 }
4087
4088 static void
4089 __qeth_free_new_skb(struct sk_buff *orig_skb, struct sk_buff *new_skb)
4090 {
4091         if (orig_skb != new_skb)
4092                 dev_kfree_skb_any(new_skb);
4093 }
4094
4095 static struct sk_buff *
4096 qeth_prepare_skb(struct qeth_card *card, struct sk_buff *skb,
4097                  struct qeth_hdr **hdr, int ipv)
4098 {
4099         struct sk_buff *new_skb, *new_skb2;
4100         
4101         QETH_DBF_TEXT(trace, 6, "prepskb");
4102         new_skb = skb;
4103         new_skb = qeth_pskb_unshare(skb, GFP_ATOMIC);
4104         if (!new_skb)
4105                 return NULL;
4106         new_skb2 = qeth_realloc_headroom(card, new_skb,
4107                                          sizeof(struct qeth_hdr));
4108         if (!new_skb2) {
4109                 __qeth_free_new_skb(skb, new_skb);
4110                 return NULL;
4111         }
4112         if (new_skb != skb)
4113                 __qeth_free_new_skb(new_skb2, new_skb);
4114         new_skb = new_skb2;
4115         *hdr = __qeth_prepare_skb(card, new_skb, ipv);
4116         if (*hdr == NULL) {
4117                 __qeth_free_new_skb(skb, new_skb);
4118                 return NULL;
4119         }
4120         return new_skb;
4121 }
4122
4123 static inline u8
4124 qeth_get_qeth_hdr_flags4(int cast_type)
4125 {
4126         if (cast_type == RTN_MULTICAST)
4127                 return QETH_CAST_MULTICAST;
4128         if (cast_type == RTN_BROADCAST)
4129                 return QETH_CAST_BROADCAST;
4130         return QETH_CAST_UNICAST;
4131 }
4132
4133 static inline u8
4134 qeth_get_qeth_hdr_flags6(int cast_type)
4135 {
4136         u8 ct = QETH_HDR_PASSTHRU | QETH_HDR_IPV6;
4137         if (cast_type == RTN_MULTICAST)
4138                 return ct | QETH_CAST_MULTICAST;
4139         if (cast_type == RTN_ANYCAST)
4140                 return ct | QETH_CAST_ANYCAST;
4141         if (cast_type == RTN_BROADCAST)
4142                 return ct | QETH_CAST_BROADCAST;
4143         return ct | QETH_CAST_UNICAST;
4144 }
4145
4146 static void
4147 qeth_layer2_get_packet_type(struct qeth_card *card, struct qeth_hdr *hdr,
4148                             struct sk_buff *skb)
4149 {
4150         __u16 hdr_mac;
4151
4152         if (!memcmp(skb->data+QETH_HEADER_SIZE,
4153                     skb->dev->broadcast,6)) { /* broadcast? */
4154                 *(__u32 *)hdr->hdr.l2.flags |=
4155                          QETH_LAYER2_FLAG_BROADCAST << 8;
4156                 return;
4157         }
4158         hdr_mac=*((__u16*)skb->data);
4159         /* tr multicast? */
4160         switch (card->info.link_type) {
4161         case QETH_LINK_TYPE_HSTR:
4162         case QETH_LINK_TYPE_LANE_TR:
4163                 if ((hdr_mac == QETH_TR_MAC_NC) ||
4164                     (hdr_mac == QETH_TR_MAC_C) )
4165                         *(__u32 *)hdr->hdr.l2.flags |=
4166                                 QETH_LAYER2_FLAG_MULTICAST << 8;
4167                 else
4168                         *(__u32 *)hdr->hdr.l2.flags |=
4169                                 QETH_LAYER2_FLAG_UNICAST << 8;
4170                 break;
4171                 /* eth or so multicast? */
4172         default:
4173                 if ( (hdr_mac==QETH_ETH_MAC_V4) ||
4174                      (hdr_mac==QETH_ETH_MAC_V6) )
4175                         *(__u32 *)hdr->hdr.l2.flags |=
4176                                 QETH_LAYER2_FLAG_MULTICAST << 8;
4177                 else
4178                         *(__u32 *)hdr->hdr.l2.flags |=
4179                                 QETH_LAYER2_FLAG_UNICAST << 8;
4180         }
4181 }
4182
4183 static void
4184 qeth_layer2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
4185                         struct sk_buff *skb, int cast_type)
4186 {
4187         memset(hdr, 0, sizeof(struct qeth_hdr));
4188         hdr->hdr.l2.id = QETH_HEADER_TYPE_LAYER2;
4189
4190         /* set byte 0 to "0x02" and byte 3 to casting flags */
4191         if (cast_type==RTN_MULTICAST)
4192                 *(__u32 *)hdr->hdr.l2.flags |= QETH_LAYER2_FLAG_MULTICAST << 8;
4193         else if (cast_type==RTN_BROADCAST)
4194                 *(__u32 *)hdr->hdr.l2.flags |= QETH_LAYER2_FLAG_BROADCAST << 8;
4195          else
4196                 qeth_layer2_get_packet_type(card, hdr, skb);
4197
4198         hdr->hdr.l2.pkt_length = skb->len-QETH_HEADER_SIZE;
4199 #ifdef CONFIG_QETH_VLAN
4200         /* VSWITCH relies on the VLAN
4201          * information to be present in
4202          * the QDIO header */
4203         if ((card->vlangrp != NULL) &&
4204             vlan_tx_tag_present(skb)) {
4205                 *(__u32 *)hdr->hdr.l2.flags |= QETH_LAYER2_FLAG_VLAN << 8;
4206                 hdr->hdr.l2.vlan_id = vlan_tx_tag_get(skb);
4207         }
4208 #endif
4209 }
4210
4211 void
4212 qeth_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
4213                 struct sk_buff *skb, int ipv, int cast_type)
4214 {
4215         QETH_DBF_TEXT(trace, 6, "fillhdr");
4216
4217         memset(hdr, 0, sizeof(struct qeth_hdr));
4218         if (card->options.layer2) {
4219                 qeth_layer2_fill_header(card, hdr, skb, cast_type);
4220                 return;
4221         }
4222         hdr->hdr.l3.id = QETH_HEADER_TYPE_LAYER3;
4223         hdr->hdr.l3.ext_flags = 0;
4224 #ifdef CONFIG_QETH_VLAN
4225         /*
4226          * before we're going to overwrite this location with next hop ip.
4227          * v6 uses passthrough, v4 sets the tag in the QDIO header.
4228          */
4229         if (card->vlangrp && vlan_tx_tag_present(skb)) {
4230                 hdr->hdr.l3.ext_flags = (ipv == 4) ?
4231                         QETH_HDR_EXT_VLAN_FRAME :
4232                         QETH_HDR_EXT_INCLUDE_VLAN_TAG;
4233                 hdr->hdr.l3.vlan_id = vlan_tx_tag_get(skb);
4234         }
4235 #endif /* CONFIG_QETH_VLAN */
4236         hdr->hdr.l3.length = skb->len - sizeof(struct qeth_hdr);
4237         if (ipv == 4) {  /* IPv4 */
4238                 hdr->hdr.l3.flags = qeth_get_qeth_hdr_flags4(cast_type);
4239                 memset(hdr->hdr.l3.dest_addr, 0, 12);
4240                 if ((skb->dst) && (skb->dst->neighbour)) {
4241                         *((u32 *) (&hdr->hdr.l3.dest_addr[12])) =
4242                             *((u32 *) skb->dst->neighbour->primary_key);
4243                 } else {
4244                         /* fill in destination address used in ip header */
4245                         *((u32 *)(&hdr->hdr.l3.dest_addr[12])) =
4246                                                            ip_hdr(skb)->daddr;
4247                 }
4248         } else if (ipv == 6) { /* IPv6 or passthru */
4249                 hdr->hdr.l3.flags = qeth_get_qeth_hdr_flags6(cast_type);
4250                 if ((skb->dst) && (skb->dst->neighbour)) {
4251                         memcpy(hdr->hdr.l3.dest_addr,
4252                                skb->dst->neighbour->primary_key, 16);
4253                 } else {
4254                         /* fill in destination address used in ip header */
4255                         memcpy(hdr->hdr.l3.dest_addr,
4256                                &ipv6_hdr(skb)->daddr, 16);
4257                 }
4258         } else { /* passthrough */
4259                 if((skb->dev->type == ARPHRD_IEEE802_TR) &&
4260                     !memcmp(skb->data + sizeof(struct qeth_hdr) +
4261                     sizeof(__u16), skb->dev->broadcast, 6)) {
4262                         hdr->hdr.l3.flags = QETH_CAST_BROADCAST |
4263                                                 QETH_HDR_PASSTHRU;
4264                 } else if (!memcmp(skb->data + sizeof(struct qeth_hdr),
4265                             skb->dev->broadcast, 6)) {   /* broadcast? */
4266                         hdr->hdr.l3.flags = QETH_CAST_BROADCAST |
4267                                                 QETH_HDR_PASSTHRU;
4268                 } else {
4269                         hdr->hdr.l3.flags = (cast_type == RTN_MULTICAST) ?
4270                                 QETH_CAST_MULTICAST | QETH_HDR_PASSTHRU :
4271                                 QETH_CAST_UNICAST | QETH_HDR_PASSTHRU;
4272                 }
4273         }
4274 }
4275
4276 static void
4277 __qeth_fill_buffer(struct sk_buff *skb, struct qdio_buffer *buffer,
4278                    int is_tso, int *next_element_to_fill)
4279 {
4280         int length = skb->len;
4281         int length_here;
4282         int element;
4283         char *data;
4284         int first_lap ;
4285
4286         element = *next_element_to_fill;
4287         data = skb->data;
4288         first_lap = (is_tso == 0 ? 1 : 0);
4289
4290         while (length > 0) {
4291                 /* length_here is the remaining amount of data in this page */
4292                 length_here = PAGE_SIZE - ((unsigned long) data % PAGE_SIZE);
4293                 if (length < length_here)
4294                         length_here = length;
4295
4296                 buffer->element[element].addr = data;
4297                 buffer->element[element].length = length_here;
4298                 length -= length_here;
4299                 if (!length) {
4300                         if (first_lap)
4301                                 buffer->element[element].flags = 0;
4302                         else
4303                                 buffer->element[element].flags =
4304                                     SBAL_FLAGS_LAST_FRAG;
4305                 } else {
4306                         if (first_lap)
4307                                 buffer->element[element].flags =
4308                                     SBAL_FLAGS_FIRST_FRAG;
4309                         else
4310                                 buffer->element[element].flags =
4311                                     SBAL_FLAGS_MIDDLE_FRAG;
4312                 }
4313                 data += length_here;
4314                 element++;
4315                 first_lap = 0;
4316         }
4317         *next_element_to_fill = element;
4318 }
4319
4320 static int
4321 qeth_fill_buffer(struct qeth_qdio_out_q *queue,
4322                  struct qeth_qdio_out_buffer *buf,
4323                  struct sk_buff *skb)
4324 {
4325         struct qdio_buffer *buffer;
4326         struct qeth_hdr_tso *hdr;
4327         int flush_cnt = 0, hdr_len, large_send = 0;
4328
4329         QETH_DBF_TEXT(trace, 6, "qdfillbf");
4330
4331         buffer = buf->buffer;
4332         atomic_inc(&skb->users);
4333         skb_queue_tail(&buf->skb_list, skb);
4334
4335         hdr  = (struct qeth_hdr_tso *) skb->data;
4336         /*check first on TSO ....*/
4337         if (hdr->hdr.hdr.l3.id == QETH_HEADER_TYPE_TSO) {
4338                 int element = buf->next_element_to_fill;
4339
4340                 hdr_len = sizeof(struct qeth_hdr_tso) + hdr->ext.dg_hdr_len;
4341                 /*fill first buffer entry only with header information */
4342                 buffer->element[element].addr = skb->data;
4343                 buffer->element[element].length = hdr_len;
4344                 buffer->element[element].flags = SBAL_FLAGS_FIRST_FRAG;
4345                 buf->next_element_to_fill++;
4346                 skb->data += hdr_len;
4347                 skb->len  -= hdr_len;
4348                 large_send = 1;
4349         }
4350         if (skb_shinfo(skb)->nr_frags == 0)
4351                 __qeth_fill_buffer(skb, buffer, large_send,
4352                                    (int *)&buf->next_element_to_fill);
4353         else
4354                 __qeth_fill_buffer_frag(skb, buffer, large_send,
4355                                         (int *)&buf->next_element_to_fill);
4356
4357         if (!queue->do_pack) {
4358                 QETH_DBF_TEXT(trace, 6, "fillbfnp");
4359                 /* set state to PRIMED -> will be flushed */
4360                 atomic_set(&buf->state, QETH_QDIO_BUF_PRIMED);
4361                 flush_cnt = 1;
4362         } else {
4363                 QETH_DBF_TEXT(trace, 6, "fillbfpa");
4364                 if (queue->card->options.performance_stats)
4365                         queue->card->perf_stats.skbs_sent_pack++;
4366                 if (buf->next_element_to_fill >=
4367                                 QETH_MAX_BUFFER_ELEMENTS(queue->card)) {
4368                         /*
4369                          * packed buffer if full -> set state PRIMED
4370                          * -> will be flushed
4371                          */
4372                         atomic_set(&buf->state, QETH_QDIO_BUF_PRIMED);
4373                         flush_cnt = 1;
4374                 }
4375         }
4376         return flush_cnt;
4377 }
4378
4379 static int
4380 qeth_do_send_packet_fast(struct qeth_card *card, struct qeth_qdio_out_q *queue,
4381                          struct sk_buff *skb, struct qeth_hdr *hdr,
4382                          int elements_needed,
4383                          struct qeth_eddp_context *ctx)
4384 {
4385         struct qeth_qdio_out_buffer *buffer;
4386         int buffers_needed = 0;
4387         int flush_cnt = 0;
4388         int index;
4389
4390         QETH_DBF_TEXT(trace, 6, "dosndpfa");
4391
4392         /* spin until we get the queue ... */
4393         while (atomic_cmpxchg(&queue->state, QETH_OUT_Q_UNLOCKED,
4394                               QETH_OUT_Q_LOCKED) != QETH_OUT_Q_UNLOCKED);
4395         /* ... now we've got the queue */
4396         index = queue->next_buf_to_fill;
4397         buffer = &queue->bufs[queue->next_buf_to_fill];
4398         /*
4399          * check if buffer is empty to make sure that we do not 'overtake'
4400          * ourselves and try to fill a buffer that is already primed
4401          */
4402         if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY) 
4403                 goto out;
4404         if (ctx == NULL)
4405                 queue->next_buf_to_fill = (queue->next_buf_to_fill + 1) %
4406                                           QDIO_MAX_BUFFERS_PER_Q;
4407         else {
4408                 buffers_needed = qeth_eddp_check_buffers_for_context(queue,ctx);
4409                 if (buffers_needed < 0) 
4410                         goto out;
4411                 queue->next_buf_to_fill =
4412                         (queue->next_buf_to_fill + buffers_needed) %
4413                         QDIO_MAX_BUFFERS_PER_Q;
4414         }
4415         atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
4416         if (ctx == NULL) {
4417                 qeth_fill_buffer(queue, buffer, skb);
4418                 qeth_flush_buffers(queue, 0, index, 1);
4419         } else {
4420                 flush_cnt = qeth_eddp_fill_buffer(queue, ctx, index);
4421                 WARN_ON(buffers_needed != flush_cnt);
4422                 qeth_flush_buffers(queue, 0, index, flush_cnt);
4423         }
4424         return 0;
4425 out:
4426         atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
4427         return -EBUSY;
4428 }
4429
4430 static int
4431 qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
4432                     struct sk_buff *skb, struct qeth_hdr *hdr,
4433                     int elements_needed, struct qeth_eddp_context *ctx)
4434 {
4435         struct qeth_qdio_out_buffer *buffer;
4436         int start_index;
4437         int flush_count = 0;
4438         int do_pack = 0;
4439         int tmp;
4440         int rc = 0;
4441
4442         QETH_DBF_TEXT(trace, 6, "dosndpkt");
4443
4444         /* spin until we get the queue ... */
4445         while (atomic_cmpxchg(&queue->state, QETH_OUT_Q_UNLOCKED,
4446                               QETH_OUT_Q_LOCKED) != QETH_OUT_Q_UNLOCKED);
4447         start_index = queue->next_buf_to_fill;
4448         buffer = &queue->bufs[queue->next_buf_to_fill];
4449         /*
4450          * check if buffer is empty to make sure that we do not 'overtake'
4451          * ourselves and try to fill a buffer that is already primed
4452          */
4453         if (atomic_read(&buffer->state) != QETH_QDIO_BUF_EMPTY) {
4454                 atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
4455                 return -EBUSY;
4456         }
4457         /* check if we need to switch packing state of this queue */
4458         qeth_switch_to_packing_if_needed(queue);
4459         if (queue->do_pack){
4460                 do_pack = 1;
4461                 if (ctx == NULL) {
4462                         /* does packet fit in current buffer? */
4463                         if((QETH_MAX_BUFFER_ELEMENTS(card) -
4464                             buffer->next_element_to_fill) < elements_needed){
4465                                 /* ... no -> set state PRIMED */
4466                                 atomic_set(&buffer->state,QETH_QDIO_BUF_PRIMED);
4467                                 flush_count++;
4468                                 queue->next_buf_to_fill =
4469                                         (queue->next_buf_to_fill + 1) %
4470                                         QDIO_MAX_BUFFERS_PER_Q;
4471                                 buffer = &queue->bufs[queue->next_buf_to_fill];
4472                                 /* we did a step forward, so check buffer state
4473                                  * again */
4474                                 if (atomic_read(&buffer->state) !=
4475                                                 QETH_QDIO_BUF_EMPTY){
4476                                         qeth_flush_buffers(queue, 0, start_index, flush_count);
4477                                         atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED);
4478                                         return -EBUSY;
4479                                 }
4480                         }
4481                 } else {
4482                         /* check if we have enough elements (including following
4483                          * free buffers) to handle eddp context */
4484                         if (qeth_eddp_check_buffers_for_context(queue,ctx) < 0){
4485                                 printk("eddp tx_dropped 1\n");
4486                                 rc = -EBUSY;
4487                                 goto out;
4488                         }
4489                 }
4490         }
4491         if (ctx == NULL)
4492                 tmp = qeth_fill_buffer(queue, buffer, skb);
4493         else {
4494                 tmp = qeth_eddp_fill_buffer(queue,ctx,queue->next_buf_to_fill);
4495                 if (tmp < 0) {
4496                         printk("eddp tx_dropped 2\n");
4497                         rc = - EBUSY;
4498                         goto out;
4499                 }
4500         }
4501         queue->next_buf_to_fill = (queue->next_buf_to_fill + tmp) %
4502                                   QDIO_MAX_BUFFERS_PER_Q;
4503         flush_count += tmp;
4504 out:
4505         if (flush_count)
4506                 qeth_flush_buffers(queue, 0, start_index, flush_count);
4507         else if (!atomic_read(&queue->set_pci_flags_count))
4508                 atomic_xchg(&queue->state, QETH_OUT_Q_LOCKED_FLUSH);
4509         /*
4510          * queue->state will go from LOCKED -> UNLOCKED or from
4511          * LOCKED_FLUSH -> LOCKED if output_handler wanted to 'notify' us
4512          * (switch packing state or flush buffer to get another pci flag out).
4513          * In that case we will enter this loop
4514          */
4515         while (atomic_dec_return(&queue->state)){
4516                 flush_count = 0;
4517                 start_index = queue->next_buf_to_fill;
4518                 /* check if we can go back to non-packing state */
4519                 flush_count += qeth_switch_to_nonpacking_if_needed(queue);
4520                 /*
4521                  * check if we need to flush a packing buffer to get a pci
4522                  * flag out on the queue
4523                  */
4524                 if (!flush_count && !atomic_read(&queue->set_pci_flags_count))
4525                         flush_count += qeth_flush_buffers_on_no_pci(queue);
4526                 if (flush_count)
4527                         qeth_flush_buffers(queue, 0, start_index, flush_count);
4528         }
4529         /* at this point the queue is UNLOCKED again */
4530         if (queue->card->options.performance_stats && do_pack)
4531                 queue->card->perf_stats.bufs_sent_pack += flush_count;
4532
4533         return rc;
4534 }
4535
4536 static int
4537 qeth_get_elements_no(struct qeth_card *card, void *hdr,
4538                      struct sk_buff *skb, int elems)
4539 {
4540         int elements_needed = 0;
4541
4542         if (skb_shinfo(skb)->nr_frags > 0) 
4543                 elements_needed = (skb_shinfo(skb)->nr_frags + 1);
4544         if (elements_needed == 0)
4545                 elements_needed = 1 + (((((unsigned long) hdr) % PAGE_SIZE)
4546                                         + skb->len) >> PAGE_SHIFT);
4547         if ((elements_needed + elems) > QETH_MAX_BUFFER_ELEMENTS(card)){
4548                 PRINT_ERR("Invalid size of IP packet "
4549                           "(Number=%d / Length=%d). Discarded.\n",
4550                           (elements_needed+elems), skb->len);
4551                 return 0;
4552         }
4553         return elements_needed;
4554 }
4555
4556
4557 static int
4558 qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
4559 {
4560         int ipv = 0;
4561         int cast_type;
4562         struct qeth_qdio_out_q *queue;
4563         struct qeth_hdr *hdr = NULL;
4564         int elements_needed = 0;
4565         enum qeth_large_send_types large_send = QETH_LARGE_SEND_NO;
4566         struct qeth_eddp_context *ctx = NULL;
4567         int tx_bytes = skb->len;
4568         unsigned short nr_frags = skb_shinfo(skb)->nr_frags;
4569         unsigned short tso_size = skb_shinfo(skb)->gso_size;
4570         struct sk_buff *new_skb, *new_skb2;
4571         int rc;
4572
4573         QETH_DBF_TEXT(trace, 6, "sendpkt");
4574
4575         new_skb = skb;
4576         if ((card->info.type == QETH_CARD_TYPE_OSN) &&
4577             (skb->protocol == htons(ETH_P_IPV6)))
4578                 return -EPERM;
4579         cast_type = qeth_get_cast_type(card, skb);
4580         if ((cast_type == RTN_BROADCAST) &&
4581             (card->info.broadcast_capable == 0))
4582                 return -EPERM;
4583         queue = card->qdio.out_qs
4584                 [qeth_get_priority_queue(card, skb, ipv, cast_type)];
4585         if (!card->options.layer2) {
4586                 ipv = qeth_get_ip_version(skb);
4587                 if ((card->dev->hard_header == qeth_fake_header) && ipv) {
4588                         new_skb = qeth_pskb_unshare(skb, GFP_ATOMIC);
4589                         if (!new_skb)
4590                                 return -ENOMEM;
4591                         if(card->dev->type == ARPHRD_IEEE802_TR){
4592                                 skb_pull(new_skb, QETH_FAKE_LL_LEN_TR);
4593                         } else {
4594                                 skb_pull(new_skb, QETH_FAKE_LL_LEN_ETH);
4595                         }
4596                 }
4597         }
4598         if (skb_is_gso(skb))
4599                 large_send = card->options.large_send;
4600         /* check on OSN device*/
4601         if (card->info.type == QETH_CARD_TYPE_OSN)
4602                 hdr = (struct qeth_hdr *)new_skb->data;
4603         /*are we able to do TSO ? */
4604         if ((large_send == QETH_LARGE_SEND_TSO) &&
4605             (cast_type == RTN_UNSPEC)) {
4606                 rc = qeth_tso_prepare_packet(card, new_skb, ipv, cast_type);
4607                 if (rc) {
4608                         __qeth_free_new_skb(skb, new_skb);
4609                         return rc;
4610                 }
4611                 elements_needed++;
4612         } else if (card->info.type != QETH_CARD_TYPE_OSN) {
4613                 new_skb2 = qeth_prepare_skb(card, new_skb, &hdr, ipv);
4614                 if (!new_skb2) {
4615                         __qeth_free_new_skb(skb, new_skb);
4616                         return -EINVAL;
4617                 }
4618                 if (new_skb != skb)
4619                         __qeth_free_new_skb(new_skb2, new_skb);
4620                 new_skb = new_skb2;
4621                 qeth_fill_header(card, hdr, new_skb, ipv, cast_type);
4622         }
4623         if (large_send == QETH_LARGE_SEND_EDDP) {
4624                 ctx = qeth_eddp_create_context(card, new_skb, hdr,
4625                                                skb->sk->sk_protocol);
4626                 if (ctx == NULL) {
4627                         __qeth_free_new_skb(skb, new_skb);
4628                         PRINT_WARN("could not create eddp context\n");
4629                         return -EINVAL;
4630                 }
4631         } else {
4632                 int elems = qeth_get_elements_no(card,(void*) hdr, new_skb,
4633                                                  elements_needed);
4634                 if (!elems) {
4635                         __qeth_free_new_skb(skb, new_skb);
4636                         return -EINVAL;
4637                 }
4638                 elements_needed += elems;
4639         }
4640
4641         if (card->info.type != QETH_CARD_TYPE_IQD)
4642                 rc = qeth_do_send_packet(card, queue, new_skb, hdr,
4643                                          elements_needed, ctx);
4644         else
4645                 rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr,
4646                                               elements_needed, ctx);
4647         if (!rc) {
4648                 card->stats.tx_packets++;
4649                 card->stats.tx_bytes += tx_bytes;
4650                 if (new_skb != skb)
4651                         dev_kfree_skb_any(skb);
4652                 if (card->options.performance_stats) {
4653                         if (tso_size &&
4654                             !(large_send == QETH_LARGE_SEND_NO)) {
4655                                 card->perf_stats.large_send_bytes += tx_bytes;
4656                                 card->perf_stats.large_send_cnt++;
4657                         }
4658                         if (nr_frags > 0) {
4659                                 card->perf_stats.sg_skbs_sent++;
4660                                 /* nr_frags + skb->data */
4661                                 card->perf_stats.sg_frags_sent +=
4662                                         nr_frags + 1;
4663                         }
4664                 }
4665         } else {
4666                 card->stats.tx_dropped++;
4667                 __qeth_free_new_skb(skb, new_skb);
4668         }
4669         if (ctx != NULL) {
4670                 /* drop creator's reference */
4671                 qeth_eddp_put_context(ctx);
4672                 /* free skb; it's not referenced by a buffer */
4673                 if (!rc)
4674                        dev_kfree_skb_any(new_skb);
4675         }
4676         return rc;
4677 }
4678
4679 static int
4680 qeth_mdio_read(struct net_device *dev, int phy_id, int regnum)
4681 {
4682         struct qeth_card *card = (struct qeth_card *) dev->priv;
4683         int rc = 0;
4684
4685         switch(regnum){
4686         case MII_BMCR: /* Basic mode control register */
4687                 rc = BMCR_FULLDPLX;
4688                 if ((card->info.link_type != QETH_LINK_TYPE_GBIT_ETH)&&
4689                     (card->info.link_type != QETH_LINK_TYPE_OSN) &&
4690                     (card->info.link_type != QETH_LINK_TYPE_10GBIT_ETH))
4691                         rc |= BMCR_SPEED100;
4692                 break;
4693         case MII_BMSR: /* Basic mode status register */
4694                 rc = BMSR_ERCAP | BMSR_ANEGCOMPLETE | BMSR_LSTATUS |
4695                      BMSR_10HALF | BMSR_10FULL | BMSR_100HALF | BMSR_100FULL |
4696                      BMSR_100BASE4;
4697                 break;
4698         case MII_PHYSID1: /* PHYS ID 1 */
4699                 rc = (dev->dev_addr[0] << 16) | (dev->dev_addr[1] << 8) |
4700                      dev->dev_addr[2];
4701                 rc = (rc >> 5) & 0xFFFF;
4702                 break;
4703         case MII_PHYSID2: /* PHYS ID 2 */
4704                 rc = (dev->dev_addr[2] << 10) & 0xFFFF;
4705                 break;
4706         case MII_ADVERTISE: /* Advertisement control reg */
4707                 rc = ADVERTISE_ALL;
4708                 break;
4709         case MII_LPA: /* Link partner ability reg */
4710                 rc = LPA_10HALF | LPA_10FULL | LPA_100HALF | LPA_100FULL |
4711                      LPA_100BASE4 | LPA_LPACK;
4712                 break;
4713         case MII_EXPANSION: /* Expansion register */
4714                 break;
4715         case MII_DCOUNTER: /* disconnect counter */
4716                 break;
4717         case MII_FCSCOUNTER: /* false carrier counter */
4718                 break;
4719         case MII_NWAYTEST: /* N-way auto-neg test register */
4720                 break;
4721         case MII_RERRCOUNTER: /* rx error counter */
4722                 rc = card->stats.rx_errors;
4723                 break;
4724         case MII_SREVISION: /* silicon revision */
4725                 break;
4726         case MII_RESV1: /* reserved 1 */
4727                 break;
4728         case MII_LBRERROR: /* loopback, rx, bypass error */
4729                 break;
4730         case MII_PHYADDR: /* physical address */
4731                 break;
4732         case MII_RESV2: /* reserved 2 */
4733                 break;
4734         case MII_TPISTATUS: /* TPI status for 10mbps */
4735                 break;
4736         case MII_NCONFIG: /* network interface config */
4737                 break;
4738         default:
4739                 break;
4740         }
4741         return rc;
4742 }
4743
4744
4745 static const char *
4746 qeth_arp_get_error_cause(int *rc)
4747 {
4748         switch (*rc) {
4749         case QETH_IPA_ARP_RC_FAILED:
4750                 *rc = -EIO;
4751                 return "operation failed";
4752         case QETH_IPA_ARP_RC_NOTSUPP:
4753                 *rc = -EOPNOTSUPP;
4754                 return "operation not supported";
4755         case QETH_IPA_ARP_RC_OUT_OF_RANGE:
4756                 *rc = -EINVAL;
4757                 return "argument out of range";
4758         case QETH_IPA_ARP_RC_Q_NOTSUPP:
4759                 *rc = -EOPNOTSUPP;
4760                 return "query operation not supported";
4761         case QETH_IPA_ARP_RC_Q_NO_DATA:
4762                 *rc = -ENOENT;
4763                 return "no query data available";
4764         default:
4765                 return "unknown error";
4766         }
4767 }
4768
4769 static int
4770 qeth_send_simple_setassparms(struct qeth_card *, enum qeth_ipa_funcs,
4771                              __u16, long);
4772
4773 static int
4774 qeth_arp_set_no_entries(struct qeth_card *card, int no_entries)
4775 {
4776         int tmp;
4777         int rc;
4778
4779         QETH_DBF_TEXT(trace,3,"arpstnoe");
4780
4781         /*
4782          * currently GuestLAN only supports the ARP assist function
4783          * IPA_CMD_ASS_ARP_QUERY_INFO, but not IPA_CMD_ASS_ARP_SET_NO_ENTRIES;
4784          * thus we say EOPNOTSUPP for this ARP function
4785          */
4786         if (card->info.guestlan)
4787                 return -EOPNOTSUPP;
4788         if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
4789                 PRINT_WARN("ARP processing not supported "
4790                            "on %s!\n", QETH_CARD_IFNAME(card));
4791                 return -EOPNOTSUPP;
4792         }
4793         rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING,
4794                                           IPA_CMD_ASS_ARP_SET_NO_ENTRIES,
4795                                           no_entries);
4796         if (rc) {
4797                 tmp = rc;
4798                 PRINT_WARN("Could not set number of ARP entries on %s: "
4799                            "%s (0x%x/%d)\n",
4800                            QETH_CARD_IFNAME(card), qeth_arp_get_error_cause(&rc),
4801                            tmp, tmp);
4802         }
4803         return rc;
4804 }
4805
4806 static void
4807 qeth_copy_arp_entries_stripped(struct qeth_arp_query_info *qinfo,
4808                                struct qeth_arp_query_data *qdata,
4809                                int entry_size, int uentry_size)
4810 {
4811         char *entry_ptr;
4812         char *uentry_ptr;
4813         int i;
4814
4815         entry_ptr = (char *)&qdata->data;
4816         uentry_ptr = (char *)(qinfo->udata + qinfo->udata_offset);
4817         for (i = 0; i < qdata->no_entries; ++i){
4818                 /* strip off 32 bytes "media specific information" */
4819                 memcpy(uentry_ptr, (entry_ptr + 32), entry_size - 32);
4820                 entry_ptr += entry_size;
4821                 uentry_ptr += uentry_size;
4822         }
4823 }
4824
4825 static int
4826 qeth_arp_query_cb(struct qeth_card *card, struct qeth_reply *reply,
4827                   unsigned long data)
4828 {
4829         struct qeth_ipa_cmd *cmd;
4830         struct qeth_arp_query_data *qdata;
4831         struct qeth_arp_query_info *qinfo;
4832         int entry_size;
4833         int uentry_size;
4834         int i;
4835
4836         QETH_DBF_TEXT(trace,4,"arpquecb");
4837
4838         qinfo = (struct qeth_arp_query_info *) reply->param;
4839         cmd = (struct qeth_ipa_cmd *) data;
4840         if (cmd->hdr.return_code) {
4841                 QETH_DBF_TEXT_(trace,4,"qaer1%i", cmd->hdr.return_code);
4842                 return 0;
4843         }
4844         if (cmd->data.setassparms.hdr.return_code) {
4845                 cmd->hdr.return_code = cmd->data.setassparms.hdr.return_code;
4846                 QETH_DBF_TEXT_(trace,4,"qaer2%i", cmd->hdr.return_code);
4847                 return 0;
4848         }
4849         qdata = &cmd->data.setassparms.data.query_arp;
4850         switch(qdata->reply_bits){
4851         case 5:
4852                 uentry_size = entry_size = sizeof(struct qeth_arp_qi_entry5);
4853                 if (qinfo->mask_bits & QETH_QARP_STRIP_ENTRIES)
4854                         uentry_size = sizeof(struct qeth_arp_qi_entry5_short);
4855                 break;
4856         case 7:
4857                 /* fall through to default */
4858         default:
4859                 /* tr is the same as eth -> entry7 */
4860                 uentry_size = entry_size = sizeof(struct qeth_arp_qi_entry7);
4861                 if (qinfo->mask_bits & QETH_QARP_STRIP_ENTRIES)
4862                         uentry_size = sizeof(struct qeth_arp_qi_entry7_short);
4863                 break;
4864         }
4865         /* check if there is enough room in userspace */
4866         if ((qinfo->udata_len - qinfo->udata_offset) <
4867                         qdata->no_entries * uentry_size){
4868                 QETH_DBF_TEXT_(trace, 4, "qaer3%i", -ENOMEM);
4869                 cmd->hdr.return_code = -ENOMEM;
4870                 PRINT_WARN("query ARP user space buffer is too small for "
4871                            "the returned number of ARP entries. "
4872                            "Aborting query!\n");
4873                 goto out_error;
4874         }
4875         QETH_DBF_TEXT_(trace, 4, "anore%i",
4876                        cmd->data.setassparms.hdr.number_of_replies);
4877         QETH_DBF_TEXT_(trace, 4, "aseqn%i", cmd->data.setassparms.hdr.seq_no);
4878         QETH_DBF_TEXT_(trace, 4, "anoen%i", qdata->no_entries);
4879
4880         if (qinfo->mask_bits & QETH_QARP_STRIP_ENTRIES) {
4881                 /* strip off "media specific information" */
4882                 qeth_copy_arp_entries_stripped(qinfo, qdata, entry_size,
4883                                                uentry_size);
4884         } else
4885                 /*copy entries to user buffer*/
4886                 memcpy(qinfo->udata + qinfo->udata_offset,
4887                        (char *)&qdata->data, qdata->no_entries*uentry_size);
4888
4889         qinfo->no_entries += qdata->no_entries;
4890         qinfo->udata_offset += (qdata->no_entries*uentry_size);
4891         /* check if all replies received ... */
4892         if (cmd->data.setassparms.hdr.seq_no <
4893             cmd->data.setassparms.hdr.number_of_replies)
4894                 return 1;
4895         memcpy(qinfo->udata, &qinfo->no_entries, 4);
4896         /* keep STRIP_ENTRIES flag so the user program can distinguish
4897          * stripped entries from normal ones */
4898         if (qinfo->mask_bits & QETH_QARP_STRIP_ENTRIES)
4899                 qdata->reply_bits |= QETH_QARP_STRIP_ENTRIES;
4900         memcpy(qinfo->udata + QETH_QARP_MASK_OFFSET,&qdata->reply_bits,2);
4901         return 0;
4902 out_error:
4903         i = 0;
4904         memcpy(qinfo->udata, &i, 4);
4905         return 0;
4906 }
4907
4908 static int
4909 qeth_send_ipa_arp_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
4910                       int len, int (*reply_cb)(struct qeth_card *,
4911                                                struct qeth_reply *,
4912                                                unsigned long),
4913                       void *reply_param)
4914 {
4915         QETH_DBF_TEXT(trace,4,"sendarp");
4916
4917         memcpy(iob->data, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE);
4918         memcpy(QETH_IPA_CMD_DEST_ADDR(iob->data),
4919                &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
4920         return qeth_send_control_data(card, IPA_PDU_HEADER_SIZE + len, iob,
4921                                       reply_cb, reply_param);
4922 }
4923
4924 static int
4925 qeth_send_ipa_snmp_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
4926                       int len, int (*reply_cb)(struct qeth_card *,
4927                                                struct qeth_reply *,
4928                                                unsigned long),
4929                       void *reply_param)
4930 {
4931         u16 s1, s2;
4932
4933         QETH_DBF_TEXT(trace,4,"sendsnmp");
4934
4935         memcpy(iob->data, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE);
4936         memcpy(QETH_IPA_CMD_DEST_ADDR(iob->data),
4937                &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
4938         /* adjust PDU length fields in IPA_PDU_HEADER */
4939         s1 = (u32) IPA_PDU_HEADER_SIZE + len;
4940         s2 = (u32) len;
4941         memcpy(QETH_IPA_PDU_LEN_TOTAL(iob->data), &s1, 2);
4942         memcpy(QETH_IPA_PDU_LEN_PDU1(iob->data), &s2, 2);
4943         memcpy(QETH_IPA_PDU_LEN_PDU2(iob->data), &s2, 2);
4944         memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2);
4945         return qeth_send_control_data(card, IPA_PDU_HEADER_SIZE + len, iob,
4946                                       reply_cb, reply_param);
4947 }
4948
4949 static struct qeth_cmd_buffer *
4950 qeth_get_setassparms_cmd(struct qeth_card *, enum qeth_ipa_funcs,
4951                          __u16, __u16, enum qeth_prot_versions);
4952 static int
4953 qeth_arp_query(struct qeth_card *card, char __user *udata)
4954 {
4955         struct qeth_cmd_buffer *iob;
4956         struct qeth_arp_query_info qinfo = {0, };
4957         int tmp;
4958         int rc;
4959
4960         QETH_DBF_TEXT(trace,3,"arpquery");
4961
4962         if (!qeth_is_supported(card,/*IPA_QUERY_ARP_ADDR_INFO*/
4963                                IPA_ARP_PROCESSING)) {
4964                 PRINT_WARN("ARP processing not supported "
4965                            "on %s!\n", QETH_CARD_IFNAME(card));
4966                 return -EOPNOTSUPP;
4967         }
4968         /* get size of userspace buffer and mask_bits -> 6 bytes */
4969         if (copy_from_user(&qinfo, udata, 6))
4970                 return -EFAULT;
4971         if (!(qinfo.udata = kzalloc(qinfo.udata_len, GFP_KERNEL)))
4972                 return -ENOMEM;
4973         qinfo.udata_offset = QETH_QARP_ENTRIES_OFFSET;
4974         iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING,
4975                                        IPA_CMD_ASS_ARP_QUERY_INFO,
4976                                        sizeof(int),QETH_PROT_IPV4);
4977
4978         rc = qeth_send_ipa_arp_cmd(card, iob,
4979                                    QETH_SETASS_BASE_LEN+QETH_ARP_CMD_LEN,
4980                                    qeth_arp_query_cb, (void *)&qinfo);
4981         if (rc) {
4982                 tmp = rc;
4983                 PRINT_WARN("Error while querying ARP cache on %s: %s "
4984                            "(0x%x/%d)\n",
4985                            QETH_CARD_IFNAME(card), qeth_arp_get_error_cause(&rc),
4986                            tmp, tmp);
4987                 if (copy_to_user(udata, qinfo.udata, 4))
4988                         rc = -EFAULT;
4989         } else {
4990                 if (copy_to_user(udata, qinfo.udata, qinfo.udata_len))
4991                         rc = -EFAULT;
4992         }
4993         kfree(qinfo.udata);
4994         return rc;
4995 }
4996
4997 /**
4998  * SNMP command callback
4999  */
5000 static int
5001 qeth_snmp_command_cb(struct qeth_card *card, struct qeth_reply *reply,
5002                      unsigned long sdata)
5003 {
5004         struct qeth_ipa_cmd *cmd;
5005         struct qeth_arp_query_info *qinfo;
5006         struct qeth_snmp_cmd *snmp;
5007         unsigned char *data;
5008         __u16 data_len;
5009
5010         QETH_DBF_TEXT(trace,3,"snpcmdcb");
5011
5012         cmd = (struct qeth_ipa_cmd *) sdata;
5013         data = (unsigned char *)((char *)cmd - reply->offset);
5014         qinfo = (struct qeth_arp_query_info *) reply->param;
5015         snmp = &cmd->data.setadapterparms.data.snmp;
5016
5017         if (cmd->hdr.return_code) {
5018                 QETH_DBF_TEXT_(trace,4,"scer1%i", cmd->hdr.return_code);
5019                 return 0;
5020         }
5021         if (cmd->data.setadapterparms.hdr.return_code) {
5022                 cmd->hdr.return_code = cmd->data.setadapterparms.hdr.return_code;
5023                 QETH_DBF_TEXT_(trace,4,"scer2%i", cmd->hdr.return_code);
5024                 return 0;
5025         }
5026         data_len = *((__u16*)QETH_IPA_PDU_LEN_PDU1(data));
5027         if (cmd->data.setadapterparms.hdr.seq_no == 1)
5028                 data_len -= (__u16)((char *)&snmp->data - (char *)cmd);
5029         else
5030                 data_len -= (__u16)((char*)&snmp->request - (char *)cmd);
5031
5032         /* check if there is enough room in userspace */
5033         if ((qinfo->udata_len - qinfo->udata_offset) < data_len) {
5034                 QETH_DBF_TEXT_(trace, 4, "scer3%i", -ENOMEM);
5035                 cmd->hdr.return_code = -ENOMEM;
5036                 return 0;
5037         }
5038         QETH_DBF_TEXT_(trace, 4, "snore%i",
5039                        cmd->data.setadapterparms.hdr.used_total);
5040         QETH_DBF_TEXT_(trace, 4, "sseqn%i", cmd->data.setadapterparms.hdr.seq_no);
5041         /*copy entries to user buffer*/
5042         if (cmd->data.setadapterparms.hdr.seq_no == 1) {
5043                 memcpy(qinfo->udata + qinfo->udata_offset,
5044                        (char *)snmp,
5045                        data_len + offsetof(struct qeth_snmp_cmd,data));
5046                 qinfo->udata_offset += offsetof(struct qeth_snmp_cmd, data);
5047         } else {
5048                 memcpy(qinfo->udata + qinfo->udata_offset,
5049                        (char *)&snmp->request, data_len);
5050         }
5051         qinfo->udata_offset += data_len;
5052         /* check if all replies received ... */
5053                 QETH_DBF_TEXT_(trace, 4, "srtot%i",
5054                                cmd->data.setadapterparms.hdr.used_total);
5055                 QETH_DBF_TEXT_(trace, 4, "srseq%i",
5056                                cmd->data.setadapterparms.hdr.seq_no);
5057         if (cmd->data.setadapterparms.hdr.seq_no <
5058             cmd->data.setadapterparms.hdr.used_total)
5059                 return 1;
5060         return 0;
5061 }
5062
5063 static struct qeth_cmd_buffer *
5064 qeth_get_ipacmd_buffer(struct qeth_card *, enum qeth_ipa_cmds,
5065                        enum qeth_prot_versions );
5066
5067 static struct qeth_cmd_buffer *
5068 qeth_get_adapter_cmd(struct qeth_card *card, __u32 command, __u32 cmdlen)
5069 {
5070         struct qeth_cmd_buffer *iob;
5071         struct qeth_ipa_cmd *cmd;
5072
5073         iob = qeth_get_ipacmd_buffer(card,IPA_CMD_SETADAPTERPARMS,
5074                                      QETH_PROT_IPV4);
5075         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
5076         cmd->data.setadapterparms.hdr.cmdlength = cmdlen;
5077         cmd->data.setadapterparms.hdr.command_code = command;
5078         cmd->data.setadapterparms.hdr.used_total = 1;
5079         cmd->data.setadapterparms.hdr.seq_no = 1;
5080
5081         return iob;
5082 }
5083
5084 /**
5085  * function to send SNMP commands to OSA-E card
5086  */
5087 static int
5088 qeth_snmp_command(struct qeth_card *card, char __user *udata)
5089 {
5090         struct qeth_cmd_buffer *iob;
5091         struct qeth_ipa_cmd *cmd;
5092         struct qeth_snmp_ureq *ureq;
5093         int req_len;
5094         struct qeth_arp_query_info qinfo = {0, };
5095         int rc = 0;
5096
5097         QETH_DBF_TEXT(trace,3,"snmpcmd");
5098
5099         if (card->info.guestlan)
5100                 return -EOPNOTSUPP;
5101
5102         if ((!qeth_adp_supported(card,IPA_SETADP_SET_SNMP_CONTROL)) &&
5103             (!card->options.layer2) ) {
5104                 PRINT_WARN("SNMP Query MIBS not supported "
5105                            "on %s!\n", QETH_CARD_IFNAME(card));
5106                 return -EOPNOTSUPP;
5107         }
5108         /* skip 4 bytes (data_len struct member) to get req_len */
5109         if (copy_from_user(&req_len, udata + sizeof(int), sizeof(int)))
5110                 return -EFAULT;
5111         ureq = kmalloc(req_len+sizeof(struct qeth_snmp_ureq_hdr), GFP_KERNEL);
5112         if (!ureq) {
5113                 QETH_DBF_TEXT(trace, 2, "snmpnome");
5114                 return -ENOMEM;
5115         }
5116         if (copy_from_user(ureq, udata,
5117                         req_len+sizeof(struct qeth_snmp_ureq_hdr))){
5118                 kfree(ureq);
5119                 return -EFAULT;
5120         }
5121         qinfo.udata_len = ureq->hdr.data_len;
5122         if (!(qinfo.udata = kzalloc(qinfo.udata_len, GFP_KERNEL))){
5123                 kfree(ureq);
5124                 return -ENOMEM;
5125         }
5126         qinfo.udata_offset = sizeof(struct qeth_snmp_ureq_hdr);
5127
5128         iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_SNMP_CONTROL,
5129                                    QETH_SNMP_SETADP_CMDLENGTH + req_len);
5130         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
5131         memcpy(&cmd->data.setadapterparms.data.snmp, &ureq->cmd, req_len);
5132         rc = qeth_send_ipa_snmp_cmd(card, iob, QETH_SETADP_BASE_LEN + req_len,
5133                                     qeth_snmp_command_cb, (void *)&qinfo);
5134         if (rc)
5135                 PRINT_WARN("SNMP command failed on %s: (0x%x)\n",
5136                            QETH_CARD_IFNAME(card), rc);
5137         else {
5138                 if (copy_to_user(udata, qinfo.udata, qinfo.udata_len))
5139                         rc = -EFAULT;
5140         }
5141
5142         kfree(ureq);
5143         kfree(qinfo.udata);
5144         return rc;
5145 }
5146
5147 static int
5148 qeth_default_setassparms_cb(struct qeth_card *, struct qeth_reply *,
5149                             unsigned long);
5150
5151 static int
5152 qeth_default_setadapterparms_cb(struct qeth_card *card,
5153                                 struct qeth_reply *reply,
5154                                 unsigned long data);
5155 static int
5156 qeth_send_setassparms(struct qeth_card *, struct qeth_cmd_buffer *,
5157                       __u16, long,
5158                       int (*reply_cb)
5159                       (struct qeth_card *, struct qeth_reply *, unsigned long),
5160                       void *reply_param);
5161
5162 static int
5163 qeth_arp_add_entry(struct qeth_card *card, struct qeth_arp_cache_entry *entry)
5164 {
5165         struct qeth_cmd_buffer *iob;
5166         char buf[16];
5167         int tmp;
5168         int rc;
5169
5170         QETH_DBF_TEXT(trace,3,"arpadent");
5171
5172         /*
5173          * currently GuestLAN only supports the ARP assist function
5174          * IPA_CMD_ASS_ARP_QUERY_INFO, but not IPA_CMD_ASS_ARP_ADD_ENTRY;
5175          * thus we say EOPNOTSUPP for this ARP function
5176          */
5177         if (card->info.guestlan)
5178                 return -EOPNOTSUPP;
5179         if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
5180                 PRINT_WARN("ARP processing not supported "
5181                            "on %s!\n", QETH_CARD_IFNAME(card));
5182                 return -EOPNOTSUPP;
5183         }
5184
5185         iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING,
5186                                        IPA_CMD_ASS_ARP_ADD_ENTRY,
5187                                        sizeof(struct qeth_arp_cache_entry),
5188                                        QETH_PROT_IPV4);
5189         rc = qeth_send_setassparms(card, iob,
5190                                    sizeof(struct qeth_arp_cache_entry),
5191                                    (unsigned long) entry,
5192                                    qeth_default_setassparms_cb, NULL);
5193         if (rc) {
5194                 tmp = rc;
5195                 qeth_ipaddr4_to_string((u8 *)entry->ipaddr, buf);
5196                 PRINT_WARN("Could not add ARP entry for address %s on %s: "
5197                            "%s (0x%x/%d)\n",
5198                            buf, QETH_CARD_IFNAME(card),
5199                            qeth_arp_get_error_cause(&rc), tmp, tmp);
5200         }
5201         return rc;
5202 }
5203
5204 static int
5205 qeth_arp_remove_entry(struct qeth_card *card, struct qeth_arp_cache_entry *entry)
5206 {
5207         struct qeth_cmd_buffer *iob;
5208         char buf[16] = {0, };
5209         int tmp;
5210         int rc;
5211
5212         QETH_DBF_TEXT(trace,3,"arprment");
5213
5214         /*
5215          * currently GuestLAN only supports the ARP assist function
5216          * IPA_CMD_ASS_ARP_QUERY_INFO, but not IPA_CMD_ASS_ARP_REMOVE_ENTRY;
5217          * thus we say EOPNOTSUPP for this ARP function
5218          */
5219         if (card->info.guestlan)
5220                 return -EOPNOTSUPP;
5221         if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
5222                 PRINT_WARN("ARP processing not supported "
5223                            "on %s!\n", QETH_CARD_IFNAME(card));
5224                 return -EOPNOTSUPP;
5225         }
5226         memcpy(buf, entry, 12);
5227         iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING,
5228                                        IPA_CMD_ASS_ARP_REMOVE_ENTRY,
5229                                        12,
5230                                        QETH_PROT_IPV4);
5231         rc = qeth_send_setassparms(card, iob,
5232                                    12, (unsigned long)buf,
5233                                    qeth_default_setassparms_cb, NULL);
5234         if (rc) {
5235                 tmp = rc;
5236                 memset(buf, 0, 16);
5237                 qeth_ipaddr4_to_string((u8 *)entry->ipaddr, buf);
5238                 PRINT_WARN("Could not delete ARP entry for address %s on %s: "
5239                            "%s (0x%x/%d)\n",
5240                            buf, QETH_CARD_IFNAME(card),
5241                            qeth_arp_get_error_cause(&rc), tmp, tmp);
5242         }
5243         return rc;
5244 }
5245
5246 static int
5247 qeth_arp_flush_cache(struct qeth_card *card)
5248 {
5249         int rc;
5250         int tmp;
5251
5252         QETH_DBF_TEXT(trace,3,"arpflush");
5253
5254         /*
5255          * currently GuestLAN only supports the ARP assist function
5256          * IPA_CMD_ASS_ARP_QUERY_INFO, but not IPA_CMD_ASS_ARP_FLUSH_CACHE;
5257          * thus we say EOPNOTSUPP for this ARP function
5258         */
5259         if (card->info.guestlan || (card->info.type == QETH_CARD_TYPE_IQD))
5260                 return -EOPNOTSUPP;
5261         if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
5262                 PRINT_WARN("ARP processing not supported "
5263                            "on %s!\n", QETH_CARD_IFNAME(card));
5264                 return -EOPNOTSUPP;
5265         }
5266         rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING,
5267                                           IPA_CMD_ASS_ARP_FLUSH_CACHE, 0);
5268         if (rc){
5269                 tmp = rc;
5270                 PRINT_WARN("Could not flush ARP cache on %s: %s (0x%x/%d)\n",
5271                            QETH_CARD_IFNAME(card), qeth_arp_get_error_cause(&rc),
5272                            tmp, tmp);
5273         }
5274         return rc;
5275 }
5276
5277 static int
5278 qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
5279 {
5280         struct qeth_card *card = (struct qeth_card *)dev->priv;
5281         struct qeth_arp_cache_entry arp_entry;
5282         struct mii_ioctl_data *mii_data;
5283         int rc = 0;
5284
5285         if (!card)
5286                 return -ENODEV;
5287
5288         if ((card->state != CARD_STATE_UP) &&
5289             (card->state != CARD_STATE_SOFTSETUP))
5290                 return -ENODEV;
5291
5292         if (card->info.type == QETH_CARD_TYPE_OSN)
5293                 return -EPERM;
5294
5295         switch (cmd){
5296         case SIOC_QETH_ARP_SET_NO_ENTRIES:
5297                 if ( !capable(CAP_NET_ADMIN) ||
5298                      (card->options.layer2) ) {
5299                         rc = -EPERM;
5300                         break;
5301                 }
5302                 rc = qeth_arp_set_no_entries(card, rq->ifr_ifru.ifru_ivalue);
5303                 break;
5304         case SIOC_QETH_ARP_QUERY_INFO:
5305                 if ( !capable(CAP_NET_ADMIN) ||
5306                      (card->options.layer2) ) {
5307                         rc = -EPERM;
5308                         break;
5309                 }
5310                 rc = qeth_arp_query(card, rq->ifr_ifru.ifru_data);
5311                 break;
5312         case SIOC_QETH_ARP_ADD_ENTRY:
5313                 if ( !capable(CAP_NET_ADMIN) ||
5314                      (card->options.layer2) ) {
5315                         rc = -EPERM;
5316                         break;
5317                 }
5318                 if (copy_from_user(&arp_entry, rq->ifr_ifru.ifru_data,
5319                                    sizeof(struct qeth_arp_cache_entry)))
5320                         rc = -EFAULT;
5321                 else
5322                         rc = qeth_arp_add_entry(card, &arp_entry);
5323                 break;
5324         case SIOC_QETH_ARP_REMOVE_ENTRY:
5325                 if ( !capable(CAP_NET_ADMIN) ||
5326                      (card->options.layer2) ) {
5327                         rc = -EPERM;
5328                         break;
5329                 }
5330                 if (copy_from_user(&arp_entry, rq->ifr_ifru.ifru_data,
5331                                    sizeof(struct qeth_arp_cache_entry)))
5332                         rc = -EFAULT;
5333                 else
5334                         rc = qeth_arp_remove_entry(card, &arp_entry);
5335                 break;
5336         case SIOC_QETH_ARP_FLUSH_CACHE:
5337                 if ( !capable(CAP_NET_ADMIN) ||
5338                      (card->options.layer2) ) {
5339                         rc = -EPERM;
5340                         break;
5341                 }
5342                 rc = qeth_arp_flush_cache(card);
5343                 break;
5344         case SIOC_QETH_ADP_SET_SNMP_CONTROL:
5345                 rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data);
5346                 break;
5347         case SIOC_QETH_GET_CARD_TYPE:
5348                 if ((card->info.type == QETH_CARD_TYPE_OSAE) &&
5349                     !card->info.guestlan)
5350                         return 1;
5351                 return 0;
5352                 break;
5353         case SIOCGMIIPHY:
5354                 mii_data = if_mii(rq);
5355                 mii_data->phy_id = 0;
5356                 break;
5357         case SIOCGMIIREG:
5358                 mii_data = if_mii(rq);
5359                 if (mii_data->phy_id != 0)
5360                         rc = -EINVAL;
5361                 else
5362                         mii_data->val_out = qeth_mdio_read(dev,mii_data->phy_id,
5363                                                            mii_data->reg_num);
5364                 break;
5365         default:
5366                 rc = -EOPNOTSUPP;
5367         }
5368         if (rc)
5369                 QETH_DBF_TEXT_(trace, 2, "ioce%d", rc);
5370         return rc;
5371 }
5372
5373 static struct net_device_stats *
5374 qeth_get_stats(struct net_device *dev)
5375 {
5376         struct qeth_card *card;
5377
5378         card = (struct qeth_card *) (dev->priv);
5379
5380         QETH_DBF_TEXT(trace,5,"getstat");
5381
5382         return &card->stats;
5383 }
5384
5385 static int
5386 qeth_change_mtu(struct net_device *dev, int new_mtu)
5387 {
5388         struct qeth_card *card;
5389         char dbf_text[15];
5390
5391         card = (struct qeth_card *) (dev->priv);
5392
5393         QETH_DBF_TEXT(trace,4,"chgmtu");
5394         sprintf(dbf_text, "%8x", new_mtu);
5395         QETH_DBF_TEXT(trace,4,dbf_text);
5396
5397         if (new_mtu < 64)
5398                 return -EINVAL;
5399         if (new_mtu > 65535)
5400                 return -EINVAL;
5401         if ((!qeth_is_supported(card,IPA_IP_FRAGMENTATION)) &&
5402             (!qeth_mtu_is_valid(card, new_mtu)))
5403                 return -EINVAL;
5404         dev->mtu = new_mtu;
5405         return 0;
5406 }
5407
5408 #ifdef CONFIG_QETH_VLAN
5409 static void
5410 qeth_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
5411 {
5412         struct qeth_card *card;
5413         unsigned long flags;
5414
5415         QETH_DBF_TEXT(trace,4,"vlanreg");
5416
5417         card = (struct qeth_card *) dev->priv;
5418         spin_lock_irqsave(&card->vlanlock, flags);
5419         card->vlangrp = grp;
5420         spin_unlock_irqrestore(&card->vlanlock, flags);
5421 }
5422
5423 static void
5424 qeth_free_vlan_buffer(struct qeth_card *card, struct qeth_qdio_out_buffer *buf,
5425                       unsigned short vid)
5426 {
5427         int i;
5428         struct sk_buff *skb;
5429         struct sk_buff_head tmp_list;
5430
5431         skb_queue_head_init(&tmp_list);
5432         lockdep_set_class(&tmp_list.lock, &qdio_out_skb_queue_key);
5433         for(i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i){
5434                 while ((skb = skb_dequeue(&buf->skb_list))){
5435                         if (vlan_tx_tag_present(skb) &&
5436                             (vlan_tx_tag_get(skb) == vid)) {
5437                                 atomic_dec(&skb->users);
5438                                 dev_kfree_skb(skb);
5439                         } else
5440                                 skb_queue_tail(&tmp_list, skb);
5441                 }
5442         }
5443         while ((skb = skb_dequeue(&tmp_list)))
5444                 skb_queue_tail(&buf->skb_list, skb);
5445 }
5446
5447 static void
5448 qeth_free_vlan_skbs(struct qeth_card *card, unsigned short vid)
5449 {
5450         int i, j;
5451
5452         QETH_DBF_TEXT(trace, 4, "frvlskbs");
5453         for (i = 0; i < card->qdio.no_out_queues; ++i){
5454                 for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j)
5455                         qeth_free_vlan_buffer(card, &card->qdio.
5456                                               out_qs[i]->bufs[j], vid);
5457         }
5458 }
5459
5460 static void
5461 qeth_free_vlan_addresses4(struct qeth_card *card, unsigned short vid)
5462 {
5463         struct in_device *in_dev;
5464         struct in_ifaddr *ifa;
5465         struct qeth_ipaddr *addr;
5466
5467         QETH_DBF_TEXT(trace, 4, "frvaddr4");
5468
5469         rcu_read_lock();
5470         in_dev = __in_dev_get_rcu(vlan_group_get_device(card->vlangrp, vid));
5471         if (!in_dev)
5472                 goto out;
5473         for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
5474                 addr = qeth_get_addr_buffer(QETH_PROT_IPV4);
5475                 if (addr){
5476                         addr->u.a4.addr = ifa->ifa_address;
5477                         addr->u.a4.mask = ifa->ifa_mask;
5478                         addr->type = QETH_IP_TYPE_NORMAL;
5479                         if (!qeth_delete_ip(card, addr))
5480                                 kfree(addr);
5481                 }
5482         }
5483 out:
5484         rcu_read_unlock();
5485 }
5486
5487 static void
5488 qeth_free_vlan_addresses6(struct qeth_card *card, unsigned short vid)
5489 {
5490 #ifdef CONFIG_QETH_IPV6
5491         struct inet6_dev *in6_dev;
5492         struct inet6_ifaddr *ifa;
5493         struct qeth_ipaddr *addr;
5494
5495         QETH_DBF_TEXT(trace, 4, "frvaddr6");
5496
5497         in6_dev = in6_dev_get(vlan_group_get_device(card->vlangrp, vid));
5498         if (!in6_dev)
5499                 return;
5500         for (ifa = in6_dev->addr_list; ifa; ifa = ifa->lst_next){
5501                 addr = qeth_get_addr_buffer(QETH_PROT_IPV6);
5502                 if (addr){
5503                         memcpy(&addr->u.a6.addr, &ifa->addr,
5504                                sizeof(struct in6_addr));
5505                         addr->u.a6.pfxlen = ifa->prefix_len;
5506                         addr->type = QETH_IP_TYPE_NORMAL;
5507                         if (!qeth_delete_ip(card, addr))
5508                                 kfree(addr);
5509                 }
5510         }
5511         in6_dev_put(in6_dev);
5512 #endif /* CONFIG_QETH_IPV6 */
5513 }
5514
5515 static void
5516 qeth_free_vlan_addresses(struct qeth_card *card, unsigned short vid)
5517 {
5518         if (card->options.layer2 || !card->vlangrp)
5519                 return;
5520         qeth_free_vlan_addresses4(card, vid);
5521         qeth_free_vlan_addresses6(card, vid);
5522 }
5523
5524 static int
5525 qeth_layer2_send_setdelvlan_cb(struct qeth_card *card,
5526                                struct qeth_reply *reply,
5527                                unsigned long data)
5528 {
5529         struct qeth_ipa_cmd *cmd;
5530
5531         QETH_DBF_TEXT(trace, 2, "L2sdvcb");
5532         cmd = (struct qeth_ipa_cmd *) data;
5533         if (cmd->hdr.return_code) {
5534                 PRINT_ERR("Error in processing VLAN %i on %s: 0x%x. "
5535                           "Continuing\n",cmd->data.setdelvlan.vlan_id,
5536                           QETH_CARD_IFNAME(card), cmd->hdr.return_code);
5537                 QETH_DBF_TEXT_(trace, 2, "L2VL%4x", cmd->hdr.command);
5538                 QETH_DBF_TEXT_(trace, 2, "L2%s", CARD_BUS_ID(card));
5539                 QETH_DBF_TEXT_(trace, 2, "err%d", cmd->hdr.return_code);
5540         }
5541         return 0;
5542 }
5543
5544 static int
5545 qeth_layer2_send_setdelvlan(struct qeth_card *card, __u16 i,
5546                             enum qeth_ipa_cmds ipacmd)
5547 {
5548         struct qeth_ipa_cmd *cmd;
5549         struct qeth_cmd_buffer *iob;
5550
5551         QETH_DBF_TEXT_(trace, 4, "L2sdv%x",ipacmd);
5552         iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
5553         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
5554         cmd->data.setdelvlan.vlan_id = i;
5555         return qeth_send_ipa_cmd(card, iob,
5556                                  qeth_layer2_send_setdelvlan_cb, NULL);
5557 }
5558
5559 static void
5560 qeth_layer2_process_vlans(struct qeth_card *card, int clear)
5561 {
5562         unsigned short  i;
5563
5564         QETH_DBF_TEXT(trace, 3, "L2prcvln");
5565
5566         if (!card->vlangrp)
5567                 return;
5568         for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
5569                 if (vlan_group_get_device(card->vlangrp, i) == NULL)
5570                         continue;
5571                 if (clear)
5572                         qeth_layer2_send_setdelvlan(card, i, IPA_CMD_DELVLAN);
5573                 else
5574                         qeth_layer2_send_setdelvlan(card, i, IPA_CMD_SETVLAN);
5575         }
5576 }
5577
5578 /*add_vid is layer 2 used only ....*/
5579 static void
5580 qeth_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
5581 {
5582         struct qeth_card *card;
5583
5584         QETH_DBF_TEXT_(trace, 4, "aid:%d", vid);
5585
5586         card = (struct qeth_card *) dev->priv;
5587         if (!card->options.layer2)
5588                 return;
5589         qeth_layer2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN);
5590 }
5591
5592 /*... kill_vid used for both modes*/
5593 static void
5594 qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
5595 {
5596         struct qeth_card *card;
5597         unsigned long flags;
5598
5599         QETH_DBF_TEXT_(trace, 4, "kid:%d", vid);
5600
5601         card = (struct qeth_card *) dev->priv;
5602         /* free all skbs for the vlan device */
5603         qeth_free_vlan_skbs(card, vid);
5604         spin_lock_irqsave(&card->vlanlock, flags);
5605         /* unregister IP addresses of vlan device */
5606         qeth_free_vlan_addresses(card, vid);
5607         vlan_group_set_device(card->vlangrp, vid, NULL);
5608         spin_unlock_irqrestore(&card->vlanlock, flags);
5609         if (card->options.layer2)
5610                 qeth_layer2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN);
5611         qeth_set_multicast_list(card->dev);
5612 }
5613 #endif
5614 /**
5615  * Examine hardware response to SET_PROMISC_MODE
5616  */
5617 static int
5618 qeth_setadp_promisc_mode_cb(struct qeth_card *card,
5619                             struct qeth_reply *reply,
5620                             unsigned long data)
5621 {
5622         struct qeth_ipa_cmd *cmd;
5623         struct qeth_ipacmd_setadpparms *setparms;
5624
5625         QETH_DBF_TEXT(trace,4,"prmadpcb");
5626
5627         cmd = (struct qeth_ipa_cmd *) data;
5628         setparms = &(cmd->data.setadapterparms);
5629
5630         qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
5631         if (cmd->hdr.return_code) {
5632                 QETH_DBF_TEXT_(trace,4,"prmrc%2.2x",cmd->hdr.return_code);
5633                 setparms->data.mode = SET_PROMISC_MODE_OFF;
5634         }
5635         card->info.promisc_mode = setparms->data.mode;
5636         return 0;
5637 }
5638 /*
5639  * Set promiscuous mode (on or off) (SET_PROMISC_MODE command)
5640  */
5641 static void
5642 qeth_setadp_promisc_mode(struct qeth_card *card)
5643 {
5644         enum qeth_ipa_promisc_modes mode;
5645         struct net_device *dev = card->dev;
5646         struct qeth_cmd_buffer *iob;
5647         struct qeth_ipa_cmd *cmd;
5648
5649         QETH_DBF_TEXT(trace, 4, "setprom");
5650
5651         if (((dev->flags & IFF_PROMISC) &&
5652              (card->info.promisc_mode == SET_PROMISC_MODE_ON)) ||
5653             (!(dev->flags & IFF_PROMISC) &&
5654              (card->info.promisc_mode == SET_PROMISC_MODE_OFF)))
5655                 return;
5656         mode = SET_PROMISC_MODE_OFF;
5657         if (dev->flags & IFF_PROMISC)
5658                 mode = SET_PROMISC_MODE_ON;
5659         QETH_DBF_TEXT_(trace, 4, "mode:%x", mode);
5660
5661         iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE,
5662                         sizeof(struct qeth_ipacmd_setadpparms));
5663         cmd = (struct qeth_ipa_cmd *)(iob->data + IPA_PDU_HEADER_SIZE);
5664         cmd->data.setadapterparms.data.mode = mode;
5665         qeth_send_ipa_cmd(card, iob, qeth_setadp_promisc_mode_cb, NULL);
5666 }
5667
5668 /**
5669  * set multicast address on card
5670  */
5671 static void
5672 qeth_set_multicast_list(struct net_device *dev)
5673 {
5674         struct qeth_card *card = (struct qeth_card *) dev->priv;
5675
5676         if (card->info.type == QETH_CARD_TYPE_OSN)
5677                 return ;
5678
5679         QETH_DBF_TEXT(trace, 3, "setmulti");
5680         qeth_delete_mc_addresses(card);
5681         if (card->options.layer2) {
5682                 qeth_layer2_add_multicast(card);
5683                 goto out;
5684         }
5685         qeth_add_multicast_ipv4(card);
5686 #ifdef CONFIG_QETH_IPV6
5687         qeth_add_multicast_ipv6(card);
5688 #endif
5689 out:
5690         qeth_set_ip_addr_list(card);
5691         if (!qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
5692                 return;
5693         qeth_setadp_promisc_mode(card);
5694 }
5695
5696 static int
5697 qeth_neigh_setup(struct net_device *dev, struct neigh_parms *np)
5698 {
5699         return 0;
5700 }
5701
5702 static void
5703 qeth_get_mac_for_ipm(__u32 ipm, char *mac, struct net_device *dev)
5704 {
5705         if (dev->type == ARPHRD_IEEE802_TR)
5706                 ip_tr_mc_map(ipm, mac);
5707         else
5708                 ip_eth_mc_map(ipm, mac);
5709 }
5710
5711 static struct qeth_ipaddr *
5712 qeth_get_addr_buffer(enum qeth_prot_versions prot)
5713 {
5714         struct qeth_ipaddr *addr;
5715
5716         addr = kzalloc(sizeof(struct qeth_ipaddr), GFP_ATOMIC);
5717         if (addr == NULL) {
5718                 PRINT_WARN("Not enough memory to add address\n");
5719                 return NULL;
5720         }
5721         addr->type = QETH_IP_TYPE_NORMAL;
5722         addr->proto = prot;
5723         return addr;
5724 }
5725
5726 int
5727 qeth_osn_assist(struct net_device *dev,
5728                 void *data,
5729                 int data_len)
5730 {
5731         struct qeth_cmd_buffer *iob;
5732         struct qeth_card *card;
5733         int rc;
5734
5735         QETH_DBF_TEXT(trace, 2, "osnsdmc");
5736         if (!dev)
5737                 return -ENODEV;
5738         card = (struct qeth_card *)dev->priv;
5739         if (!card)
5740                 return -ENODEV;
5741         if ((card->state != CARD_STATE_UP) &&
5742             (card->state != CARD_STATE_SOFTSETUP))
5743                 return -ENODEV;
5744         iob = qeth_wait_for_buffer(&card->write);
5745         memcpy(iob->data+IPA_PDU_HEADER_SIZE, data, data_len);
5746         rc = qeth_osn_send_ipa_cmd(card, iob, data_len);
5747         return rc;
5748 }
5749
5750 static struct net_device *
5751 qeth_netdev_by_devno(unsigned char *read_dev_no)
5752 {
5753         struct qeth_card *card;
5754         struct net_device *ndev;
5755         unsigned char *readno;
5756         __u16 temp_dev_no, card_dev_no;
5757         char *endp;
5758         unsigned long flags;
5759
5760         ndev = NULL;
5761         memcpy(&temp_dev_no, read_dev_no, 2);
5762         read_lock_irqsave(&qeth_card_list.rwlock, flags);
5763         list_for_each_entry(card, &qeth_card_list.list, list) {
5764                 readno = CARD_RDEV_ID(card);
5765                 readno += (strlen(readno) - 4);
5766                 card_dev_no = simple_strtoul(readno, &endp, 16);
5767                 if (card_dev_no == temp_dev_no) {
5768                         ndev = card->dev;
5769                         break;
5770                 }
5771         }
5772         read_unlock_irqrestore(&qeth_card_list.rwlock, flags);
5773         return ndev;
5774 }
5775
5776 int
5777 qeth_osn_register(unsigned char *read_dev_no,
5778                   struct net_device **dev,
5779                   int (*assist_cb)(struct net_device *, void *),
5780                   int (*data_cb)(struct sk_buff *))
5781 {
5782         struct qeth_card * card;
5783
5784         QETH_DBF_TEXT(trace, 2, "osnreg");
5785         *dev = qeth_netdev_by_devno(read_dev_no);
5786         if (*dev == NULL)
5787                 return -ENODEV;
5788         card = (struct qeth_card *)(*dev)->priv;
5789         if (!card)
5790                 return -ENODEV;
5791         if ((assist_cb == NULL) || (data_cb == NULL))
5792                 return -EINVAL;
5793         card->osn_info.assist_cb = assist_cb;
5794         card->osn_info.data_cb = data_cb;
5795         return 0;
5796 }
5797
5798 void
5799 qeth_osn_deregister(struct net_device * dev)
5800 {
5801         struct qeth_card *card;
5802
5803         QETH_DBF_TEXT(trace, 2, "osndereg");
5804         if (!dev)
5805                 return;
5806         card = (struct qeth_card *)dev->priv;
5807         if (!card)
5808                 return;
5809         card->osn_info.assist_cb = NULL;
5810         card->osn_info.data_cb = NULL;
5811         return;
5812 }
5813
5814 static void
5815 qeth_delete_mc_addresses(struct qeth_card *card)
5816 {
5817         struct qeth_ipaddr *iptodo;
5818         unsigned long flags;
5819
5820         QETH_DBF_TEXT(trace,4,"delmc");
5821         iptodo = qeth_get_addr_buffer(QETH_PROT_IPV4);
5822         if (!iptodo) {
5823                 QETH_DBF_TEXT(trace, 2, "dmcnomem");
5824                 return;
5825         }
5826         iptodo->type = QETH_IP_TYPE_DEL_ALL_MC;
5827         spin_lock_irqsave(&card->ip_lock, flags);
5828         if (!__qeth_insert_ip_todo(card, iptodo, 0))
5829                 kfree(iptodo);
5830         spin_unlock_irqrestore(&card->ip_lock, flags);
5831 }
5832
5833 static void
5834 qeth_add_mc(struct qeth_card *card, struct in_device *in4_dev)
5835 {
5836         struct qeth_ipaddr *ipm;
5837         struct ip_mc_list *im4;
5838         char buf[MAX_ADDR_LEN];
5839
5840         QETH_DBF_TEXT(trace,4,"addmc");
5841         for (im4 = in4_dev->mc_list; im4; im4 = im4->next) {
5842                 qeth_get_mac_for_ipm(im4->multiaddr, buf, in4_dev->dev);
5843                 ipm = qeth_get_addr_buffer(QETH_PROT_IPV4);
5844                 if (!ipm)
5845                         continue;
5846                 ipm->u.a4.addr = im4->multiaddr;
5847                 memcpy(ipm->mac,buf,OSA_ADDR_LEN);
5848                 ipm->is_multicast = 1;
5849                 if (!qeth_add_ip(card,ipm))
5850                         kfree(ipm);
5851         }
5852 }
5853
5854 static inline void
5855 qeth_add_vlan_mc(struct qeth_card *card)
5856 {
5857 #ifdef CONFIG_QETH_VLAN
5858         struct in_device *in_dev;
5859         struct vlan_group *vg;
5860         int i;
5861
5862         QETH_DBF_TEXT(trace,4,"addmcvl");
5863         if ( ((card->options.layer2 == 0) &&
5864               (!qeth_is_supported(card,IPA_FULL_VLAN))) ||
5865              (card->vlangrp == NULL) )
5866                 return ;
5867
5868         vg = card->vlangrp;
5869         for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
5870                 struct net_device *netdev = vlan_group_get_device(vg, i);
5871                 if (netdev == NULL ||
5872                     !(netdev->flags & IFF_UP))
5873                         continue;
5874                 in_dev = in_dev_get(netdev);
5875                 if (!in_dev)
5876                         continue;
5877                 read_lock(&in_dev->mc_list_lock);
5878                 qeth_add_mc(card,in_dev);
5879                 read_unlock(&in_dev->mc_list_lock);
5880                 in_dev_put(in_dev);
5881         }
5882 #endif
5883 }
5884
5885 static void
5886 qeth_add_multicast_ipv4(struct qeth_card *card)
5887 {
5888         struct in_device *in4_dev;
5889
5890         QETH_DBF_TEXT(trace,4,"chkmcv4");
5891         in4_dev = in_dev_get(card->dev);
5892         if (in4_dev == NULL)
5893                 return;
5894         read_lock(&in4_dev->mc_list_lock);
5895         qeth_add_mc(card, in4_dev);
5896         qeth_add_vlan_mc(card);
5897         read_unlock(&in4_dev->mc_list_lock);
5898         in_dev_put(in4_dev);
5899 }
5900
5901 static void
5902 qeth_layer2_add_multicast(struct qeth_card *card)
5903 {
5904         struct qeth_ipaddr *ipm;
5905         struct dev_mc_list *dm;
5906
5907         QETH_DBF_TEXT(trace,4,"L2addmc");
5908         for (dm = card->dev->mc_list; dm; dm = dm->next) {
5909                 ipm = qeth_get_addr_buffer(QETH_PROT_IPV4);
5910                 if (!ipm)
5911                         continue;
5912                 memcpy(ipm->mac,dm->dmi_addr,MAX_ADDR_LEN);
5913                 ipm->is_multicast = 1;
5914                 if (!qeth_add_ip(card, ipm))
5915                         kfree(ipm);
5916         }
5917 }
5918
5919 #ifdef CONFIG_QETH_IPV6
5920 static void
5921 qeth_add_mc6(struct qeth_card *card, struct inet6_dev *in6_dev)
5922 {
5923         struct qeth_ipaddr *ipm;
5924         struct ifmcaddr6 *im6;
5925         char buf[MAX_ADDR_LEN];
5926
5927         QETH_DBF_TEXT(trace,4,"addmc6");
5928         for (im6 = in6_dev->mc_list; im6 != NULL; im6 = im6->next) {
5929                 ndisc_mc_map(&im6->mca_addr, buf, in6_dev->dev, 0);
5930                 ipm = qeth_get_addr_buffer(QETH_PROT_IPV6);
5931                 if (!ipm)
5932                         continue;
5933                 ipm->is_multicast = 1;
5934                 memcpy(ipm->mac,buf,OSA_ADDR_LEN);
5935                 memcpy(&ipm->u.a6.addr,&im6->mca_addr.s6_addr,
5936                        sizeof(struct in6_addr));
5937                 if (!qeth_add_ip(card,ipm))
5938                         kfree(ipm);
5939         }
5940 }
5941
5942 static inline void
5943 qeth_add_vlan_mc6(struct qeth_card *card)
5944 {
5945 #ifdef CONFIG_QETH_VLAN
5946         struct inet6_dev *in_dev;
5947         struct vlan_group *vg;
5948         int i;
5949
5950         QETH_DBF_TEXT(trace,4,"admc6vl");
5951         if ( ((card->options.layer2 == 0) &&
5952               (!qeth_is_supported(card,IPA_FULL_VLAN))) ||
5953              (card->vlangrp == NULL))
5954                 return ;
5955
5956         vg = card->vlangrp;
5957         for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
5958                 struct net_device *netdev = vlan_group_get_device(vg, i);
5959                 if (netdev == NULL ||
5960                     !(netdev->flags & IFF_UP))
5961                         continue;
5962                 in_dev = in6_dev_get(netdev);
5963                 if (!in_dev)
5964                         continue;
5965                 read_lock_bh(&in_dev->lock);
5966                 qeth_add_mc6(card,in_dev);
5967                 read_unlock_bh(&in_dev->lock);
5968                 in6_dev_put(in_dev);
5969         }
5970 #endif /* CONFIG_QETH_VLAN */
5971 }
5972
5973 static void
5974 qeth_add_multicast_ipv6(struct qeth_card *card)
5975 {
5976         struct inet6_dev *in6_dev;
5977
5978         QETH_DBF_TEXT(trace,4,"chkmcv6");
5979         if (!qeth_is_supported(card, IPA_IPV6))
5980                 return ;
5981         in6_dev = in6_dev_get(card->dev);
5982         if (in6_dev == NULL)
5983                 return;
5984         read_lock_bh(&in6_dev->lock);
5985         qeth_add_mc6(card, in6_dev);
5986         qeth_add_vlan_mc6(card);
5987         read_unlock_bh(&in6_dev->lock);
5988         in6_dev_put(in6_dev);
5989 }
5990 #endif /* CONFIG_QETH_IPV6 */
5991
5992 static int
5993 qeth_layer2_send_setdelmac(struct qeth_card *card, __u8 *mac,
5994                            enum qeth_ipa_cmds ipacmd,
5995                            int (*reply_cb) (struct qeth_card *,
5996                                             struct qeth_reply*,
5997                                             unsigned long))
5998 {
5999         struct qeth_ipa_cmd *cmd;
6000         struct qeth_cmd_buffer *iob;
6001
6002         QETH_DBF_TEXT(trace, 2, "L2sdmac");
6003         iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
6004         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
6005         cmd->data.setdelmac.mac_length = OSA_ADDR_LEN;
6006         memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN);
6007         return qeth_send_ipa_cmd(card, iob, reply_cb, NULL);
6008 }
6009
6010 static int
6011 qeth_layer2_send_setgroupmac_cb(struct qeth_card *card,
6012                                 struct qeth_reply *reply,
6013                                 unsigned long data)
6014 {
6015         struct qeth_ipa_cmd *cmd;
6016         __u8 *mac;
6017
6018         QETH_DBF_TEXT(trace, 2, "L2Sgmacb");
6019         cmd = (struct qeth_ipa_cmd *) data;
6020         mac = &cmd->data.setdelmac.mac[0];
6021         /* MAC already registered, needed in couple/uncouple case */
6022         if (cmd->hdr.return_code == 0x2005) {
6023                 PRINT_WARN("Group MAC %02x:%02x:%02x:%02x:%02x:%02x " \
6024                           "already existing on %s \n",
6025                           mac[0], mac[1], mac[2], mac[3], mac[4], mac[5],
6026                           QETH_CARD_IFNAME(card));
6027                 cmd->hdr.return_code = 0;
6028         }
6029         if (cmd->hdr.return_code)
6030                 PRINT_ERR("Could not set group MAC " \
6031                           "%02x:%02x:%02x:%02x:%02x:%02x on %s: %x\n",
6032                           mac[0], mac[1], mac[2], mac[3], mac[4], mac[5],
6033                           QETH_CARD_IFNAME(card),cmd->hdr.return_code);
6034         return 0;
6035 }
6036
6037 static int
6038 qeth_layer2_send_setgroupmac(struct qeth_card *card, __u8 *mac)
6039 {
6040         QETH_DBF_TEXT(trace, 2, "L2Sgmac");
6041         return qeth_layer2_send_setdelmac(card, mac, IPA_CMD_SETGMAC,
6042                                           qeth_layer2_send_setgroupmac_cb);
6043 }
6044
6045 static int
6046 qeth_layer2_send_delgroupmac_cb(struct qeth_card *card,
6047                                 struct qeth_reply *reply,
6048                                 unsigned long data)
6049 {
6050         struct qeth_ipa_cmd *cmd;
6051         __u8 *mac;
6052
6053         QETH_DBF_TEXT(trace, 2, "L2Dgmacb");
6054         cmd = (struct qeth_ipa_cmd *) data;
6055         mac = &cmd->data.setdelmac.mac[0];
6056         if (cmd->hdr.return_code)
6057                 PRINT_ERR("Could not delete group MAC " \
6058                           "%02x:%02x:%02x:%02x:%02x:%02x on %s: %x\n",
6059                           mac[0], mac[1], mac[2], mac[3], mac[4], mac[5],
6060                           QETH_CARD_IFNAME(card), cmd->hdr.return_code);
6061         return 0;
6062 }
6063
6064 static int
6065 qeth_layer2_send_delgroupmac(struct qeth_card *card, __u8 *mac)
6066 {
6067         QETH_DBF_TEXT(trace, 2, "L2Dgmac");
6068         return qeth_layer2_send_setdelmac(card, mac, IPA_CMD_DELGMAC,
6069                                           qeth_layer2_send_delgroupmac_cb);
6070 }
6071
6072 static int
6073 qeth_layer2_send_setmac_cb(struct qeth_card *card,
6074                            struct qeth_reply *reply,
6075                            unsigned long data)
6076 {
6077         struct qeth_ipa_cmd *cmd;
6078
6079         QETH_DBF_TEXT(trace, 2, "L2Smaccb");
6080         cmd = (struct qeth_ipa_cmd *) data;
6081         if (cmd->hdr.return_code) {
6082                 QETH_DBF_TEXT_(trace, 2, "L2er%x", cmd->hdr.return_code);
6083                 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
6084                 cmd->hdr.return_code = -EIO;
6085         } else {
6086                 card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED;
6087                 memcpy(card->dev->dev_addr,cmd->data.setdelmac.mac,
6088                        OSA_ADDR_LEN);
6089                 PRINT_INFO("MAC address %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x "
6090                            "successfully registered on device %s\n",
6091                            card->dev->dev_addr[0], card->dev->dev_addr[1],
6092                            card->dev->dev_addr[2], card->dev->dev_addr[3],
6093                            card->dev->dev_addr[4], card->dev->dev_addr[5],
6094                            card->dev->name);
6095         }
6096         return 0;
6097 }
6098
6099 static int
6100 qeth_layer2_send_setmac(struct qeth_card *card, __u8 *mac)
6101 {
6102         QETH_DBF_TEXT(trace, 2, "L2Setmac");
6103         return qeth_layer2_send_setdelmac(card, mac, IPA_CMD_SETVMAC,
6104                                           qeth_layer2_send_setmac_cb);
6105 }
6106
6107 static int
6108 qeth_layer2_send_delmac_cb(struct qeth_card *card,
6109                            struct qeth_reply *reply,
6110                            unsigned long data)
6111 {
6112         struct qeth_ipa_cmd *cmd;
6113
6114         QETH_DBF_TEXT(trace, 2, "L2Dmaccb");
6115         cmd = (struct qeth_ipa_cmd *) data;
6116         if (cmd->hdr.return_code) {
6117                 QETH_DBF_TEXT_(trace, 2, "err%d", cmd->hdr.return_code);
6118                 cmd->hdr.return_code = -EIO;
6119                 return 0;
6120         }
6121         card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
6122
6123         return 0;
6124 }
6125 static int
6126 qeth_layer2_send_delmac(struct qeth_card *card, __u8 *mac)
6127 {
6128         QETH_DBF_TEXT(trace, 2, "L2Delmac");
6129         if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))
6130                 return 0;
6131         return qeth_layer2_send_setdelmac(card, mac, IPA_CMD_DELVMAC,
6132                                           qeth_layer2_send_delmac_cb);
6133 }
6134
6135 static int
6136 qeth_layer2_set_mac_address(struct net_device *dev, void *p)
6137 {
6138         struct sockaddr *addr = p;
6139         struct qeth_card *card;
6140         int rc = 0;
6141
6142         QETH_DBF_TEXT(trace, 3, "setmac");
6143
6144         if (qeth_verify_dev(dev) != QETH_REAL_CARD) {
6145                 QETH_DBF_TEXT(trace, 3, "setmcINV");
6146                 return -EOPNOTSUPP;
6147         }
6148         card = (struct qeth_card *) dev->priv;
6149
6150         if (!card->options.layer2) {
6151                 PRINT_WARN("Setting MAC address on %s is not supported "
6152                            "in Layer 3 mode.\n", dev->name);
6153                 QETH_DBF_TEXT(trace, 3, "setmcLY3");
6154                 return -EOPNOTSUPP;
6155         }
6156         if (card->info.type == QETH_CARD_TYPE_OSN) {
6157                 PRINT_WARN("Setting MAC address on %s is not supported.\n",
6158                            dev->name);
6159                 QETH_DBF_TEXT(trace, 3, "setmcOSN");
6160                 return -EOPNOTSUPP;
6161         }
6162         QETH_DBF_TEXT_(trace, 3, "%s", CARD_BUS_ID(card));
6163         QETH_DBF_HEX(trace, 3, addr->sa_data, OSA_ADDR_LEN);
6164         rc = qeth_layer2_send_delmac(card, &card->dev->dev_addr[0]);
6165         if (!rc)
6166                 rc = qeth_layer2_send_setmac(card, addr->sa_data);
6167         return rc;
6168 }
6169
6170 static void
6171 qeth_fill_ipacmd_header(struct qeth_card *card, struct qeth_ipa_cmd *cmd,
6172                         __u8 command, enum qeth_prot_versions prot)
6173 {
6174         memset(cmd, 0, sizeof (struct qeth_ipa_cmd));
6175         cmd->hdr.command = command;
6176         cmd->hdr.initiator = IPA_CMD_INITIATOR_HOST;
6177         cmd->hdr.seqno = card->seqno.ipa;
6178         cmd->hdr.adapter_type = qeth_get_ipa_adp_type(card->info.link_type);
6179         cmd->hdr.rel_adapter_no = (__u8) card->info.portno;
6180         if (card->options.layer2)
6181                 cmd->hdr.prim_version_no = 2;
6182         else
6183                 cmd->hdr.prim_version_no = 1;
6184         cmd->hdr.param_count = 1;
6185         cmd->hdr.prot_version = prot;
6186         cmd->hdr.ipa_supported = 0;
6187         cmd->hdr.ipa_enabled = 0;
6188 }
6189
6190 static struct qeth_cmd_buffer *
6191 qeth_get_ipacmd_buffer(struct qeth_card *card, enum qeth_ipa_cmds ipacmd,
6192                        enum qeth_prot_versions prot)
6193 {
6194         struct qeth_cmd_buffer *iob;
6195         struct qeth_ipa_cmd *cmd;
6196
6197         iob = qeth_wait_for_buffer(&card->write);
6198         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
6199         qeth_fill_ipacmd_header(card, cmd, ipacmd, prot);
6200
6201         return iob;
6202 }
6203
6204 static int
6205 qeth_send_setdelmc(struct qeth_card *card, struct qeth_ipaddr *addr, int ipacmd)
6206 {
6207         int rc;
6208         struct qeth_cmd_buffer *iob;
6209         struct qeth_ipa_cmd *cmd;
6210
6211         QETH_DBF_TEXT(trace,4,"setdelmc");
6212
6213         iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto);
6214         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
6215         memcpy(&cmd->data.setdelipm.mac,addr->mac, OSA_ADDR_LEN);
6216         if (addr->proto == QETH_PROT_IPV6)
6217                 memcpy(cmd->data.setdelipm.ip6, &addr->u.a6.addr,
6218                        sizeof(struct in6_addr));
6219         else
6220                 memcpy(&cmd->data.setdelipm.ip4, &addr->u.a4.addr,4);
6221
6222         rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
6223
6224         return rc;
6225 }
6226 static void
6227 qeth_fill_netmask(u8 *netmask, unsigned int len)
6228 {
6229         int i,j;
6230         for (i=0;i<16;i++) {
6231                 j=(len)-(i*8);
6232                 if (j >= 8)
6233                         netmask[i] = 0xff;
6234                 else if (j > 0)
6235                         netmask[i] = (u8)(0xFF00>>j);
6236                 else
6237                         netmask[i] = 0;
6238         }
6239 }
6240
6241 static int
6242 qeth_send_setdelip(struct qeth_card *card, struct qeth_ipaddr *addr,
6243                    int ipacmd, unsigned int flags)
6244 {
6245         int rc;
6246         struct qeth_cmd_buffer *iob;
6247         struct qeth_ipa_cmd *cmd;
6248         __u8 netmask[16];
6249
6250         QETH_DBF_TEXT(trace,4,"setdelip");
6251         QETH_DBF_TEXT_(trace,4,"flags%02X", flags);
6252
6253         iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto);
6254         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
6255         if (addr->proto == QETH_PROT_IPV6) {
6256                 memcpy(cmd->data.setdelip6.ip_addr, &addr->u.a6.addr,
6257                        sizeof(struct in6_addr));
6258                 qeth_fill_netmask(netmask,addr->u.a6.pfxlen);
6259                 memcpy(cmd->data.setdelip6.mask, netmask,
6260                        sizeof(struct in6_addr));
6261                 cmd->data.setdelip6.flags = flags;
6262         } else {
6263                 memcpy(cmd->data.setdelip4.ip_addr, &addr->u.a4.addr, 4);
6264                 memcpy(cmd->data.setdelip4.mask, &addr->u.a4.mask, 4);
6265                 cmd->data.setdelip4.flags = flags;
6266         }
6267
6268         rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
6269
6270         return rc;
6271 }
6272
6273 static int
6274 qeth_layer2_register_addr_entry(struct qeth_card *card,
6275                                 struct qeth_ipaddr *addr)
6276 {
6277         if (!addr->is_multicast)
6278                 return 0;
6279         QETH_DBF_TEXT(trace, 2, "setgmac");
6280         QETH_DBF_HEX(trace,3,&addr->mac[0],OSA_ADDR_LEN);
6281         return qeth_layer2_send_setgroupmac(card, &addr->mac[0]);
6282 }
6283
6284 static int
6285 qeth_layer2_deregister_addr_entry(struct qeth_card *card,
6286                                   struct qeth_ipaddr *addr)
6287 {
6288         if (!addr->is_multicast)
6289                 return 0;
6290         QETH_DBF_TEXT(trace, 2, "delgmac");
6291         QETH_DBF_HEX(trace,3,&addr->mac[0],OSA_ADDR_LEN);
6292         return qeth_layer2_send_delgroupmac(card, &addr->mac[0]);
6293 }
6294
6295 static int
6296 qeth_layer3_register_addr_entry(struct qeth_card *card,
6297                                 struct qeth_ipaddr *addr)
6298 {
6299         char buf[50];
6300         int rc;
6301         int cnt = 3;
6302
6303         if (addr->proto == QETH_PROT_IPV4) {
6304                 QETH_DBF_TEXT(trace, 2,"setaddr4");
6305                 QETH_DBF_HEX(trace, 3, &addr->u.a4.addr, sizeof(int));
6306         } else if (addr->proto == QETH_PROT_IPV6) {
6307                 QETH_DBF_TEXT(trace, 2, "setaddr6");
6308                 QETH_DBF_HEX(trace,3,&addr->u.a6.addr,8);
6309                 QETH_DBF_HEX(trace,3,((char *)&addr->u.a6.addr)+8,8);
6310         } else {
6311                 QETH_DBF_TEXT(trace, 2, "setaddr?");
6312                 QETH_DBF_HEX(trace, 3, addr, sizeof(struct qeth_ipaddr));
6313         }
6314         do {
6315                 if (addr->is_multicast)
6316                         rc =  qeth_send_setdelmc(card, addr, IPA_CMD_SETIPM);
6317                 else
6318                         rc = qeth_send_setdelip(card, addr, IPA_CMD_SETIP,
6319                                         addr->set_flags);
6320                 if (rc)
6321                         QETH_DBF_TEXT(trace, 2, "failed");
6322         } while ((--cnt > 0) && rc);
6323         if (rc){
6324                 QETH_DBF_TEXT(trace, 2, "FAILED");
6325                 qeth_ipaddr_to_string(addr->proto, (u8 *)&addr->u, buf);
6326                 PRINT_WARN("Could not register IP address %s (rc=0x%x/%d)\n",
6327                            buf, rc, rc);
6328         }
6329         return rc;
6330 }
6331
6332 static int
6333 qeth_layer3_deregister_addr_entry(struct qeth_card *card,
6334                                   struct qeth_ipaddr *addr)
6335 {
6336         //char buf[50];
6337         int rc;
6338
6339         if (addr->proto == QETH_PROT_IPV4) {
6340                 QETH_DBF_TEXT(trace, 2,"deladdr4");
6341                 QETH_DBF_HEX(trace, 3, &addr->u.a4.addr, sizeof(int));
6342         } else if (addr->proto == QETH_PROT_IPV6) {
6343                 QETH_DBF_TEXT(trace, 2, "deladdr6");
6344                 QETH_DBF_HEX(trace,3,&addr->u.a6.addr,8);
6345                 QETH_DBF_HEX(trace,3,((char *)&addr->u.a6.addr)+8,8);
6346         } else {
6347                 QETH_DBF_TEXT(trace, 2, "deladdr?");
6348                 QETH_DBF_HEX(trace, 3, addr, sizeof(struct qeth_ipaddr));
6349         }
6350         if (addr->is_multicast)
6351                 rc = qeth_send_setdelmc(card, addr, IPA_CMD_DELIPM);
6352         else
6353                 rc = qeth_send_setdelip(card, addr, IPA_CMD_DELIP,
6354                                         addr->del_flags);
6355         if (rc) {
6356                 QETH_DBF_TEXT(trace, 2, "failed");
6357                 /* TODO: re-activate this warning as soon as we have a
6358                  * clean mirco code
6359                 qeth_ipaddr_to_string(addr->proto, (u8 *)&addr->u, buf);
6360                 PRINT_WARN("Could not deregister IP address %s (rc=%x)\n",
6361                            buf, rc);
6362                 */
6363         }
6364         return rc;
6365 }
6366
6367 static int
6368 qeth_register_addr_entry(struct qeth_card *card, struct qeth_ipaddr *addr)
6369 {
6370         if (card->options.layer2)
6371                 return qeth_layer2_register_addr_entry(card, addr);
6372
6373         return qeth_layer3_register_addr_entry(card, addr);
6374 }
6375
6376 static int
6377 qeth_deregister_addr_entry(struct qeth_card *card, struct qeth_ipaddr *addr)
6378 {
6379         if (card->options.layer2)
6380                 return qeth_layer2_deregister_addr_entry(card, addr);
6381
6382         return qeth_layer3_deregister_addr_entry(card, addr);
6383 }
6384
6385 static u32
6386 qeth_ethtool_get_tx_csum(struct net_device *dev)
6387 {
6388         /* We may need to say that we support tx csum offload if
6389          * we do EDDP or TSO. There are discussions going on to
6390          * enforce rules in the stack and in ethtool that make
6391          * SG and TSO depend on HW_CSUM. At the moment there are
6392          * no such rules....
6393          * If we say yes here, we have to checksum outbound packets
6394          * any time. */
6395         return 0;
6396 }
6397
6398 static int
6399 qeth_ethtool_set_tx_csum(struct net_device *dev, u32 data)
6400 {
6401         return -EINVAL;
6402 }
6403
6404 static u32
6405 qeth_ethtool_get_rx_csum(struct net_device *dev)
6406 {
6407         struct qeth_card *card = (struct qeth_card *)dev->priv;
6408
6409         return (card->options.checksum_type == HW_CHECKSUMMING);
6410 }
6411
6412 static int
6413 qeth_ethtool_set_rx_csum(struct net_device *dev, u32 data)
6414 {
6415         struct qeth_card *card = (struct qeth_card *)dev->priv;
6416
6417         if ((card->state != CARD_STATE_DOWN) &&
6418             (card->state != CARD_STATE_RECOVER))
6419                 return -EPERM;
6420         if (data)
6421                 card->options.checksum_type = HW_CHECKSUMMING;
6422         else
6423                 card->options.checksum_type = SW_CHECKSUMMING;
6424         return 0;
6425 }
6426
6427 static u32
6428 qeth_ethtool_get_sg(struct net_device *dev)
6429 {
6430         struct qeth_card *card = (struct qeth_card *)dev->priv;
6431
6432         return ((card->options.large_send != QETH_LARGE_SEND_NO) &&
6433                 (dev->features & NETIF_F_SG));
6434 }
6435
6436 static int
6437 qeth_ethtool_set_sg(struct net_device *dev, u32 data)
6438 {
6439         struct qeth_card *card = (struct qeth_card *)dev->priv;
6440
6441         if (data) {
6442                 if (card->options.large_send != QETH_LARGE_SEND_NO)
6443                         dev->features |= NETIF_F_SG;
6444                 else {
6445                         dev->features &= ~NETIF_F_SG;
6446                         return -EINVAL;
6447                 }
6448         } else
6449                 dev->features &= ~NETIF_F_SG;
6450         return 0;
6451 }
6452
6453 static u32
6454 qeth_ethtool_get_tso(struct net_device *dev)
6455 {
6456         struct qeth_card *card = (struct qeth_card *)dev->priv;
6457
6458         return ((card->options.large_send != QETH_LARGE_SEND_NO) &&
6459                 (dev->features & NETIF_F_TSO));
6460 }
6461
6462 static int
6463 qeth_ethtool_set_tso(struct net_device *dev, u32 data)
6464 {
6465         struct qeth_card *card = (struct qeth_card *)dev->priv;
6466
6467         if (data) {
6468                 if (card->options.large_send != QETH_LARGE_SEND_NO)
6469                         dev->features |= NETIF_F_TSO;
6470                 else {
6471                         dev->features &= ~NETIF_F_TSO;
6472                         return -EINVAL;
6473                 }
6474         } else
6475                 dev->features &= ~NETIF_F_TSO;
6476         return 0;
6477 }
6478
6479 static struct ethtool_ops qeth_ethtool_ops = {
6480         .get_tx_csum = qeth_ethtool_get_tx_csum,
6481         .set_tx_csum = qeth_ethtool_set_tx_csum,
6482         .get_rx_csum = qeth_ethtool_get_rx_csum,
6483         .set_rx_csum = qeth_ethtool_set_rx_csum,
6484         .get_sg      = qeth_ethtool_get_sg,
6485         .set_sg      = qeth_ethtool_set_sg,
6486         .get_tso     = qeth_ethtool_get_tso,
6487         .set_tso     = qeth_ethtool_set_tso,
6488 };
6489
6490 static int
6491 qeth_hard_header_parse(struct sk_buff *skb, unsigned char *haddr)
6492 {
6493         struct qeth_card *card;
6494         struct ethhdr *eth;
6495
6496         card = qeth_get_card_from_dev(skb->dev);
6497         if (card->options.layer2)
6498                 goto haveheader;
6499 #ifdef CONFIG_QETH_IPV6
6500         /* cause of the manipulated arp constructor and the ARP
6501            flag for OSAE devices we have some nasty exceptions */
6502         if (card->info.type == QETH_CARD_TYPE_OSAE) {
6503                 if (!card->options.fake_ll) {
6504                         if ((skb->pkt_type==PACKET_OUTGOING) &&
6505                             (skb->protocol==ETH_P_IPV6))
6506                                 goto haveheader;
6507                         else
6508                                 return 0;
6509                 } else {
6510                         if ((skb->pkt_type==PACKET_OUTGOING) &&
6511                             (skb->protocol==ETH_P_IP))
6512                                 return 0;
6513                         else
6514                                 goto haveheader;
6515                 }
6516         }
6517 #endif
6518         if (!card->options.fake_ll)
6519                 return 0;
6520 haveheader:
6521         eth = eth_hdr(skb);
6522         memcpy(haddr, eth->h_source, ETH_ALEN);
6523         return ETH_ALEN;
6524 }
6525
6526 static int
6527 qeth_netdev_init(struct net_device *dev)
6528 {
6529         struct qeth_card *card;
6530
6531         card = (struct qeth_card *) dev->priv;
6532
6533         QETH_DBF_TEXT(trace,3,"initdev");
6534
6535         dev->tx_timeout = &qeth_tx_timeout;
6536         dev->watchdog_timeo = QETH_TX_TIMEOUT;
6537         dev->open = qeth_open;
6538         dev->stop = qeth_stop;
6539         dev->hard_start_xmit = qeth_hard_start_xmit;
6540         dev->do_ioctl = qeth_do_ioctl;
6541         dev->get_stats = qeth_get_stats;
6542         dev->change_mtu = qeth_change_mtu;
6543         dev->neigh_setup = qeth_neigh_setup;
6544         dev->set_multicast_list = qeth_set_multicast_list;
6545 #ifdef CONFIG_QETH_VLAN
6546         dev->vlan_rx_register = qeth_vlan_rx_register;
6547         dev->vlan_rx_kill_vid = qeth_vlan_rx_kill_vid;
6548         dev->vlan_rx_add_vid = qeth_vlan_rx_add_vid;
6549 #endif
6550         if (qeth_get_netdev_flags(card) & IFF_NOARP) {
6551                 dev->rebuild_header = NULL;
6552                 dev->hard_header = NULL;
6553                 dev->header_cache_update = NULL;
6554                 dev->hard_header_cache = NULL;
6555         }
6556 #ifdef CONFIG_QETH_IPV6
6557         /*IPv6 address autoconfiguration stuff*/
6558         if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD))
6559                 card->dev->dev_id = card->info.unique_id & 0xffff;
6560 #endif
6561         if (card->options.fake_ll &&
6562                 (qeth_get_netdev_flags(card) & IFF_NOARP))
6563                         dev->hard_header = qeth_fake_header;
6564         if (dev->type == ARPHRD_IEEE802_TR)
6565                 dev->hard_header_parse = NULL;
6566         else
6567                 dev->hard_header_parse = qeth_hard_header_parse;
6568         dev->set_mac_address = qeth_layer2_set_mac_address;
6569         dev->flags |= qeth_get_netdev_flags(card);
6570         if ((card->options.fake_broadcast) ||
6571             (card->info.broadcast_capable))
6572                 dev->flags |= IFF_BROADCAST;
6573         dev->hard_header_len =
6574                         qeth_get_hlen(card->info.link_type) + card->options.add_hhlen;
6575         dev->addr_len = OSA_ADDR_LEN;
6576         dev->mtu = card->info.initial_mtu;
6577         if (card->info.type != QETH_CARD_TYPE_OSN)
6578                 SET_ETHTOOL_OPS(dev, &qeth_ethtool_ops);
6579         SET_MODULE_OWNER(dev);
6580         return 0;
6581 }
6582
6583 static void
6584 qeth_init_func_level(struct qeth_card *card)
6585 {
6586         if (card->ipato.enabled) {
6587                 if (card->info.type == QETH_CARD_TYPE_IQD)
6588                                 card->info.func_level =
6589                                         QETH_IDX_FUNC_LEVEL_IQD_ENA_IPAT;
6590                 else
6591                                 card->info.func_level =
6592                                         QETH_IDX_FUNC_LEVEL_OSAE_ENA_IPAT;
6593         } else {
6594                 if (card->info.type == QETH_CARD_TYPE_IQD)
6595                 /*FIXME:why do we have same values for  dis and ena for osae??? */
6596                         card->info.func_level =
6597                                 QETH_IDX_FUNC_LEVEL_IQD_DIS_IPAT;
6598                 else
6599                         card->info.func_level =
6600                                 QETH_IDX_FUNC_LEVEL_OSAE_DIS_IPAT;
6601         }
6602 }
6603
6604 /**
6605  * hardsetup card, initialize MPC and QDIO stuff
6606  */
6607 static int
6608 qeth_hardsetup_card(struct qeth_card *card)
6609 {
6610         int retries = 3;
6611         int rc;
6612
6613         QETH_DBF_TEXT(setup, 2, "hrdsetup");
6614
6615         atomic_set(&card->force_alloc_skb, 0);
6616 retry:
6617         if (retries < 3){
6618                 PRINT_WARN("Retrying to do IDX activates.\n");
6619                 ccw_device_set_offline(CARD_DDEV(card));
6620                 ccw_device_set_offline(CARD_WDEV(card));
6621                 ccw_device_set_offline(CARD_RDEV(card));
6622                 ccw_device_set_online(CARD_RDEV(card));
6623                 ccw_device_set_online(CARD_WDEV(card));
6624                 ccw_device_set_online(CARD_DDEV(card));
6625         }
6626         rc = qeth_qdio_clear_card(card,card->info.type!=QETH_CARD_TYPE_IQD);
6627         if (rc == -ERESTARTSYS) {
6628                 QETH_DBF_TEXT(setup, 2, "break1");
6629                 return rc;
6630         } else if (rc) {
6631                 QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
6632                 if (--retries < 0)
6633                         goto out;
6634                 else
6635                         goto retry;
6636         }
6637         if ((rc = qeth_get_unitaddr(card))){
6638                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
6639                 return rc;
6640         }
6641         qeth_init_tokens(card);
6642         qeth_init_func_level(card);
6643         rc = qeth_idx_activate_channel(&card->read, qeth_idx_read_cb);
6644         if (rc == -ERESTARTSYS) {
6645                 QETH_DBF_TEXT(setup, 2, "break2");
6646                 return rc;
6647         } else if (rc) {
6648                 QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
6649                 if (--retries < 0)
6650                         goto out;
6651                 else
6652                         goto retry;
6653         }
6654         rc = qeth_idx_activate_channel(&card->write, qeth_idx_write_cb);
6655         if (rc == -ERESTARTSYS) {
6656                 QETH_DBF_TEXT(setup, 2, "break3");
6657                 return rc;
6658         } else if (rc) {
6659                 QETH_DBF_TEXT_(setup, 2, "4err%d", rc);
6660                 if (--retries < 0)
6661                         goto out;
6662                 else
6663                         goto retry;
6664         }
6665         if ((rc = qeth_mpc_initialize(card))){
6666                 QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
6667                 goto out;
6668         }
6669         /*network device will be recovered*/
6670         if (card->dev) {
6671                 card->dev->hard_header = card->orig_hard_header;
6672                 if (card->options.fake_ll &&
6673                     (qeth_get_netdev_flags(card) & IFF_NOARP))
6674                         card->dev->hard_header = qeth_fake_header;
6675                 return 0;
6676         }
6677         /* at first set_online allocate netdev */
6678         card->dev = qeth_get_netdevice(card->info.type,
6679                                        card->info.link_type);
6680         if (!card->dev){
6681                 qeth_qdio_clear_card(card, card->info.type !=
6682                                      QETH_CARD_TYPE_IQD);
6683                 rc = -ENODEV;
6684                 QETH_DBF_TEXT_(setup, 2, "6err%d", rc);
6685                 goto out;
6686         }
6687         card->dev->priv = card;
6688         card->orig_hard_header = card->dev->hard_header;
6689         card->dev->type = qeth_get_arphdr_type(card->info.type,
6690                                                card->info.link_type);
6691         card->dev->init = qeth_netdev_init;
6692         return 0;
6693 out:
6694         PRINT_ERR("Initialization in hardsetup failed! rc=%d\n", rc);
6695         return rc;
6696 }
6697
6698 static int
6699 qeth_default_setassparms_cb(struct qeth_card *card, struct qeth_reply *reply,
6700                             unsigned long data)
6701 {
6702         struct qeth_ipa_cmd *cmd;
6703
6704         QETH_DBF_TEXT(trace,4,"defadpcb");
6705
6706         cmd = (struct qeth_ipa_cmd *) data;
6707         if (cmd->hdr.return_code == 0){
6708                 cmd->hdr.return_code = cmd->data.setassparms.hdr.return_code;
6709                 if (cmd->hdr.prot_version == QETH_PROT_IPV4)
6710                         card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
6711 #ifdef CONFIG_QETH_IPV6
6712                 if (cmd->hdr.prot_version == QETH_PROT_IPV6)
6713                         card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
6714 #endif
6715         }
6716         if (cmd->data.setassparms.hdr.assist_no == IPA_INBOUND_CHECKSUM &&
6717             cmd->data.setassparms.hdr.command_code == IPA_CMD_ASS_START) {
6718                 card->info.csum_mask = cmd->data.setassparms.data.flags_32bit;
6719                 QETH_DBF_TEXT_(trace, 3, "csum:%d", card->info.csum_mask);
6720         }
6721         return 0;
6722 }
6723
6724 static int
6725 qeth_default_setadapterparms_cb(struct qeth_card *card,
6726                                 struct qeth_reply *reply,
6727                                 unsigned long data)
6728 {
6729         struct qeth_ipa_cmd *cmd;
6730
6731         QETH_DBF_TEXT(trace,4,"defadpcb");
6732
6733         cmd = (struct qeth_ipa_cmd *) data;
6734         if (cmd->hdr.return_code == 0)
6735                 cmd->hdr.return_code = cmd->data.setadapterparms.hdr.return_code;
6736         return 0;
6737 }
6738
6739
6740
6741 static int
6742 qeth_query_setadapterparms_cb(struct qeth_card *card, struct qeth_reply *reply,
6743                               unsigned long data)
6744 {
6745         struct qeth_ipa_cmd *cmd;
6746
6747         QETH_DBF_TEXT(trace,3,"quyadpcb");
6748
6749         cmd = (struct qeth_ipa_cmd *) data;
6750         if (cmd->data.setadapterparms.data.query_cmds_supp.lan_type & 0x7f)
6751                 card->info.link_type =
6752                       cmd->data.setadapterparms.data.query_cmds_supp.lan_type;
6753         card->options.adp.supported_funcs =
6754                 cmd->data.setadapterparms.data.query_cmds_supp.supported_cmds;
6755         return qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
6756 }
6757
6758 static int
6759 qeth_query_setadapterparms(struct qeth_card *card)
6760 {
6761         int rc;
6762         struct qeth_cmd_buffer *iob;
6763
6764         QETH_DBF_TEXT(trace,3,"queryadp");
6765         iob = qeth_get_adapter_cmd(card, IPA_SETADP_QUERY_COMMANDS_SUPPORTED,
6766                                    sizeof(struct qeth_ipacmd_setadpparms));
6767         rc = qeth_send_ipa_cmd(card, iob, qeth_query_setadapterparms_cb, NULL);
6768         return rc;
6769 }
6770
6771 static int
6772 qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
6773                                    struct qeth_reply *reply,
6774                                    unsigned long data)
6775 {
6776         struct qeth_ipa_cmd *cmd;
6777
6778         QETH_DBF_TEXT(trace,4,"chgmaccb");
6779
6780         cmd = (struct qeth_ipa_cmd *) data;
6781         if (!card->options.layer2 ||
6782             !(card->info.mac_bits & QETH_LAYER2_MAC_READ)) {
6783                 memcpy(card->dev->dev_addr,
6784                        &cmd->data.setadapterparms.data.change_addr.addr,
6785                        OSA_ADDR_LEN);
6786                 card->info.mac_bits |= QETH_LAYER2_MAC_READ;
6787         }
6788         qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
6789         return 0;
6790 }
6791
6792 static int
6793 qeth_setadpparms_change_macaddr(struct qeth_card *card)
6794 {
6795         int rc;
6796         struct qeth_cmd_buffer *iob;
6797         struct qeth_ipa_cmd *cmd;
6798
6799         QETH_DBF_TEXT(trace,4,"chgmac");
6800
6801         iob = qeth_get_adapter_cmd(card,IPA_SETADP_ALTER_MAC_ADDRESS,
6802                                    sizeof(struct qeth_ipacmd_setadpparms));
6803         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
6804         cmd->data.setadapterparms.data.change_addr.cmd = CHANGE_ADDR_READ_MAC;
6805         cmd->data.setadapterparms.data.change_addr.addr_size = OSA_ADDR_LEN;
6806         memcpy(&cmd->data.setadapterparms.data.change_addr.addr,
6807                card->dev->dev_addr, OSA_ADDR_LEN);
6808         rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_change_macaddr_cb,
6809                                NULL);
6810         return rc;
6811 }
6812
6813 static int
6814 qeth_send_setadp_mode(struct qeth_card *card, __u32 command, __u32 mode)
6815 {
6816         int rc;
6817         struct qeth_cmd_buffer *iob;
6818         struct qeth_ipa_cmd *cmd;
6819
6820         QETH_DBF_TEXT(trace,4,"adpmode");
6821
6822         iob = qeth_get_adapter_cmd(card, command,
6823                                    sizeof(struct qeth_ipacmd_setadpparms));
6824         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
6825         cmd->data.setadapterparms.data.mode = mode;
6826         rc = qeth_send_ipa_cmd(card, iob, qeth_default_setadapterparms_cb,
6827                                NULL);
6828         return rc;
6829 }
6830
6831 static int
6832 qeth_setadapter_hstr(struct qeth_card *card)
6833 {
6834         int rc;
6835
6836         QETH_DBF_TEXT(trace,4,"adphstr");
6837
6838         if (qeth_adp_supported(card,IPA_SETADP_SET_BROADCAST_MODE)) {
6839                 rc = qeth_send_setadp_mode(card, IPA_SETADP_SET_BROADCAST_MODE,
6840                                            card->options.broadcast_mode);
6841                 if (rc)
6842                         PRINT_WARN("couldn't set broadcast mode on "
6843                                    "device %s: x%x\n",
6844                                    CARD_BUS_ID(card), rc);
6845                 rc = qeth_send_setadp_mode(card, IPA_SETADP_ALTER_MAC_ADDRESS,
6846                                            card->options.macaddr_mode);
6847                 if (rc)
6848                         PRINT_WARN("couldn't set macaddr mode on "
6849                                    "device %s: x%x\n", CARD_BUS_ID(card), rc);
6850                 return rc;
6851         }
6852         if (card->options.broadcast_mode == QETH_TR_BROADCAST_LOCAL)
6853                 PRINT_WARN("set adapter parameters not available "
6854                            "to set broadcast mode, using ALLRINGS "
6855                            "on device %s:\n", CARD_BUS_ID(card));
6856         if (card->options.macaddr_mode == QETH_TR_MACADDR_CANONICAL)
6857                 PRINT_WARN("set adapter parameters not available "
6858                            "to set macaddr mode, using NONCANONICAL "
6859                            "on device %s:\n", CARD_BUS_ID(card));
6860         return 0;
6861 }
6862
6863 static int
6864 qeth_setadapter_parms(struct qeth_card *card)
6865 {
6866         int rc;
6867
6868         QETH_DBF_TEXT(setup, 2, "setadprm");
6869
6870         if (!qeth_is_supported(card, IPA_SETADAPTERPARMS)){
6871                 PRINT_WARN("set adapter parameters not supported "
6872                            "on device %s.\n",
6873                            CARD_BUS_ID(card));
6874                 QETH_DBF_TEXT(setup, 2, " notsupp");
6875                 return 0;
6876         }
6877         rc = qeth_query_setadapterparms(card);
6878         if (rc) {
6879                 PRINT_WARN("couldn't set adapter parameters on device %s: "
6880                            "x%x\n", CARD_BUS_ID(card), rc);
6881                 return rc;
6882         }
6883         if (qeth_adp_supported(card,IPA_SETADP_ALTER_MAC_ADDRESS)) {
6884                 rc = qeth_setadpparms_change_macaddr(card);
6885                 if (rc)
6886                         PRINT_WARN("couldn't get MAC address on "
6887                                    "device %s: x%x\n",
6888                                    CARD_BUS_ID(card), rc);
6889         }
6890
6891         if ((card->info.link_type == QETH_LINK_TYPE_HSTR) ||
6892             (card->info.link_type == QETH_LINK_TYPE_LANE_TR))
6893                 rc = qeth_setadapter_hstr(card);
6894
6895         return rc;
6896 }
6897
6898 static int
6899 qeth_layer2_initialize(struct qeth_card *card)
6900 {
6901         int rc = 0;
6902
6903
6904         QETH_DBF_TEXT(setup, 2, "doL2init");
6905         QETH_DBF_TEXT_(setup, 2, "doL2%s", CARD_BUS_ID(card));
6906
6907         rc = qeth_query_setadapterparms(card);
6908         if (rc) {
6909                 PRINT_WARN("could not query adapter parameters on device %s: "
6910                            "x%x\n", CARD_BUS_ID(card), rc);
6911         }
6912
6913         rc = qeth_setadpparms_change_macaddr(card);
6914         if (rc) {
6915                 PRINT_WARN("couldn't get MAC address on "
6916                            "device %s: x%x\n",
6917                            CARD_BUS_ID(card), rc);
6918                 QETH_DBF_TEXT_(setup, 2,"1err%d",rc);
6919                 return rc;
6920         }
6921         QETH_DBF_HEX(setup,2, card->dev->dev_addr, OSA_ADDR_LEN);
6922
6923         rc = qeth_layer2_send_setmac(card, &card->dev->dev_addr[0]);
6924         if (rc)
6925                 QETH_DBF_TEXT_(setup, 2,"2err%d",rc);
6926         return 0;
6927 }
6928
6929
6930 static int
6931 qeth_send_startstoplan(struct qeth_card *card, enum qeth_ipa_cmds ipacmd,
6932                        enum qeth_prot_versions prot)
6933 {
6934         int rc;
6935         struct qeth_cmd_buffer *iob;
6936
6937         iob = qeth_get_ipacmd_buffer(card,ipacmd,prot);
6938         rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
6939
6940         return rc;
6941 }
6942
6943 static int
6944 qeth_send_startlan(struct qeth_card *card, enum qeth_prot_versions prot)
6945 {
6946         int rc;
6947
6948         QETH_DBF_TEXT_(setup, 2, "strtlan%i", prot);
6949
6950         rc = qeth_send_startstoplan(card, IPA_CMD_STARTLAN, prot);
6951         return rc;
6952 }
6953
6954 static int
6955 qeth_send_stoplan(struct qeth_card *card)
6956 {
6957         int rc = 0;
6958
6959         /*
6960          * TODO: according to the IPA format document page 14,
6961          * TCP/IP (we!) never issue a STOPLAN
6962          * is this right ?!?
6963          */
6964         QETH_DBF_TEXT(trace, 2, "stoplan");
6965
6966         rc = qeth_send_startstoplan(card, IPA_CMD_STOPLAN, QETH_PROT_IPV4);
6967         return rc;
6968 }
6969
6970 static int
6971 qeth_query_ipassists_cb(struct qeth_card *card, struct qeth_reply *reply,
6972                         unsigned long data)
6973 {
6974         struct qeth_ipa_cmd *cmd;
6975
6976         QETH_DBF_TEXT(setup, 2, "qipasscb");
6977
6978         cmd = (struct qeth_ipa_cmd *) data;
6979         if (cmd->hdr.prot_version == QETH_PROT_IPV4) {
6980                 card->options.ipa4.supported_funcs = cmd->hdr.ipa_supported;
6981                 card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
6982                 /* Disable IPV6 support hard coded for Hipersockets */
6983                 if(card->info.type == QETH_CARD_TYPE_IQD)
6984                         card->options.ipa4.supported_funcs &= ~IPA_IPV6;
6985         } else {
6986 #ifdef CONFIG_QETH_IPV6
6987                 card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported;
6988                 card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
6989 #endif
6990         }
6991         QETH_DBF_TEXT(setup, 2, "suppenbl");
6992         QETH_DBF_TEXT_(setup, 2, "%x",cmd->hdr.ipa_supported);
6993         QETH_DBF_TEXT_(setup, 2, "%x",cmd->hdr.ipa_enabled);
6994         return 0;
6995 }
6996
6997 static int
6998 qeth_query_ipassists(struct qeth_card *card, enum qeth_prot_versions prot)
6999 {
7000         int rc;
7001         struct qeth_cmd_buffer *iob;
7002
7003         QETH_DBF_TEXT_(setup, 2, "qipassi%i", prot);
7004         if (card->options.layer2) {
7005                 QETH_DBF_TEXT(setup, 2, "noprmly2");
7006                 return -EPERM;
7007         }
7008
7009         iob = qeth_get_ipacmd_buffer(card,IPA_CMD_QIPASSIST,prot);
7010         rc = qeth_send_ipa_cmd(card, iob, qeth_query_ipassists_cb, NULL);
7011         return rc;
7012 }
7013
7014 static struct qeth_cmd_buffer *
7015 qeth_get_setassparms_cmd(struct qeth_card *card, enum qeth_ipa_funcs ipa_func,
7016                          __u16 cmd_code, __u16 len,
7017                          enum qeth_prot_versions prot)
7018 {
7019         struct qeth_cmd_buffer *iob;
7020         struct qeth_ipa_cmd *cmd;
7021
7022         QETH_DBF_TEXT(trace,4,"getasscm");
7023         iob = qeth_get_ipacmd_buffer(card,IPA_CMD_SETASSPARMS,prot);
7024
7025         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
7026         cmd->data.setassparms.hdr.assist_no = ipa_func;
7027         cmd->data.setassparms.hdr.length = 8 + len;
7028         cmd->data.setassparms.hdr.command_code = cmd_code;
7029         cmd->data.setassparms.hdr.return_code = 0;
7030         cmd->data.setassparms.hdr.seq_no = 0;
7031
7032         return iob;
7033 }
7034
7035 static int
7036 qeth_send_setassparms(struct qeth_card *card, struct qeth_cmd_buffer *iob,
7037                       __u16 len, long data,
7038                       int (*reply_cb)
7039                       (struct qeth_card *,struct qeth_reply *,unsigned long),
7040                       void *reply_param)
7041 {
7042         int rc;
7043         struct qeth_ipa_cmd *cmd;
7044
7045         QETH_DBF_TEXT(trace,4,"sendassp");
7046
7047         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
7048         if (len <= sizeof(__u32))
7049                 cmd->data.setassparms.data.flags_32bit = (__u32) data;
7050         else   /* (len > sizeof(__u32)) */
7051                 memcpy(&cmd->data.setassparms.data, (void *) data, len);
7052
7053         rc = qeth_send_ipa_cmd(card, iob, reply_cb, reply_param);
7054         return rc;
7055 }
7056
7057 #ifdef CONFIG_QETH_IPV6
7058 static int
7059 qeth_send_simple_setassparms_ipv6(struct qeth_card *card,
7060                                   enum qeth_ipa_funcs ipa_func, __u16 cmd_code)
7061
7062 {
7063         int rc;
7064         struct qeth_cmd_buffer *iob;
7065
7066         QETH_DBF_TEXT(trace,4,"simassp6");
7067         iob = qeth_get_setassparms_cmd(card, ipa_func, cmd_code,
7068                                        0, QETH_PROT_IPV6);
7069         rc = qeth_send_setassparms(card, iob, 0, 0,
7070                                    qeth_default_setassparms_cb, NULL);
7071         return rc;
7072 }
7073 #endif
7074
7075 static int
7076 qeth_send_simple_setassparms(struct qeth_card *card,
7077                              enum qeth_ipa_funcs ipa_func,
7078                              __u16 cmd_code, long data)
7079 {
7080         int rc;
7081         int length = 0;
7082         struct qeth_cmd_buffer *iob;
7083
7084         QETH_DBF_TEXT(trace,4,"simassp4");
7085         if (data)
7086                 length = sizeof(__u32);
7087         iob = qeth_get_setassparms_cmd(card, ipa_func, cmd_code,
7088                                        length, QETH_PROT_IPV4);
7089         rc = qeth_send_setassparms(card, iob, length, data,
7090                                    qeth_default_setassparms_cb, NULL);
7091         return rc;
7092 }
7093
7094 static int
7095 qeth_start_ipa_arp_processing(struct qeth_card *card)
7096 {
7097         int rc;
7098
7099         QETH_DBF_TEXT(trace,3,"ipaarp");
7100
7101         if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
7102                 PRINT_WARN("ARP processing not supported "
7103                            "on %s!\n", QETH_CARD_IFNAME(card));
7104                 return 0;
7105         }
7106         rc = qeth_send_simple_setassparms(card,IPA_ARP_PROCESSING,
7107                                           IPA_CMD_ASS_START, 0);
7108         if (rc) {
7109                 PRINT_WARN("Could not start ARP processing "
7110                            "assist on %s: 0x%x\n",
7111                            QETH_CARD_IFNAME(card), rc);
7112         }
7113         return rc;
7114 }
7115
7116 static int
7117 qeth_start_ipa_ip_fragmentation(struct qeth_card *card)
7118 {
7119         int rc;
7120
7121         QETH_DBF_TEXT(trace,3,"ipaipfrg");
7122
7123         if (!qeth_is_supported(card, IPA_IP_FRAGMENTATION)) {
7124                 PRINT_INFO("Hardware IP fragmentation not supported on %s\n",
7125                            QETH_CARD_IFNAME(card));
7126                 return  -EOPNOTSUPP;
7127         }
7128
7129         rc = qeth_send_simple_setassparms(card, IPA_IP_FRAGMENTATION,
7130                                           IPA_CMD_ASS_START, 0);
7131         if (rc) {
7132                 PRINT_WARN("Could not start Hardware IP fragmentation "
7133                            "assist on %s: 0x%x\n",
7134                            QETH_CARD_IFNAME(card), rc);
7135         } else
7136                 PRINT_INFO("Hardware IP fragmentation enabled \n");
7137         return rc;
7138 }
7139
7140 static int
7141 qeth_start_ipa_source_mac(struct qeth_card *card)
7142 {
7143         int rc;
7144
7145         QETH_DBF_TEXT(trace,3,"stsrcmac");
7146
7147         if (!card->options.fake_ll)
7148                 return -EOPNOTSUPP;
7149
7150         if (!qeth_is_supported(card, IPA_SOURCE_MAC)) {
7151                 PRINT_INFO("Inbound source address not "
7152                            "supported on %s\n", QETH_CARD_IFNAME(card));
7153                 return -EOPNOTSUPP;
7154         }
7155
7156         rc = qeth_send_simple_setassparms(card, IPA_SOURCE_MAC,
7157                                           IPA_CMD_ASS_START, 0);
7158         if (rc)
7159                 PRINT_WARN("Could not start inbound source "
7160                            "assist on %s: 0x%x\n",
7161                            QETH_CARD_IFNAME(card), rc);
7162         return rc;
7163 }
7164
7165 static int
7166 qeth_start_ipa_vlan(struct qeth_card *card)
7167 {
7168         int rc = 0;
7169
7170         QETH_DBF_TEXT(trace,3,"strtvlan");
7171
7172 #ifdef CONFIG_QETH_VLAN
7173         if (!qeth_is_supported(card, IPA_FULL_VLAN)) {
7174                 PRINT_WARN("VLAN not supported on %s\n", QETH_CARD_IFNAME(card));
7175                 return -EOPNOTSUPP;
7176         }
7177
7178         rc = qeth_send_simple_setassparms(card, IPA_VLAN_PRIO,
7179                                           IPA_CMD_ASS_START,0);
7180         if (rc) {
7181                 PRINT_WARN("Could not start vlan "
7182                            "assist on %s: 0x%x\n",
7183                            QETH_CARD_IFNAME(card), rc);
7184         } else {
7185                 PRINT_INFO("VLAN enabled \n");
7186                 card->dev->features |=
7187                         NETIF_F_HW_VLAN_FILTER |
7188                         NETIF_F_HW_VLAN_TX |
7189                         NETIF_F_HW_VLAN_RX;
7190         }
7191 #endif /* QETH_VLAN */
7192         return rc;
7193 }
7194
7195 static int
7196 qeth_start_ipa_multicast(struct qeth_card *card)
7197 {
7198         int rc;
7199
7200         QETH_DBF_TEXT(trace,3,"stmcast");
7201
7202         if (!qeth_is_supported(card, IPA_MULTICASTING)) {
7203                 PRINT_WARN("Multicast not supported on %s\n",
7204                            QETH_CARD_IFNAME(card));
7205                 return -EOPNOTSUPP;
7206         }
7207
7208         rc = qeth_send_simple_setassparms(card, IPA_MULTICASTING,
7209                                           IPA_CMD_ASS_START,0);
7210         if (rc) {
7211                 PRINT_WARN("Could not start multicast "
7212                            "assist on %s: rc=%i\n",
7213                            QETH_CARD_IFNAME(card), rc);
7214         } else {
7215                 PRINT_INFO("Multicast enabled\n");
7216                 card->dev->flags |= IFF_MULTICAST;
7217         }
7218         return rc;
7219 }
7220
7221 #ifdef CONFIG_QETH_IPV6
7222 static int
7223 qeth_softsetup_ipv6(struct qeth_card *card)
7224 {
7225         int rc;
7226
7227         QETH_DBF_TEXT(trace,3,"softipv6");
7228
7229         rc = qeth_send_startlan(card, QETH_PROT_IPV6);
7230         if (rc) {
7231                 PRINT_ERR("IPv6 startlan failed on %s\n",
7232                           QETH_CARD_IFNAME(card));
7233                 return rc;
7234         }
7235         rc = qeth_query_ipassists(card,QETH_PROT_IPV6);
7236         if (rc) {
7237                 PRINT_ERR("IPv6 query ipassist failed on %s\n",
7238                           QETH_CARD_IFNAME(card));
7239                 return rc;
7240         }
7241         rc = qeth_send_simple_setassparms(card, IPA_IPV6,
7242                                           IPA_CMD_ASS_START, 3);
7243         if (rc) {
7244                 PRINT_WARN("IPv6 start assist (version 4) failed "
7245                            "on %s: 0x%x\n",
7246                            QETH_CARD_IFNAME(card), rc);
7247                 return rc;
7248         }
7249         rc = qeth_send_simple_setassparms_ipv6(card, IPA_IPV6,
7250                                                IPA_CMD_ASS_START);
7251         if (rc) {
7252                 PRINT_WARN("IPV6 start assist (version 6) failed  "
7253                            "on %s: 0x%x\n",
7254                            QETH_CARD_IFNAME(card), rc);
7255                 return rc;
7256         }
7257         rc = qeth_send_simple_setassparms_ipv6(card, IPA_PASSTHRU,
7258                                                IPA_CMD_ASS_START);
7259         if (rc) {
7260                 PRINT_WARN("Could not enable passthrough "
7261                            "on %s: 0x%x\n",
7262                            QETH_CARD_IFNAME(card), rc);
7263                 return rc;
7264         }
7265         PRINT_INFO("IPV6 enabled \n");
7266         return 0;
7267 }
7268
7269 #endif
7270
7271 static int
7272 qeth_start_ipa_ipv6(struct qeth_card *card)
7273 {
7274         int rc = 0;
7275 #ifdef CONFIG_QETH_IPV6
7276         QETH_DBF_TEXT(trace,3,"strtipv6");
7277
7278         if (!qeth_is_supported(card, IPA_IPV6)) {
7279                 PRINT_WARN("IPv6 not supported on %s\n",
7280                            QETH_CARD_IFNAME(card));
7281                 return 0;
7282         }
7283         rc = qeth_softsetup_ipv6(card);
7284 #endif
7285         return rc ;
7286 }
7287
7288 static int
7289 qeth_start_ipa_broadcast(struct qeth_card *card)
7290 {
7291         int rc;
7292
7293         QETH_DBF_TEXT(trace,3,"stbrdcst");
7294         card->info.broadcast_capable = 0;
7295         if (!qeth_is_supported(card, IPA_FILTERING)) {
7296                 PRINT_WARN("Broadcast not supported on %s\n",
7297                            QETH_CARD_IFNAME(card));
7298                 rc = -EOPNOTSUPP;
7299                 goto out;
7300         }
7301         rc = qeth_send_simple_setassparms(card, IPA_FILTERING,
7302                                           IPA_CMD_ASS_START, 0);
7303         if (rc) {
7304                 PRINT_WARN("Could not enable broadcasting filtering "
7305                            "on %s: 0x%x\n",
7306                            QETH_CARD_IFNAME(card), rc);
7307                 goto out;
7308         }
7309
7310         rc = qeth_send_simple_setassparms(card, IPA_FILTERING,
7311                                           IPA_CMD_ASS_CONFIGURE, 1);
7312         if (rc) {
7313                 PRINT_WARN("Could not set up broadcast filtering on %s: 0x%x\n",
7314                            QETH_CARD_IFNAME(card), rc);
7315                 goto out;
7316         }
7317         card->info.broadcast_capable = QETH_BROADCAST_WITH_ECHO;
7318         PRINT_INFO("Broadcast enabled \n");
7319         rc = qeth_send_simple_setassparms(card, IPA_FILTERING,
7320                                           IPA_CMD_ASS_ENABLE, 1);
7321         if (rc) {
7322                 PRINT_WARN("Could not set up broadcast echo filtering on "
7323                            "%s: 0x%x\n", QETH_CARD_IFNAME(card), rc);
7324                 goto out;
7325         }
7326         card->info.broadcast_capable = QETH_BROADCAST_WITHOUT_ECHO;
7327 out:
7328         if (card->info.broadcast_capable)
7329                 card->dev->flags |= IFF_BROADCAST;
7330         else
7331                 card->dev->flags &= ~IFF_BROADCAST;
7332         return rc;
7333 }
7334
7335 static int
7336 qeth_send_checksum_command(struct qeth_card *card)
7337 {
7338         int rc;
7339
7340         rc = qeth_send_simple_setassparms(card, IPA_INBOUND_CHECKSUM,
7341                                           IPA_CMD_ASS_START, 0);
7342         if (rc) {
7343                 PRINT_WARN("Starting Inbound HW Checksumming failed on %s: "
7344                            "0x%x,\ncontinuing using Inbound SW Checksumming\n",
7345                            QETH_CARD_IFNAME(card), rc);
7346                 return rc;
7347         }
7348         rc = qeth_send_simple_setassparms(card, IPA_INBOUND_CHECKSUM,
7349                                           IPA_CMD_ASS_ENABLE,
7350                                           card->info.csum_mask);
7351         if (rc) {
7352                 PRINT_WARN("Enabling Inbound HW Checksumming failed on %s: "
7353                            "0x%x,\ncontinuing using Inbound SW Checksumming\n",
7354                            QETH_CARD_IFNAME(card), rc);
7355                 return rc;
7356         }
7357         return 0;
7358 }
7359
7360 static int
7361 qeth_start_ipa_checksum(struct qeth_card *card)
7362 {
7363         int rc = 0;
7364
7365         QETH_DBF_TEXT(trace,3,"strtcsum");
7366
7367         if (card->options.checksum_type == NO_CHECKSUMMING) {
7368                 PRINT_WARN("Using no checksumming on %s.\n",
7369                            QETH_CARD_IFNAME(card));
7370                 return 0;
7371         }
7372         if (card->options.checksum_type == SW_CHECKSUMMING) {
7373                 PRINT_WARN("Using SW checksumming on %s.\n",
7374                            QETH_CARD_IFNAME(card));
7375                 return 0;
7376         }
7377         if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM)) {
7378                 PRINT_WARN("Inbound HW Checksumming not "
7379                            "supported on %s,\ncontinuing "
7380                            "using Inbound SW Checksumming\n",
7381                            QETH_CARD_IFNAME(card));
7382                 card->options.checksum_type = SW_CHECKSUMMING;
7383                 return 0;
7384         }
7385         rc = qeth_send_checksum_command(card);
7386         if (!rc) {
7387                 PRINT_INFO("HW Checksumming (inbound) enabled \n");
7388         }
7389         return rc;
7390 }
7391
7392 static int
7393 qeth_start_ipa_tso(struct qeth_card *card)
7394 {
7395         int rc;
7396
7397         QETH_DBF_TEXT(trace,3,"sttso");
7398
7399         if (!qeth_is_supported(card, IPA_OUTBOUND_TSO)) {
7400                 PRINT_WARN("Outbound TSO not supported on %s\n",
7401                            QETH_CARD_IFNAME(card));
7402                 rc = -EOPNOTSUPP;
7403         } else {
7404                 rc = qeth_send_simple_setassparms(card, IPA_OUTBOUND_TSO,
7405                                                   IPA_CMD_ASS_START,0);
7406                 if (rc)
7407                         PRINT_WARN("Could not start outbound TSO "
7408                                    "assist on %s: rc=%i\n",
7409                                    QETH_CARD_IFNAME(card), rc);
7410                 else
7411                         PRINT_INFO("Outbound TSO enabled\n");
7412         }
7413         if (rc && (card->options.large_send == QETH_LARGE_SEND_TSO)){
7414                 card->options.large_send = QETH_LARGE_SEND_NO;
7415                 card->dev->features &= ~ (NETIF_F_TSO | NETIF_F_SG);
7416         }
7417         return rc;
7418 }
7419
7420 static int
7421 qeth_start_ipassists(struct qeth_card *card)
7422 {
7423         QETH_DBF_TEXT(trace,3,"strtipas");
7424         qeth_start_ipa_arp_processing(card);    /* go on*/
7425         qeth_start_ipa_ip_fragmentation(card);  /* go on*/
7426         qeth_start_ipa_source_mac(card);        /* go on*/
7427         qeth_start_ipa_vlan(card);              /* go on*/
7428         qeth_start_ipa_multicast(card);         /* go on*/
7429         qeth_start_ipa_ipv6(card);              /* go on*/
7430         qeth_start_ipa_broadcast(card);         /* go on*/
7431         qeth_start_ipa_checksum(card);          /* go on*/
7432         qeth_start_ipa_tso(card);               /* go on*/
7433         return 0;
7434 }
7435
7436 static int
7437 qeth_send_setrouting(struct qeth_card *card, enum qeth_routing_types type,
7438                      enum qeth_prot_versions prot)
7439 {
7440         int rc;
7441         struct qeth_ipa_cmd *cmd;
7442         struct qeth_cmd_buffer *iob;
7443
7444         QETH_DBF_TEXT(trace,4,"setroutg");
7445         iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETRTG, prot);
7446         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
7447         cmd->data.setrtg.type = (type);
7448         rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
7449
7450         return rc;
7451
7452 }
7453
7454 static void
7455 qeth_correct_routing_type(struct qeth_card *card, enum qeth_routing_types *type,
7456                         enum qeth_prot_versions prot)
7457 {
7458         if (card->info.type == QETH_CARD_TYPE_IQD) {
7459                 switch (*type) {
7460                 case NO_ROUTER:
7461                 case PRIMARY_CONNECTOR:
7462                 case SECONDARY_CONNECTOR:
7463                 case MULTICAST_ROUTER:
7464                         return;
7465                 default:
7466                         goto out_inval;
7467                 }
7468         } else {
7469                 switch (*type) {
7470                 case NO_ROUTER:
7471                 case PRIMARY_ROUTER:
7472                 case SECONDARY_ROUTER:
7473                         return;
7474                 case MULTICAST_ROUTER:
7475                         if (qeth_is_ipafunc_supported(card, prot,
7476                                                       IPA_OSA_MC_ROUTER))
7477                                 return;
7478                 default:
7479                         goto out_inval;
7480                 }
7481         }
7482 out_inval:
7483         PRINT_WARN("Routing type '%s' not supported for interface %s.\n"
7484                    "Router status set to 'no router'.\n",
7485                    ((*type == PRIMARY_ROUTER)? "primary router" :
7486                     (*type == SECONDARY_ROUTER)? "secondary router" :
7487                     (*type == PRIMARY_CONNECTOR)? "primary connector" :
7488                     (*type == SECONDARY_CONNECTOR)? "secondary connector" :
7489                     (*type == MULTICAST_ROUTER)? "multicast router" :
7490                     "unknown"),
7491                    card->dev->name);
7492         *type = NO_ROUTER;
7493 }
7494
7495 int
7496 qeth_setrouting_v4(struct qeth_card *card)
7497 {
7498         int rc;
7499
7500         QETH_DBF_TEXT(trace,3,"setrtg4");
7501
7502         qeth_correct_routing_type(card, &card->options.route4.type,
7503                                   QETH_PROT_IPV4);
7504
7505         rc = qeth_send_setrouting(card, card->options.route4.type,
7506                                   QETH_PROT_IPV4);
7507         if (rc) {
7508                 card->options.route4.type = NO_ROUTER;
7509                 PRINT_WARN("Error (0x%04x) while setting routing type on %s. "
7510                            "Type set to 'no router'.\n",
7511                            rc, QETH_CARD_IFNAME(card));
7512         }
7513         return rc;
7514 }
7515
7516 int
7517 qeth_setrouting_v6(struct qeth_card *card)
7518 {
7519         int rc = 0;
7520
7521         QETH_DBF_TEXT(trace,3,"setrtg6");
7522 #ifdef CONFIG_QETH_IPV6
7523
7524         if (!qeth_is_supported(card, IPA_IPV6))
7525                 return 0;
7526         qeth_correct_routing_type(card, &card->options.route6.type,
7527                                   QETH_PROT_IPV6);
7528
7529         rc = qeth_send_setrouting(card, card->options.route6.type,
7530                                   QETH_PROT_IPV6);
7531         if (rc) {
7532                 card->options.route6.type = NO_ROUTER;
7533                 PRINT_WARN("Error (0x%04x) while setting routing type on %s. "
7534                            "Type set to 'no router'.\n",
7535                            rc, QETH_CARD_IFNAME(card));
7536         }
7537 #endif
7538         return rc;
7539 }
7540
7541 int
7542 qeth_set_large_send(struct qeth_card *card, enum qeth_large_send_types type)
7543 {
7544         int rc = 0;
7545
7546         if (card->dev == NULL) {
7547                 card->options.large_send = type;
7548                 return 0;
7549         }
7550         if (card->state == CARD_STATE_UP)
7551                 netif_tx_disable(card->dev);
7552         card->options.large_send = type;
7553         switch (card->options.large_send) {
7554         case QETH_LARGE_SEND_EDDP:
7555                 card->dev->features |= NETIF_F_TSO | NETIF_F_SG;
7556                 break;
7557         case QETH_LARGE_SEND_TSO:
7558                 if (qeth_is_supported(card, IPA_OUTBOUND_TSO)){
7559                         card->dev->features |= NETIF_F_TSO | NETIF_F_SG;
7560                 } else {
7561                         PRINT_WARN("TSO not supported on %s. "
7562                                    "large_send set to 'no'.\n",
7563                                    card->dev->name);
7564                         card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG);
7565                         card->options.large_send = QETH_LARGE_SEND_NO;
7566                         rc = -EOPNOTSUPP;
7567                 }
7568                 break;
7569         default: /* includes QETH_LARGE_SEND_NO */
7570                 card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG);
7571                 break;
7572         }
7573         if (card->state == CARD_STATE_UP)
7574                 netif_wake_queue(card->dev);
7575         return rc;
7576 }
7577
7578 /*
7579  * softsetup card: init IPA stuff
7580  */
7581 static int
7582 qeth_softsetup_card(struct qeth_card *card)
7583 {
7584         int rc;
7585
7586         QETH_DBF_TEXT(setup, 2, "softsetp");
7587
7588         if ((rc = qeth_send_startlan(card, QETH_PROT_IPV4))){
7589                 QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
7590                 if (rc == 0xe080){
7591                         PRINT_WARN("LAN on card %s if offline! "
7592                                    "Waiting for STARTLAN from card.\n",
7593                                    CARD_BUS_ID(card));
7594                         card->lan_online = 0;
7595                 }
7596                 return rc;
7597         } else
7598                 card->lan_online = 1;
7599         if (card->info.type==QETH_CARD_TYPE_OSN)
7600                 goto out;
7601         qeth_set_large_send(card, card->options.large_send);
7602         if (card->options.layer2) {
7603                 card->dev->features |=
7604                         NETIF_F_HW_VLAN_FILTER |
7605                         NETIF_F_HW_VLAN_TX |
7606                         NETIF_F_HW_VLAN_RX;
7607                 card->dev->flags|=IFF_MULTICAST|IFF_BROADCAST;
7608                 card->info.broadcast_capable=1;
7609                 if ((rc = qeth_layer2_initialize(card))) {
7610                         QETH_DBF_TEXT_(setup, 2, "L2err%d", rc);
7611                         return rc;
7612                 }
7613 #ifdef CONFIG_QETH_VLAN
7614                 qeth_layer2_process_vlans(card, 0);
7615 #endif
7616                 goto out;
7617         }
7618         if ((rc = qeth_setadapter_parms(card)))
7619                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
7620         if ((rc = qeth_start_ipassists(card)))
7621                 QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
7622         if ((rc = qeth_setrouting_v4(card)))
7623                 QETH_DBF_TEXT_(setup, 2, "4err%d", rc);
7624         if ((rc = qeth_setrouting_v6(card)))
7625                 QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
7626 out:
7627         netif_tx_disable(card->dev);
7628         return 0;
7629 }
7630
7631 #ifdef CONFIG_QETH_IPV6
7632 static int
7633 qeth_get_unique_id_cb(struct qeth_card *card, struct qeth_reply *reply,
7634                       unsigned long data)
7635 {
7636         struct qeth_ipa_cmd *cmd;
7637
7638         cmd = (struct qeth_ipa_cmd *) data;
7639         if (cmd->hdr.return_code == 0)
7640                 card->info.unique_id = *((__u16 *)
7641                                 &cmd->data.create_destroy_addr.unique_id[6]);
7642         else {
7643                 card->info.unique_id =  UNIQUE_ID_IF_CREATE_ADDR_FAILED |
7644                                         UNIQUE_ID_NOT_BY_CARD;
7645                 PRINT_WARN("couldn't get a unique id from the card on device "
7646                            "%s (result=x%x), using default id. ipv6 "
7647                            "autoconfig on other lpars may lead to duplicate "
7648                            "ip addresses. please use manually "
7649                            "configured ones.\n",
7650                            CARD_BUS_ID(card), cmd->hdr.return_code);
7651         }
7652         return 0;
7653 }
7654 #endif
7655
7656 static int
7657 qeth_put_unique_id(struct qeth_card *card)
7658 {
7659
7660         int rc = 0;
7661 #ifdef CONFIG_QETH_IPV6
7662         struct qeth_cmd_buffer *iob;
7663         struct qeth_ipa_cmd *cmd;
7664
7665         QETH_DBF_TEXT(trace,2,"puniqeid");
7666
7667         if ((card->info.unique_id & UNIQUE_ID_NOT_BY_CARD) ==
7668                 UNIQUE_ID_NOT_BY_CARD)
7669                 return -1;
7670         iob = qeth_get_ipacmd_buffer(card, IPA_CMD_DESTROY_ADDR,
7671                                      QETH_PROT_IPV6);
7672         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
7673         *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) =
7674                             card->info.unique_id;
7675         memcpy(&cmd->data.create_destroy_addr.unique_id[0],
7676                card->dev->dev_addr, OSA_ADDR_LEN);
7677         rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
7678 #else
7679         card->info.unique_id =  UNIQUE_ID_IF_CREATE_ADDR_FAILED |
7680                                 UNIQUE_ID_NOT_BY_CARD;
7681 #endif
7682         return rc;
7683 }
7684
7685 /**
7686  * Clear IP List
7687  */
7688 static void
7689 qeth_clear_ip_list(struct qeth_card *card, int clean, int recover)
7690 {
7691         struct qeth_ipaddr *addr, *tmp;
7692         unsigned long flags;
7693
7694         QETH_DBF_TEXT(trace,4,"clearip");
7695         spin_lock_irqsave(&card->ip_lock, flags);
7696         /* clear todo list */
7697         list_for_each_entry_safe(addr, tmp, card->ip_tbd_list, entry){
7698                 list_del(&addr->entry);
7699                 kfree(addr);
7700         }
7701
7702         while (!list_empty(&card->ip_list)) {
7703                 addr = list_entry(card->ip_list.next,
7704                                   struct qeth_ipaddr, entry);
7705                 list_del_init(&addr->entry);
7706                 if (clean) {
7707                         spin_unlock_irqrestore(&card->ip_lock, flags);
7708                         qeth_deregister_addr_entry(card, addr);
7709                         spin_lock_irqsave(&card->ip_lock, flags);
7710                 }
7711                 if (!recover || addr->is_multicast) {
7712                         kfree(addr);
7713                         continue;
7714                 }
7715                 list_add_tail(&addr->entry, card->ip_tbd_list);
7716         }
7717         spin_unlock_irqrestore(&card->ip_lock, flags);
7718 }
7719
7720 static void
7721 qeth_set_allowed_threads(struct qeth_card *card, unsigned long threads,
7722                          int clear_start_mask)
7723 {
7724         unsigned long flags;
7725
7726         spin_lock_irqsave(&card->thread_mask_lock, flags);
7727         card->thread_allowed_mask = threads;
7728         if (clear_start_mask)
7729                 card->thread_start_mask &= threads;
7730         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
7731         wake_up(&card->wait_q);
7732 }
7733
7734 static int
7735 qeth_threads_running(struct qeth_card *card, unsigned long threads)
7736 {
7737         unsigned long flags;
7738         int rc = 0;
7739
7740         spin_lock_irqsave(&card->thread_mask_lock, flags);
7741         rc = (card->thread_running_mask & threads);
7742         spin_unlock_irqrestore(&card->thread_mask_lock, flags);
7743         return rc;
7744 }
7745
7746 static int
7747 qeth_wait_for_threads(struct qeth_card *card, unsigned long threads)
7748 {
7749         return wait_event_interruptible(card->wait_q,
7750                         qeth_threads_running(card, threads) == 0);
7751 }
7752
7753 static int
7754 qeth_stop_card(struct qeth_card *card, int recovery_mode)
7755 {
7756         int rc = 0;
7757
7758         QETH_DBF_TEXT(setup ,2,"stopcard");
7759         QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
7760
7761         qeth_set_allowed_threads(card, 0, 1);
7762         if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD))
7763                 return -ERESTARTSYS;
7764         if (card->read.state == CH_STATE_UP &&
7765             card->write.state == CH_STATE_UP &&
7766             (card->state == CARD_STATE_UP)) {
7767                 if (recovery_mode &&
7768                     card->info.type != QETH_CARD_TYPE_OSN) {
7769                         qeth_stop(card->dev);
7770                 } else {
7771                         rtnl_lock();
7772                         dev_close(card->dev);
7773                         rtnl_unlock();
7774                 }
7775                 if (!card->use_hard_stop) {
7776                         __u8 *mac = &card->dev->dev_addr[0];
7777                         rc = qeth_layer2_send_delmac(card, mac);
7778                         QETH_DBF_TEXT_(setup, 2, "Lerr%d", rc);
7779                         if ((rc = qeth_send_stoplan(card)))
7780                                 QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
7781                 }
7782                 card->state = CARD_STATE_SOFTSETUP;
7783         }
7784         if (card->state == CARD_STATE_SOFTSETUP) {
7785 #ifdef CONFIG_QETH_VLAN
7786                 if (card->options.layer2)
7787                         qeth_layer2_process_vlans(card, 1);
7788 #endif
7789                 qeth_clear_ip_list(card, !card->use_hard_stop, 1);
7790                 qeth_clear_ipacmd_list(card);
7791                 card->state = CARD_STATE_HARDSETUP;
7792         }
7793         if (card->state == CARD_STATE_HARDSETUP) {
7794                 if ((!card->use_hard_stop) &&
7795                     (!card->options.layer2))
7796                         if ((rc = qeth_put_unique_id(card)))
7797                                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
7798                 qeth_qdio_clear_card(card, 0);
7799                 qeth_clear_qdio_buffers(card);
7800                 qeth_clear_working_pool_list(card);
7801                 card->state = CARD_STATE_DOWN;
7802         }
7803         if (card->state == CARD_STATE_DOWN) {
7804                 qeth_clear_cmd_buffers(&card->read);
7805                 qeth_clear_cmd_buffers(&card->write);
7806         }
7807         card->use_hard_stop = 0;
7808         return rc;
7809 }
7810
7811
7812 static int
7813 qeth_get_unique_id(struct qeth_card *card)
7814 {
7815         int rc = 0;
7816 #ifdef CONFIG_QETH_IPV6
7817         struct qeth_cmd_buffer *iob;
7818         struct qeth_ipa_cmd *cmd;
7819
7820         QETH_DBF_TEXT(setup, 2, "guniqeid");
7821
7822         if (!qeth_is_supported(card,IPA_IPV6)) {
7823                 card->info.unique_id =  UNIQUE_ID_IF_CREATE_ADDR_FAILED |
7824                                         UNIQUE_ID_NOT_BY_CARD;
7825                 return 0;
7826         }
7827
7828         iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR,
7829                                      QETH_PROT_IPV6);
7830         cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
7831         *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) =
7832                             card->info.unique_id;
7833
7834         rc = qeth_send_ipa_cmd(card, iob, qeth_get_unique_id_cb, NULL);
7835 #else
7836         card->info.unique_id =  UNIQUE_ID_IF_CREATE_ADDR_FAILED |
7837                                 UNIQUE_ID_NOT_BY_CARD;
7838 #endif
7839         return rc;
7840 }
7841 static void
7842 qeth_print_status_with_portname(struct qeth_card *card)
7843 {
7844         char dbf_text[15];
7845         int i;
7846
7847         sprintf(dbf_text, "%s", card->info.portname + 1);
7848         for (i = 0; i < 8; i++)
7849                 dbf_text[i] =
7850                         (char) _ebcasc[(__u8) dbf_text[i]];
7851         dbf_text[8] = 0;
7852         printk("qeth: Device %s/%s/%s is a%s card%s%s%s\n"
7853                "with link type %s (portname: %s)\n",
7854                CARD_RDEV_ID(card),
7855                CARD_WDEV_ID(card),
7856                CARD_DDEV_ID(card),
7857                qeth_get_cardname(card),
7858                (card->info.mcl_level[0]) ? " (level: " : "",
7859                (card->info.mcl_level[0]) ? card->info.mcl_level : "",
7860                (card->info.mcl_level[0]) ? ")" : "",
7861                qeth_get_cardname_short(card),
7862                dbf_text);
7863
7864 }
7865
7866 static void
7867 qeth_print_status_no_portname(struct qeth_card *card)
7868 {
7869         if (card->info.portname[0])
7870                 printk("qeth: Device %s/%s/%s is a%s "
7871                        "card%s%s%s\nwith link type %s "
7872                        "(no portname needed by interface).\n",
7873                        CARD_RDEV_ID(card),
7874                        CARD_WDEV_ID(card),
7875                        CARD_DDEV_ID(card),
7876                        qeth_get_cardname(card),
7877                        (card->info.mcl_level[0]) ? " (level: " : "",
7878                        (card->info.mcl_level[0]) ? card->info.mcl_level : "",
7879                        (card->info.mcl_level[0]) ? ")" : "",
7880                        qeth_get_cardname_short(card));
7881         else
7882                 printk("qeth: Device %s/%s/%s is a%s "
7883                        "card%s%s%s\nwith link type %s.\n",
7884                        CARD_RDEV_ID(card),
7885                        CARD_WDEV_ID(card),
7886                        CARD_DDEV_ID(card),
7887                        qeth_get_cardname(card),
7888                        (card->info.mcl_level[0]) ? " (level: " : "",
7889                        (card->info.mcl_level[0]) ? card->info.mcl_level : "",
7890                        (card->info.mcl_level[0]) ? ")" : "",
7891                        qeth_get_cardname_short(card));
7892 }
7893
7894 static void
7895 qeth_print_status_message(struct qeth_card *card)
7896 {
7897         switch (card->info.type) {
7898         case QETH_CARD_TYPE_OSAE:
7899                 /* VM will use a non-zero first character
7900                  * to indicate a HiperSockets like reporting
7901                  * of the level OSA sets the first character to zero
7902                  * */
7903                 if (!card->info.mcl_level[0]) {
7904                         sprintf(card->info.mcl_level,"%02x%02x",
7905                                 card->info.mcl_level[2],
7906                                 card->info.mcl_level[3]);
7907
7908                         card->info.mcl_level[QETH_MCL_LENGTH] = 0;
7909                         break;
7910                 }
7911                 /* fallthrough */
7912         case QETH_CARD_TYPE_IQD:
7913                 if (card->info.guestlan) {
7914                         card->info.mcl_level[0] = (char) _ebcasc[(__u8)
7915                                 card->info.mcl_level[0]];
7916                         card->info.mcl_level[1] = (char) _ebcasc[(__u8)
7917                                 card->info.mcl_level[1]];
7918                         card->info.mcl_level[2] = (char) _ebcasc[(__u8)
7919                                 card->info.mcl_level[2]];
7920                         card->info.mcl_level[3] = (char) _ebcasc[(__u8)
7921                                 card->info.mcl_level[3]];
7922                         card->info.mcl_level[QETH_MCL_LENGTH] = 0;
7923                 }
7924                 break;
7925         default:
7926                 memset(&card->info.mcl_level[0], 0, QETH_MCL_LENGTH + 1);
7927         }
7928         if (card->info.portname_required)
7929                 qeth_print_status_with_portname(card);
7930         else
7931                 qeth_print_status_no_portname(card);
7932 }
7933
7934 static int
7935 qeth_register_netdev(struct qeth_card *card)
7936 {
7937         QETH_DBF_TEXT(setup, 3, "regnetd");
7938         if (card->dev->reg_state != NETREG_UNINITIALIZED)
7939                 return 0;
7940         /* sysfs magic */
7941         SET_NETDEV_DEV(card->dev, &card->gdev->dev);
7942         return register_netdev(card->dev);
7943 }
7944
7945 static void
7946 qeth_start_again(struct qeth_card *card, int recovery_mode)
7947 {
7948         QETH_DBF_TEXT(setup ,2, "startag");
7949
7950         if (recovery_mode &&
7951             card->info.type != QETH_CARD_TYPE_OSN) {
7952                 qeth_open(card->dev);
7953         } else {
7954                 rtnl_lock();
7955                 dev_open(card->dev);
7956                 rtnl_unlock();
7957         }
7958         /* this also sets saved unicast addresses */
7959         qeth_set_multicast_list(card->dev);
7960 }
7961
7962
7963 /* Layer 2 specific stuff */
7964 #define IGNORE_PARAM_EQ(option,value,reset_value,msg) \
7965         if (card->options.option == value) { \
7966                 PRINT_ERR("%s not supported with layer 2 " \
7967                           "functionality, ignoring option on read" \
7968                           "channel device %s .\n",msg,CARD_RDEV_ID(card)); \
7969                 card->options.option = reset_value; \
7970         }
7971 #define IGNORE_PARAM_NEQ(option,value,reset_value,msg) \
7972         if (card->options.option != value) { \
7973                 PRINT_ERR("%s not supported with layer 2 " \
7974                           "functionality, ignoring option on read" \
7975                           "channel device %s .\n",msg,CARD_RDEV_ID(card)); \
7976                 card->options.option = reset_value; \
7977         }
7978
7979
7980 static void qeth_make_parameters_consistent(struct qeth_card *card)
7981 {
7982
7983         if (card->options.layer2 == 0)
7984                 return;
7985         if (card->info.type == QETH_CARD_TYPE_OSN)
7986                 return;
7987         if (card->info.type == QETH_CARD_TYPE_IQD) {
7988                 PRINT_ERR("Device %s does not support layer 2 functionality." \
7989                           " Ignoring layer2 option.\n",CARD_BUS_ID(card));
7990                 card->options.layer2 = 0;
7991                 return;
7992         }
7993         IGNORE_PARAM_NEQ(route4.type, NO_ROUTER, NO_ROUTER,
7994                          "Routing options are");
7995 #ifdef CONFIG_QETH_IPV6
7996         IGNORE_PARAM_NEQ(route6.type, NO_ROUTER, NO_ROUTER,
7997                          "Routing options are");
7998 #endif
7999         IGNORE_PARAM_EQ(checksum_type, HW_CHECKSUMMING,
8000                         QETH_CHECKSUM_DEFAULT,
8001                         "Checksumming options are");
8002         IGNORE_PARAM_NEQ(broadcast_mode, QETH_TR_BROADCAST_ALLRINGS,
8003                          QETH_TR_BROADCAST_ALLRINGS,
8004                          "Broadcast mode options are");
8005         IGNORE_PARAM_NEQ(macaddr_mode, QETH_TR_MACADDR_NONCANONICAL,
8006                          QETH_TR_MACADDR_NONCANONICAL,
8007                          "Canonical MAC addr options are");
8008         IGNORE_PARAM_NEQ(fake_broadcast, 0, 0,
8009                          "Broadcast faking options are");
8010         IGNORE_PARAM_NEQ(add_hhlen, DEFAULT_ADD_HHLEN,
8011                          DEFAULT_ADD_HHLEN,"Option add_hhlen is");
8012         IGNORE_PARAM_NEQ(fake_ll, 0, 0,"Option fake_ll is");
8013 }
8014
8015
8016 static int
8017 __qeth_set_online(struct ccwgroup_device *gdev, int recovery_mode)
8018 {
8019         struct qeth_card *card = gdev->dev.driver_data;
8020         int rc = 0;
8021         enum qeth_card_states recover_flag;
8022
8023         BUG_ON(!card);
8024         QETH_DBF_TEXT(setup ,2, "setonlin");
8025         QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
8026
8027         qeth_set_allowed_threads(card, QETH_RECOVER_THREAD, 1);
8028         if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD)){
8029                 PRINT_WARN("set_online of card %s interrupted by user!\n",
8030                            CARD_BUS_ID(card));
8031                 return -ERESTARTSYS;
8032         }
8033
8034         recover_flag = card->state;
8035         if ((rc = ccw_device_set_online(CARD_RDEV(card))) ||
8036             (rc = ccw_device_set_online(CARD_WDEV(card))) ||
8037             (rc = ccw_device_set_online(CARD_DDEV(card)))){
8038                 QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
8039                 return -EIO;
8040         }
8041
8042         qeth_make_parameters_consistent(card);
8043
8044         if ((rc = qeth_hardsetup_card(card))){
8045                 QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
8046                 goto out_remove;
8047         }
8048         card->state = CARD_STATE_HARDSETUP;
8049
8050         if (!(rc = qeth_query_ipassists(card,QETH_PROT_IPV4)))
8051                 rc = qeth_get_unique_id(card);
8052
8053         if (rc && card->options.layer2 == 0) {
8054                 QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
8055                 goto out_remove;
8056         }
8057         qeth_print_status_message(card);
8058         if ((rc = qeth_register_netdev(card))){
8059                 QETH_DBF_TEXT_(setup, 2, "4err%d", rc);
8060                 goto out_remove;
8061         }
8062         if ((rc = qeth_softsetup_card(card))){
8063                 QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
8064                 goto out_remove;
8065         }
8066
8067         if ((rc = qeth_init_qdio_queues(card))){
8068                 QETH_DBF_TEXT_(setup, 2, "6err%d", rc);
8069                 goto out_remove;
8070         }
8071         card->state = CARD_STATE_SOFTSETUP;
8072         netif_carrier_on(card->dev);
8073
8074         qeth_set_allowed_threads(card, 0xffffffff, 0);
8075         if (recover_flag == CARD_STATE_RECOVER)
8076                 qeth_start_again(card, recovery_mode);
8077         qeth_notify_processes();
8078         return 0;
8079 out_remove:
8080         card->use_hard_stop = 1;
8081         qeth_stop_card(card, 0);
8082         ccw_device_set_offline(CARD_DDEV(card));
8083         ccw_device_set_offline(CARD_WDEV(card));
8084         ccw_device_set_offline(CARD_RDEV(card));
8085         if (recover_flag == CARD_STATE_RECOVER)
8086                 card->state = CARD_STATE_RECOVER;
8087         else
8088                 card->state = CARD_STATE_DOWN;
8089         return -ENODEV;
8090 }
8091
8092 static int
8093 qeth_set_online(struct ccwgroup_device *gdev)
8094 {
8095         return __qeth_set_online(gdev, 0);
8096 }
8097
8098 static struct ccw_device_id qeth_ids[] = {
8099         {CCW_DEVICE(0x1731, 0x01), .driver_info = QETH_CARD_TYPE_OSAE},
8100         {CCW_DEVICE(0x1731, 0x05), .driver_info = QETH_CARD_TYPE_IQD},
8101         {CCW_DEVICE(0x1731, 0x06), .driver_info = QETH_CARD_TYPE_OSN},
8102         {},
8103 };
8104 MODULE_DEVICE_TABLE(ccw, qeth_ids);
8105
8106 struct device *qeth_root_dev = NULL;
8107
8108 struct ccwgroup_driver qeth_ccwgroup_driver = {
8109         .owner = THIS_MODULE,
8110         .name = "qeth",
8111         .driver_id = 0xD8C5E3C8,
8112         .probe = qeth_probe_device,
8113         .remove = qeth_remove_device,
8114         .set_online = qeth_set_online,
8115         .set_offline = qeth_set_offline,
8116 };
8117
8118 struct ccw_driver qeth_ccw_driver = {
8119         .name = "qeth",
8120         .ids = qeth_ids,
8121         .probe = ccwgroup_probe_ccwdev,
8122         .remove = ccwgroup_remove_ccwdev,
8123 };
8124
8125
8126 static void
8127 qeth_unregister_dbf_views(void)
8128 {
8129         if (qeth_dbf_setup)
8130                 debug_unregister(qeth_dbf_setup);
8131         if (qeth_dbf_qerr)
8132                 debug_unregister(qeth_dbf_qerr);
8133         if (qeth_dbf_sense)
8134                 debug_unregister(qeth_dbf_sense);
8135         if (qeth_dbf_misc)
8136                 debug_unregister(qeth_dbf_misc);
8137         if (qeth_dbf_data)
8138                 debug_unregister(qeth_dbf_data);
8139         if (qeth_dbf_control)
8140                 debug_unregister(qeth_dbf_control);
8141         if (qeth_dbf_trace)
8142                 debug_unregister(qeth_dbf_trace);
8143 }
8144 static int
8145 qeth_register_dbf_views(void)
8146 {
8147         qeth_dbf_setup = debug_register(QETH_DBF_SETUP_NAME,
8148                                         QETH_DBF_SETUP_PAGES,
8149                                         QETH_DBF_SETUP_NR_AREAS,
8150                                         QETH_DBF_SETUP_LEN);
8151         qeth_dbf_misc = debug_register(QETH_DBF_MISC_NAME,
8152                                        QETH_DBF_MISC_PAGES,
8153                                        QETH_DBF_MISC_NR_AREAS,
8154                                        QETH_DBF_MISC_LEN);
8155         qeth_dbf_data = debug_register(QETH_DBF_DATA_NAME,
8156                                        QETH_DBF_DATA_PAGES,
8157                                        QETH_DBF_DATA_NR_AREAS,
8158                                        QETH_DBF_DATA_LEN);
8159         qeth_dbf_control = debug_register(QETH_DBF_CONTROL_NAME,
8160                                           QETH_DBF_CONTROL_PAGES,
8161                                           QETH_DBF_CONTROL_NR_AREAS,
8162                                           QETH_DBF_CONTROL_LEN);
8163         qeth_dbf_sense = debug_register(QETH_DBF_SENSE_NAME,
8164                                         QETH_DBF_SENSE_PAGES,
8165                                         QETH_DBF_SENSE_NR_AREAS,
8166                                         QETH_DBF_SENSE_LEN);
8167         qeth_dbf_qerr = debug_register(QETH_DBF_QERR_NAME,
8168                                        QETH_DBF_QERR_PAGES,
8169                                        QETH_DBF_QERR_NR_AREAS,
8170                                        QETH_DBF_QERR_LEN);
8171         qeth_dbf_trace = debug_register(QETH_DBF_TRACE_NAME,
8172                                         QETH_DBF_TRACE_PAGES,
8173                                         QETH_DBF_TRACE_NR_AREAS,
8174                                         QETH_DBF_TRACE_LEN);
8175
8176         if ((qeth_dbf_setup == NULL) || (qeth_dbf_misc == NULL)    ||
8177             (qeth_dbf_data == NULL)  || (qeth_dbf_control == NULL) ||
8178             (qeth_dbf_sense == NULL) || (qeth_dbf_qerr == NULL)    ||
8179             (qeth_dbf_trace == NULL)) {
8180                 qeth_unregister_dbf_views();
8181                 return -ENOMEM;
8182         }
8183         debug_register_view(qeth_dbf_setup, &debug_hex_ascii_view);
8184         debug_set_level(qeth_dbf_setup, QETH_DBF_SETUP_LEVEL);
8185
8186         debug_register_view(qeth_dbf_misc, &debug_hex_ascii_view);
8187         debug_set_level(qeth_dbf_misc, QETH_DBF_MISC_LEVEL);
8188
8189         debug_register_view(qeth_dbf_data, &debug_hex_ascii_view);
8190         debug_set_level(qeth_dbf_data, QETH_DBF_DATA_LEVEL);
8191
8192         debug_register_view(qeth_dbf_control, &debug_hex_ascii_view);
8193         debug_set_level(qeth_dbf_control, QETH_DBF_CONTROL_LEVEL);
8194
8195         debug_register_view(qeth_dbf_sense, &debug_hex_ascii_view);
8196         debug_set_level(qeth_dbf_sense, QETH_DBF_SENSE_LEVEL);
8197
8198         debug_register_view(qeth_dbf_qerr, &debug_hex_ascii_view);
8199         debug_set_level(qeth_dbf_qerr, QETH_DBF_QERR_LEVEL);
8200
8201         debug_register_view(qeth_dbf_trace, &debug_hex_ascii_view);
8202         debug_set_level(qeth_dbf_trace, QETH_DBF_TRACE_LEVEL);
8203
8204         return 0;
8205 }
8206
8207 #ifdef CONFIG_QETH_IPV6
8208 extern struct neigh_table arp_tbl;
8209 static struct neigh_ops *arp_direct_ops;
8210 static int (*qeth_old_arp_constructor) (struct neighbour *);
8211
8212 static struct neigh_ops arp_direct_ops_template = {
8213         .family = AF_INET,
8214         .solicit = NULL,
8215         .error_report = NULL,
8216         .output = dev_queue_xmit,
8217         .connected_output = dev_queue_xmit,
8218         .hh_output = dev_queue_xmit,
8219         .queue_xmit = dev_queue_xmit
8220 };
8221
8222 static int
8223 qeth_arp_constructor(struct neighbour *neigh)
8224 {
8225         struct net_device *dev = neigh->dev;
8226         struct in_device *in_dev;
8227         struct neigh_parms *parms;
8228         struct qeth_card *card;
8229
8230         card = qeth_get_card_from_dev(dev);
8231         if (card == NULL)
8232                 goto out;
8233         if((card->options.layer2) ||
8234            (card->dev->hard_header == qeth_fake_header))
8235                 goto out;
8236
8237         rcu_read_lock();
8238         in_dev = __in_dev_get_rcu(dev);
8239         if (in_dev == NULL) {
8240                 rcu_read_unlock();
8241                 return -EINVAL;
8242         }
8243
8244         parms = in_dev->arp_parms;
8245         __neigh_parms_put(neigh->parms);
8246         neigh->parms = neigh_parms_clone(parms);
8247         rcu_read_unlock();
8248
8249         neigh->type = inet_addr_type(*(__be32 *) neigh->primary_key);
8250         neigh->nud_state = NUD_NOARP;
8251         neigh->ops = arp_direct_ops;
8252         neigh->output = neigh->ops->queue_xmit;
8253         return 0;
8254 out:
8255         return qeth_old_arp_constructor(neigh);
8256 }
8257 #endif  /*CONFIG_QETH_IPV6*/
8258
8259 /*
8260  * IP address takeover related functions
8261  */
8262 static void
8263 qeth_clear_ipato_list(struct qeth_card *card)
8264 {
8265         struct qeth_ipato_entry *ipatoe, *tmp;
8266         unsigned long flags;
8267
8268         spin_lock_irqsave(&card->ip_lock, flags);
8269         list_for_each_entry_safe(ipatoe, tmp, &card->ipato.entries, entry) {
8270                 list_del(&ipatoe->entry);
8271                 kfree(ipatoe);
8272         }
8273         spin_unlock_irqrestore(&card->ip_lock, flags);
8274 }
8275
8276 int
8277 qeth_add_ipato_entry(struct qeth_card *card, struct qeth_ipato_entry *new)
8278 {
8279         struct qeth_ipato_entry *ipatoe;
8280         unsigned long flags;
8281         int rc = 0;
8282
8283         QETH_DBF_TEXT(trace, 2, "addipato");
8284         spin_lock_irqsave(&card->ip_lock, flags);
8285         list_for_each_entry(ipatoe, &card->ipato.entries, entry){
8286                 if (ipatoe->proto != new->proto)
8287                         continue;
8288                 if (!memcmp(ipatoe->addr, new->addr,
8289                             (ipatoe->proto == QETH_PROT_IPV4)? 4:16) &&
8290                     (ipatoe->mask_bits == new->mask_bits)){
8291                         PRINT_WARN("ipato entry already exists!\n");
8292                         rc = -EEXIST;
8293                         break;
8294                 }
8295         }
8296         if (!rc) {
8297                 list_add_tail(&new->entry, &card->ipato.entries);
8298         }
8299         spin_unlock_irqrestore(&card->ip_lock, flags);
8300         return rc;
8301 }
8302
8303 void
8304 qeth_del_ipato_entry(struct qeth_card *card, enum qeth_prot_versions proto,
8305                      u8 *addr, int mask_bits)
8306 {
8307         struct qeth_ipato_entry *ipatoe, *tmp;
8308         unsigned long flags;
8309
8310         QETH_DBF_TEXT(trace, 2, "delipato");
8311         spin_lock_irqsave(&card->ip_lock, flags);
8312         list_for_each_entry_safe(ipatoe, tmp, &card->ipato.entries, entry){
8313                 if (ipatoe->proto != proto)
8314                         continue;
8315                 if (!memcmp(ipatoe->addr, addr,
8316                             (proto == QETH_PROT_IPV4)? 4:16) &&
8317                     (ipatoe->mask_bits == mask_bits)){
8318                         list_del(&ipatoe->entry);
8319                         kfree(ipatoe);
8320                 }
8321         }
8322         spin_unlock_irqrestore(&card->ip_lock, flags);
8323 }
8324
8325 static void
8326 qeth_convert_addr_to_bits(u8 *addr, u8 *bits, int len)
8327 {
8328         int i, j;
8329         u8 octet;
8330
8331         for (i = 0; i < len; ++i){
8332                 octet = addr[i];
8333                 for (j = 7; j >= 0; --j){
8334                         bits[i*8 + j] = octet & 1;
8335                         octet >>= 1;
8336                 }
8337         }
8338 }
8339
8340 static int
8341 qeth_is_addr_covered_by_ipato(struct qeth_card *card, struct qeth_ipaddr *addr)
8342 {
8343         struct qeth_ipato_entry *ipatoe;
8344         u8 addr_bits[128] = {0, };
8345         u8 ipatoe_bits[128] = {0, };
8346         int rc = 0;
8347
8348         if (!card->ipato.enabled)
8349                 return 0;
8350
8351         qeth_convert_addr_to_bits((u8 *) &addr->u, addr_bits,
8352                                   (addr->proto == QETH_PROT_IPV4)? 4:16);
8353         list_for_each_entry(ipatoe, &card->ipato.entries, entry){
8354                 if (addr->proto != ipatoe->proto)
8355                         continue;
8356                 qeth_convert_addr_to_bits(ipatoe->addr, ipatoe_bits,
8357                                           (ipatoe->proto==QETH_PROT_IPV4) ?
8358                                           4:16);
8359                 if (addr->proto == QETH_PROT_IPV4)
8360                         rc = !memcmp(addr_bits, ipatoe_bits,
8361                                      min(32, ipatoe->mask_bits));
8362                 else
8363                         rc = !memcmp(addr_bits, ipatoe_bits,
8364                                      min(128, ipatoe->mask_bits));
8365                 if (rc)
8366                         break;
8367         }
8368         /* invert? */
8369         if ((addr->proto == QETH_PROT_IPV4) && card->ipato.invert4)
8370                 rc = !rc;
8371         else if ((addr->proto == QETH_PROT_IPV6) && card->ipato.invert6)
8372                 rc = !rc;
8373
8374         return rc;
8375 }
8376
8377 /*
8378  * VIPA related functions
8379  */
8380 int
8381 qeth_add_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
8382               const u8 *addr)
8383 {
8384         struct qeth_ipaddr *ipaddr;
8385         unsigned long flags;
8386         int rc = 0;
8387
8388         ipaddr = qeth_get_addr_buffer(proto);
8389         if (ipaddr){
8390                 if (proto == QETH_PROT_IPV4){
8391                         QETH_DBF_TEXT(trace, 2, "addvipa4");
8392                         memcpy(&ipaddr->u.a4.addr, addr, 4);
8393                         ipaddr->u.a4.mask = 0;
8394 #ifdef CONFIG_QETH_IPV6
8395                 } else if (proto == QETH_PROT_IPV6){
8396                         QETH_DBF_TEXT(trace, 2, "addvipa6");
8397                         memcpy(&ipaddr->u.a6.addr, addr, 16);
8398                         ipaddr->u.a6.pfxlen = 0;
8399 #endif
8400                 }
8401                 ipaddr->type = QETH_IP_TYPE_VIPA;
8402                 ipaddr->set_flags = QETH_IPA_SETIP_VIPA_FLAG;
8403                 ipaddr->del_flags = QETH_IPA_DELIP_VIPA_FLAG;
8404         } else
8405                 return -ENOMEM;
8406         spin_lock_irqsave(&card->ip_lock, flags);
8407         if (__qeth_address_exists_in_list(&card->ip_list, ipaddr, 0) ||
8408             __qeth_address_exists_in_list(card->ip_tbd_list, ipaddr, 0))
8409                 rc = -EEXIST;
8410         spin_unlock_irqrestore(&card->ip_lock, flags);
8411         if (rc){
8412                 PRINT_WARN("Cannot add VIPA. Address already exists!\n");
8413                 return rc;
8414         }
8415         if (!qeth_add_ip(card, ipaddr))
8416                 kfree(ipaddr);
8417         qeth_set_ip_addr_list(card);
8418         return rc;
8419 }
8420
8421 void
8422 qeth_del_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
8423               const u8 *addr)
8424 {
8425         struct qeth_ipaddr *ipaddr;
8426
8427         ipaddr = qeth_get_addr_buffer(proto);
8428         if (ipaddr){
8429                 if (proto == QETH_PROT_IPV4){
8430                         QETH_DBF_TEXT(trace, 2, "delvipa4");
8431                         memcpy(&ipaddr->u.a4.addr, addr, 4);
8432                         ipaddr->u.a4.mask = 0;
8433 #ifdef CONFIG_QETH_IPV6
8434                 } else if (proto == QETH_PROT_IPV6){
8435                         QETH_DBF_TEXT(trace, 2, "delvipa6");
8436                         memcpy(&ipaddr->u.a6.addr, addr, 16);
8437                         ipaddr->u.a6.pfxlen = 0;
8438 #endif
8439                 }
8440                 ipaddr->type = QETH_IP_TYPE_VIPA;
8441         } else
8442                 return;
8443         if (!qeth_delete_ip(card, ipaddr))
8444                 kfree(ipaddr);
8445         qeth_set_ip_addr_list(card);
8446 }
8447
8448 /*
8449  * proxy ARP related functions
8450  */
8451 int
8452 qeth_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
8453               const u8 *addr)
8454 {
8455         struct qeth_ipaddr *ipaddr;
8456         unsigned long flags;
8457         int rc = 0;
8458
8459         ipaddr = qeth_get_addr_buffer(proto);
8460         if (ipaddr){
8461                 if (proto == QETH_PROT_IPV4){
8462                         QETH_DBF_TEXT(trace, 2, "addrxip4");
8463                         memcpy(&ipaddr->u.a4.addr, addr, 4);
8464                         ipaddr->u.a4.mask = 0;
8465 #ifdef CONFIG_QETH_IPV6
8466                 } else if (proto == QETH_PROT_IPV6){
8467                         QETH_DBF_TEXT(trace, 2, "addrxip6");
8468                         memcpy(&ipaddr->u.a6.addr, addr, 16);
8469                         ipaddr->u.a6.pfxlen = 0;
8470 #endif
8471                 }
8472                 ipaddr->type = QETH_IP_TYPE_RXIP;
8473                 ipaddr->set_flags = QETH_IPA_SETIP_TAKEOVER_FLAG;
8474                 ipaddr->del_flags = 0;
8475         } else
8476                 return -ENOMEM;
8477         spin_lock_irqsave(&card->ip_lock, flags);
8478         if (__qeth_address_exists_in_list(&card->ip_list, ipaddr, 0) ||
8479             __qeth_address_exists_in_list(card->ip_tbd_list, ipaddr, 0))
8480                 rc = -EEXIST;
8481         spin_unlock_irqrestore(&card->ip_lock, flags);
8482         if (rc){
8483                 PRINT_WARN("Cannot add RXIP. Address already exists!\n");
8484                 return rc;
8485         }
8486         if (!qeth_add_ip(card, ipaddr))
8487                 kfree(ipaddr);
8488         qeth_set_ip_addr_list(card);
8489         return 0;
8490 }
8491
8492 void
8493 qeth_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
8494               const u8 *addr)
8495 {
8496         struct qeth_ipaddr *ipaddr;
8497
8498         ipaddr = qeth_get_addr_buffer(proto);
8499         if (ipaddr){
8500                 if (proto == QETH_PROT_IPV4){
8501                         QETH_DBF_TEXT(trace, 2, "addrxip4");
8502                         memcpy(&ipaddr->u.a4.addr, addr, 4);
8503                         ipaddr->u.a4.mask = 0;
8504 #ifdef CONFIG_QETH_IPV6
8505                 } else if (proto == QETH_PROT_IPV6){
8506                         QETH_DBF_TEXT(trace, 2, "addrxip6");
8507                         memcpy(&ipaddr->u.a6.addr, addr, 16);
8508                         ipaddr->u.a6.pfxlen = 0;
8509 #endif
8510                 }
8511                 ipaddr->type = QETH_IP_TYPE_RXIP;
8512         } else
8513                 return;
8514         if (!qeth_delete_ip(card, ipaddr))
8515                 kfree(ipaddr);
8516         qeth_set_ip_addr_list(card);
8517 }
8518
8519 /**
8520  * IP event handler
8521  */
8522 static int
8523 qeth_ip_event(struct notifier_block *this,
8524               unsigned long event,void *ptr)
8525 {
8526         struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
8527         struct net_device *dev =(struct net_device *) ifa->ifa_dev->dev;
8528         struct qeth_ipaddr *addr;
8529         struct qeth_card *card;
8530
8531         QETH_DBF_TEXT(trace,3,"ipevent");
8532         card = qeth_get_card_from_dev(dev);
8533         if (!card)
8534                 return NOTIFY_DONE;
8535         if (card->options.layer2)
8536                 return NOTIFY_DONE;
8537
8538         addr = qeth_get_addr_buffer(QETH_PROT_IPV4);
8539         if (addr != NULL) {
8540                 addr->u.a4.addr = ifa->ifa_address;
8541                 addr->u.a4.mask = ifa->ifa_mask;
8542                 addr->type = QETH_IP_TYPE_NORMAL;
8543         } else
8544                 goto out;
8545
8546         switch(event) {
8547         case NETDEV_UP:
8548                 if (!qeth_add_ip(card, addr))
8549                         kfree(addr);
8550                 break;
8551         case NETDEV_DOWN:
8552                 if (!qeth_delete_ip(card, addr))
8553                         kfree(addr);
8554                 break;
8555         default:
8556                 break;
8557         }
8558         qeth_set_ip_addr_list(card);
8559 out:
8560         return NOTIFY_DONE;
8561 }
8562
8563 static struct notifier_block qeth_ip_notifier = {
8564         qeth_ip_event,
8565         NULL,
8566 };
8567
8568 #ifdef CONFIG_QETH_IPV6
8569 /**
8570  * IPv6 event handler
8571  */
8572 static int
8573 qeth_ip6_event(struct notifier_block *this,
8574               unsigned long event,void *ptr)
8575 {
8576
8577         struct inet6_ifaddr *ifa = (struct inet6_ifaddr *)ptr;
8578         struct net_device *dev = (struct net_device *)ifa->idev->dev;
8579         struct qeth_ipaddr *addr;
8580         struct qeth_card *card;
8581
8582         QETH_DBF_TEXT(trace,3,"ip6event");
8583
8584         card = qeth_get_card_from_dev(dev);
8585         if (!card)
8586                 return NOTIFY_DONE;
8587         if (!qeth_is_supported(card, IPA_IPV6))
8588                 return NOTIFY_DONE;
8589
8590         addr = qeth_get_addr_buffer(QETH_PROT_IPV6);
8591         if (addr != NULL) {
8592                 memcpy(&addr->u.a6.addr, &ifa->addr, sizeof(struct in6_addr));
8593                 addr->u.a6.pfxlen = ifa->prefix_len;
8594                 addr->type = QETH_IP_TYPE_NORMAL;
8595         } else
8596                 goto out;
8597
8598         switch(event) {
8599         case NETDEV_UP:
8600                 if (!qeth_add_ip(card, addr))
8601                         kfree(addr);
8602                 break;
8603         case NETDEV_DOWN:
8604                 if (!qeth_delete_ip(card, addr))
8605                         kfree(addr);
8606                 break;
8607         default:
8608                 break;
8609         }
8610         qeth_set_ip_addr_list(card);
8611 out:
8612         return NOTIFY_DONE;
8613 }
8614
8615 static struct notifier_block qeth_ip6_notifier = {
8616         qeth_ip6_event,
8617         NULL,
8618 };
8619 #endif
8620
8621 static int
8622 __qeth_reboot_event_card(struct device *dev, void *data)
8623 {
8624         struct qeth_card *card;
8625
8626         card = (struct qeth_card *) dev->driver_data;
8627         qeth_clear_ip_list(card, 0, 0);
8628         qeth_qdio_clear_card(card, 0);
8629         qeth_clear_qdio_buffers(card);
8630         return 0;
8631 }
8632
8633 static int
8634 qeth_reboot_event(struct notifier_block *this, unsigned long event, void *ptr)
8635 {
8636         int ret;
8637
8638         ret = driver_for_each_device(&qeth_ccwgroup_driver.driver, NULL, NULL,
8639                                      __qeth_reboot_event_card);
8640         return ret ? NOTIFY_BAD : NOTIFY_DONE;
8641 }
8642
8643
8644 static struct notifier_block qeth_reboot_notifier = {
8645         qeth_reboot_event,
8646         NULL,
8647 };
8648
8649 static int
8650 qeth_register_notifiers(void)
8651 {
8652         int r;
8653
8654         QETH_DBF_TEXT(trace,5,"regnotif");
8655         if ((r = register_reboot_notifier(&qeth_reboot_notifier)))
8656                 return r;
8657         if ((r = register_inetaddr_notifier(&qeth_ip_notifier)))
8658                 goto out_reboot;
8659 #ifdef CONFIG_QETH_IPV6
8660         if ((r = register_inet6addr_notifier(&qeth_ip6_notifier)))
8661                 goto out_ipv4;
8662 #endif
8663         return 0;
8664
8665 #ifdef CONFIG_QETH_IPV6
8666 out_ipv4:
8667         unregister_inetaddr_notifier(&qeth_ip_notifier);
8668 #endif
8669 out_reboot:
8670         unregister_reboot_notifier(&qeth_reboot_notifier);
8671         return r;
8672 }
8673
8674 /**
8675  * unregister all event notifiers
8676  */
8677 static void
8678 qeth_unregister_notifiers(void)
8679 {
8680
8681         QETH_DBF_TEXT(trace,5,"unregnot");
8682         BUG_ON(unregister_reboot_notifier(&qeth_reboot_notifier));
8683         BUG_ON(unregister_inetaddr_notifier(&qeth_ip_notifier));
8684 #ifdef CONFIG_QETH_IPV6
8685         BUG_ON(unregister_inet6addr_notifier(&qeth_ip6_notifier));
8686 #endif /* QETH_IPV6 */
8687
8688 }
8689
8690 #ifdef CONFIG_QETH_IPV6
8691 static int
8692 qeth_ipv6_init(void)
8693 {
8694         qeth_old_arp_constructor = arp_tbl.constructor;
8695         write_lock_bh(&arp_tbl.lock);
8696         arp_tbl.constructor = qeth_arp_constructor;
8697         write_unlock_bh(&arp_tbl.lock);
8698
8699         arp_direct_ops = (struct neigh_ops*)
8700                 kmalloc(sizeof(struct neigh_ops), GFP_KERNEL);
8701         if (!arp_direct_ops)
8702                 return -ENOMEM;
8703
8704         memcpy(arp_direct_ops, &arp_direct_ops_template,
8705                sizeof(struct neigh_ops));
8706
8707         return 0;
8708 }
8709
8710 static void
8711 qeth_ipv6_uninit(void)
8712 {
8713         write_lock_bh(&arp_tbl.lock);
8714         arp_tbl.constructor = qeth_old_arp_constructor;
8715         write_unlock_bh(&arp_tbl.lock);
8716         kfree(arp_direct_ops);
8717 }
8718 #endif /* CONFIG_QETH_IPV6 */
8719
8720 static void
8721 qeth_sysfs_unregister(void)
8722 {
8723         s390_root_dev_unregister(qeth_root_dev);
8724         qeth_remove_driver_attributes();
8725         ccw_driver_unregister(&qeth_ccw_driver);
8726         ccwgroup_driver_unregister(&qeth_ccwgroup_driver);
8727 }
8728
8729 /**
8730  * register qeth at sysfs
8731  */
8732 static int
8733 qeth_sysfs_register(void)
8734 {
8735         int rc;
8736
8737         rc = ccwgroup_driver_register(&qeth_ccwgroup_driver);
8738         if (rc)
8739                 goto out;
8740
8741         rc = ccw_driver_register(&qeth_ccw_driver);
8742         if (rc)
8743                 goto out_ccw_driver;
8744
8745         rc = qeth_create_driver_attributes();
8746         if (rc)
8747                 goto out_qeth_attr;
8748
8749         qeth_root_dev = s390_root_dev_register("qeth");
8750         rc = IS_ERR(qeth_root_dev) ? PTR_ERR(qeth_root_dev) : 0;
8751         if (!rc)
8752                 goto out;
8753
8754         qeth_remove_driver_attributes();
8755 out_qeth_attr:
8756         ccw_driver_unregister(&qeth_ccw_driver);
8757 out_ccw_driver:
8758         ccwgroup_driver_unregister(&qeth_ccwgroup_driver);
8759 out:
8760         return rc;
8761 }
8762
8763 /***
8764  * init function
8765  */
8766 static int __init
8767 qeth_init(void)
8768 {
8769         int rc;
8770
8771         PRINT_INFO("loading %s\n", version);
8772
8773         INIT_LIST_HEAD(&qeth_card_list.list);
8774         INIT_LIST_HEAD(&qeth_notify_list);
8775         spin_lock_init(&qeth_notify_lock);
8776         rwlock_init(&qeth_card_list.rwlock);
8777
8778         rc = qeth_register_dbf_views();
8779         if (rc)
8780                 goto out_err;
8781
8782         rc = qeth_sysfs_register();
8783         if (rc)
8784                 goto out_dbf;
8785
8786 #ifdef CONFIG_QETH_IPV6
8787         rc = qeth_ipv6_init();
8788         if (rc) {
8789                 PRINT_ERR("Out of memory during ipv6 init code = %d\n", rc);
8790                 goto out_sysfs;
8791         }
8792 #endif /* QETH_IPV6 */
8793         rc = qeth_register_notifiers();
8794         if (rc)
8795                 goto out_ipv6;
8796         rc = qeth_create_procfs_entries();
8797         if (rc)
8798                 goto out_notifiers;
8799
8800         return rc;
8801
8802 out_notifiers:
8803         qeth_unregister_notifiers();
8804 out_ipv6:
8805 #ifdef CONFIG_QETH_IPV6
8806         qeth_ipv6_uninit();
8807 out_sysfs:
8808 #endif /* QETH_IPV6 */
8809         qeth_sysfs_unregister();
8810 out_dbf:
8811         qeth_unregister_dbf_views();
8812 out_err:
8813         PRINT_ERR("Initialization failed with code %d\n", rc);
8814         return rc;
8815 }
8816
8817 static void
8818 __exit qeth_exit(void)
8819 {
8820         struct qeth_card *card, *tmp;
8821         unsigned long flags;
8822
8823         QETH_DBF_TEXT(trace,1, "cleanup.");
8824
8825         /*
8826          * Weed would not need to clean up our devices here, because the
8827          * common device layer calls qeth_remove_device for each device
8828          * as soon as we unregister our driver (done in qeth_sysfs_unregister).
8829          * But we do cleanup here so we can do a "soft" shutdown of our cards.
8830          * qeth_remove_device called by the common device layer would otherwise
8831          * do a "hard" shutdown (card->use_hard_stop is set to one in
8832          * qeth_remove_device).
8833          */
8834 again:
8835         read_lock_irqsave(&qeth_card_list.rwlock, flags);
8836         list_for_each_entry_safe(card, tmp, &qeth_card_list.list, list){
8837                 read_unlock_irqrestore(&qeth_card_list.rwlock, flags);
8838                 qeth_set_offline(card->gdev);
8839                 qeth_remove_device(card->gdev);
8840                 goto again;
8841         }
8842         read_unlock_irqrestore(&qeth_card_list.rwlock, flags);
8843 #ifdef CONFIG_QETH_IPV6
8844         qeth_ipv6_uninit();
8845 #endif
8846         qeth_unregister_notifiers();
8847         qeth_remove_procfs_entries();
8848         qeth_sysfs_unregister();
8849         qeth_unregister_dbf_views();
8850         printk("qeth: removed\n");
8851 }
8852
8853 EXPORT_SYMBOL(qeth_osn_register);
8854 EXPORT_SYMBOL(qeth_osn_deregister);
8855 EXPORT_SYMBOL(qeth_osn_assist);
8856 module_init(qeth_init);
8857 module_exit(qeth_exit);
8858 MODULE_AUTHOR("Frank Pavlic <fpavlic@de.ibm.com>");
8859 MODULE_DESCRIPTION("Linux on zSeries OSA Express and HiperSockets support\n" \
8860                                       "Copyright 2000,2003 IBM Corporation\n");
8861
8862 MODULE_LICENSE("GPL");