aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/net/qeth_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390/net/qeth_main.c')
-rw-r--r--drivers/s390/net/qeth_main.c261
1 files changed, 214 insertions, 47 deletions
diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c
index 692003c9f896..99cceb242ec4 100644
--- a/drivers/s390/net/qeth_main.c
+++ b/drivers/s390/net/qeth_main.c
@@ -1,6 +1,6 @@
1/* 1/*
2 * 2 *
3 * linux/drivers/s390/net/qeth_main.c ($Revision: 1.224 $) 3 * linux/drivers/s390/net/qeth_main.c ($Revision: 1.242 $)
4 * 4 *
5 * Linux on zSeries OSA Express and HiperSockets support 5 * Linux on zSeries OSA Express and HiperSockets support
6 * 6 *
@@ -9,10 +9,10 @@
9 * Author(s): Original Code written by 9 * Author(s): Original Code written by
10 * Utz Bacher (utz.bacher@de.ibm.com) 10 * Utz Bacher (utz.bacher@de.ibm.com)
11 * Rewritten by 11 * Rewritten by
12 * Frank Pavlic (pavlic@de.ibm.com) and 12 * Frank Pavlic (fpavlic@de.ibm.com) and
13 * Thomas Spatzier <tspat@de.ibm.com> 13 * Thomas Spatzier <tspat@de.ibm.com>
14 * 14 *
15 * $Revision: 1.224 $ $Date: 2005/05/04 20:19:18 $ 15 * $Revision: 1.242 $ $Date: 2005/05/04 20:19:18 $
16 * 16 *
17 * This program is free software; you can redistribute it and/or modify 17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by 18 * it under the terms of the GNU General Public License as published by
@@ -72,7 +72,7 @@
72#include "qeth_eddp.h" 72#include "qeth_eddp.h"
73#include "qeth_tso.h" 73#include "qeth_tso.h"
74 74
75#define VERSION_QETH_C "$Revision: 1.224 $" 75#define VERSION_QETH_C "$Revision: 1.242 $"
76static const char *version = "qeth S/390 OSA-Express driver"; 76static const char *version = "qeth S/390 OSA-Express driver";
77 77
78/** 78/**
@@ -160,6 +160,9 @@ static void
160qeth_set_multicast_list(struct net_device *); 160qeth_set_multicast_list(struct net_device *);
161 161
162static void 162static void
163qeth_setadp_promisc_mode(struct qeth_card *);
164
165static void
163qeth_notify_processes(void) 166qeth_notify_processes(void)
164{ 167{
165 /*notify all registered processes */ 168 /*notify all registered processes */
@@ -602,11 +605,20 @@ __qeth_ref_ip_on_card(struct qeth_card *card, struct qeth_ipaddr *todo,
602 int found = 0; 605 int found = 0;
603 606
604 list_for_each_entry(addr, &card->ip_list, entry) { 607 list_for_each_entry(addr, &card->ip_list, entry) {
608 if (card->options.layer2) {
609 if ((addr->type == todo->type) &&
610 (memcmp(&addr->mac, &todo->mac,
611 OSA_ADDR_LEN) == 0)) {
612 found = 1;
613 break;
614 }
615 continue;
616 }
605 if ((addr->proto == QETH_PROT_IPV4) && 617 if ((addr->proto == QETH_PROT_IPV4) &&
606 (todo->proto == QETH_PROT_IPV4) && 618 (todo->proto == QETH_PROT_IPV4) &&
607 (addr->type == todo->type) && 619 (addr->type == todo->type) &&
608 (addr->u.a4.addr == todo->u.a4.addr) && 620 (addr->u.a4.addr == todo->u.a4.addr) &&
609 (addr->u.a4.mask == todo->u.a4.mask) ){ 621 (addr->u.a4.mask == todo->u.a4.mask)) {
610 found = 1; 622 found = 1;
611 break; 623 break;
612 } 624 }
@@ -615,12 +627,12 @@ __qeth_ref_ip_on_card(struct qeth_card *card, struct qeth_ipaddr *todo,
615 (addr->type == todo->type) && 627 (addr->type == todo->type) &&
616 (addr->u.a6.pfxlen == todo->u.a6.pfxlen) && 628 (addr->u.a6.pfxlen == todo->u.a6.pfxlen) &&
617 (memcmp(&addr->u.a6.addr, &todo->u.a6.addr, 629 (memcmp(&addr->u.a6.addr, &todo->u.a6.addr,
618 sizeof(struct in6_addr)) == 0)) { 630 sizeof(struct in6_addr)) == 0)) {
619 found = 1; 631 found = 1;
620 break; 632 break;
621 } 633 }
622 } 634 }
623 if (found){ 635 if (found) {
624 addr->users += todo->users; 636 addr->users += todo->users;
625 if (addr->users <= 0){ 637 if (addr->users <= 0){
626 *__addr = addr; 638 *__addr = addr;
@@ -632,7 +644,7 @@ __qeth_ref_ip_on_card(struct qeth_card *card, struct qeth_ipaddr *todo,
632 return 0; 644 return 0;
633 } 645 }
634 } 646 }
635 if (todo->users > 0){ 647 if (todo->users > 0) {
636 /* for VIPA and RXIP limit refcount to 1 */ 648 /* for VIPA and RXIP limit refcount to 1 */
637 if (todo->type != QETH_IP_TYPE_NORMAL) 649 if (todo->type != QETH_IP_TYPE_NORMAL)
638 todo->users = 1; 650 todo->users = 1;
@@ -682,12 +694,22 @@ __qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add)
682 if ((addr->type == QETH_IP_TYPE_DEL_ALL_MC) && 694 if ((addr->type == QETH_IP_TYPE_DEL_ALL_MC) &&
683 (tmp->type == QETH_IP_TYPE_DEL_ALL_MC)) 695 (tmp->type == QETH_IP_TYPE_DEL_ALL_MC))
684 return 0; 696 return 0;
697 if (card->options.layer2) {
698 if ((tmp->type == addr->type) &&
699 (tmp->is_multicast == addr->is_multicast) &&
700 (memcmp(&tmp->mac, &addr->mac,
701 OSA_ADDR_LEN) == 0)) {
702 found = 1;
703 break;
704 }
705 continue;
706 }
685 if ((tmp->proto == QETH_PROT_IPV4) && 707 if ((tmp->proto == QETH_PROT_IPV4) &&
686 (addr->proto == QETH_PROT_IPV4) && 708 (addr->proto == QETH_PROT_IPV4) &&
687 (tmp->type == addr->type) && 709 (tmp->type == addr->type) &&
688 (tmp->is_multicast == addr->is_multicast) && 710 (tmp->is_multicast == addr->is_multicast) &&
689 (tmp->u.a4.addr == addr->u.a4.addr) && 711 (tmp->u.a4.addr == addr->u.a4.addr) &&
690 (tmp->u.a4.mask == addr->u.a4.mask) ){ 712 (tmp->u.a4.mask == addr->u.a4.mask)) {
691 found = 1; 713 found = 1;
692 break; 714 break;
693 } 715 }
@@ -697,7 +719,7 @@ __qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add)
697 (tmp->is_multicast == addr->is_multicast) && 719 (tmp->is_multicast == addr->is_multicast) &&
698 (tmp->u.a6.pfxlen == addr->u.a6.pfxlen) && 720 (tmp->u.a6.pfxlen == addr->u.a6.pfxlen) &&
699 (memcmp(&tmp->u.a6.addr, &addr->u.a6.addr, 721 (memcmp(&tmp->u.a6.addr, &addr->u.a6.addr,
700 sizeof(struct in6_addr)) == 0) ){ 722 sizeof(struct in6_addr)) == 0)) {
701 found = 1; 723 found = 1;
702 break; 724 break;
703 } 725 }
@@ -707,7 +729,7 @@ __qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add)
707 tmp->users += addr->users; 729 tmp->users += addr->users;
708 else 730 else
709 tmp->users += add? 1:-1; 731 tmp->users += add? 1:-1;
710 if (tmp->users == 0){ 732 if (tmp->users == 0) {
711 list_del(&tmp->entry); 733 list_del(&tmp->entry);
712 kfree(tmp); 734 kfree(tmp);
713 } 735 }
@@ -738,12 +760,15 @@ qeth_delete_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
738 unsigned long flags; 760 unsigned long flags;
739 int rc = 0; 761 int rc = 0;
740 762
741 QETH_DBF_TEXT(trace,4,"delip"); 763 QETH_DBF_TEXT(trace, 4, "delip");
742 if (addr->proto == QETH_PROT_IPV4) 764
743 QETH_DBF_HEX(trace,4,&addr->u.a4.addr,4); 765 if (card->options.layer2)
766 QETH_DBF_HEX(trace, 4, &addr->mac, 6);
767 else if (addr->proto == QETH_PROT_IPV4)
768 QETH_DBF_HEX(trace, 4, &addr->u.a4.addr, 4);
744 else { 769 else {
745 QETH_DBF_HEX(trace,4,&addr->u.a6.addr,8); 770 QETH_DBF_HEX(trace, 4, &addr->u.a6.addr, 8);
746 QETH_DBF_HEX(trace,4,((char *)&addr->u.a6.addr)+8,8); 771 QETH_DBF_HEX(trace, 4, ((char *)&addr->u.a6.addr) + 8, 8);
747 } 772 }
748 spin_lock_irqsave(&card->ip_lock, flags); 773 spin_lock_irqsave(&card->ip_lock, flags);
749 rc = __qeth_insert_ip_todo(card, addr, 0); 774 rc = __qeth_insert_ip_todo(card, addr, 0);
@@ -757,12 +782,14 @@ qeth_add_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
757 unsigned long flags; 782 unsigned long flags;
758 int rc = 0; 783 int rc = 0;
759 784
760 QETH_DBF_TEXT(trace,4,"addip"); 785 QETH_DBF_TEXT(trace, 4, "addip");
761 if (addr->proto == QETH_PROT_IPV4) 786 if (card->options.layer2)
762 QETH_DBF_HEX(trace,4,&addr->u.a4.addr,4); 787 QETH_DBF_HEX(trace, 4, &addr->mac, 6);
788 else if (addr->proto == QETH_PROT_IPV4)
789 QETH_DBF_HEX(trace, 4, &addr->u.a4.addr, 4);
763 else { 790 else {
764 QETH_DBF_HEX(trace,4,&addr->u.a6.addr,8); 791 QETH_DBF_HEX(trace, 4, &addr->u.a6.addr, 8);
765 QETH_DBF_HEX(trace,4,((char *)&addr->u.a6.addr)+8,8); 792 QETH_DBF_HEX(trace, 4, ((char *)&addr->u.a6.addr) + 8, 8);
766 } 793 }
767 spin_lock_irqsave(&card->ip_lock, flags); 794 spin_lock_irqsave(&card->ip_lock, flags);
768 rc = __qeth_insert_ip_todo(card, addr, 1); 795 rc = __qeth_insert_ip_todo(card, addr, 1);
@@ -775,7 +802,7 @@ __qeth_delete_all_mc(struct qeth_card *card, unsigned long *flags)
775{ 802{
776 struct qeth_ipaddr *addr, *tmp; 803 struct qeth_ipaddr *addr, *tmp;
777 int rc; 804 int rc;
778 805again:
779 list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) { 806 list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) {
780 if (addr->is_multicast) { 807 if (addr->is_multicast) {
781 spin_unlock_irqrestore(&card->ip_lock, *flags); 808 spin_unlock_irqrestore(&card->ip_lock, *flags);
@@ -784,6 +811,7 @@ __qeth_delete_all_mc(struct qeth_card *card, unsigned long *flags)
784 if (!rc) { 811 if (!rc) {
785 list_del(&addr->entry); 812 list_del(&addr->entry);
786 kfree(addr); 813 kfree(addr);
814 goto again;
787 } 815 }
788 } 816 }
789 } 817 }
@@ -851,6 +879,7 @@ qeth_set_ip_addr_list(struct qeth_card *card)
851 879
852static void qeth_delete_mc_addresses(struct qeth_card *); 880static void qeth_delete_mc_addresses(struct qeth_card *);
853static void qeth_add_multicast_ipv4(struct qeth_card *); 881static void qeth_add_multicast_ipv4(struct qeth_card *);
882static void qeth_layer2_add_multicast(struct qeth_card *);
854#ifdef CONFIG_QETH_IPV6 883#ifdef CONFIG_QETH_IPV6
855static void qeth_add_multicast_ipv6(struct qeth_card *); 884static void qeth_add_multicast_ipv6(struct qeth_card *);
856#endif 885#endif
@@ -939,6 +968,24 @@ qeth_register_ip_addresses(void *ptr)
939 return 0; 968 return 0;
940} 969}
941 970
971/*
972 * Drive the SET_PROMISC_MODE thread
973 */
974static int
975qeth_set_promisc_mode(void *ptr)
976{
977 struct qeth_card *card = (struct qeth_card *) ptr;
978
979 daemonize("qeth_setprm");
980 QETH_DBF_TEXT(trace,4,"setprm1");
981 if (!qeth_do_run_thread(card, QETH_SET_PROMISC_MODE_THREAD))
982 return 0;
983 QETH_DBF_TEXT(trace,4,"setprm2");
984 qeth_setadp_promisc_mode(card);
985 qeth_clear_thread_running_bit(card, QETH_SET_PROMISC_MODE_THREAD);
986 return 0;
987}
988
942static int 989static int
943qeth_recover(void *ptr) 990qeth_recover(void *ptr)
944{ 991{
@@ -1005,6 +1052,8 @@ qeth_start_kernel_thread(struct qeth_card *card)
1005 1052
1006 if (qeth_do_start_thread(card, QETH_SET_IP_THREAD)) 1053 if (qeth_do_start_thread(card, QETH_SET_IP_THREAD))
1007 kernel_thread(qeth_register_ip_addresses, (void *)card,SIGCHLD); 1054 kernel_thread(qeth_register_ip_addresses, (void *)card,SIGCHLD);
1055 if (qeth_do_start_thread(card, QETH_SET_PROMISC_MODE_THREAD))
1056 kernel_thread(qeth_set_promisc_mode, (void *)card, SIGCHLD);
1008 if (qeth_do_start_thread(card, QETH_RECOVER_THREAD)) 1057 if (qeth_do_start_thread(card, QETH_RECOVER_THREAD))
1009 kernel_thread(qeth_recover, (void *) card, SIGCHLD); 1058 kernel_thread(qeth_recover, (void *) card, SIGCHLD);
1010} 1059}
@@ -3749,7 +3798,7 @@ qeth_open(struct net_device *dev)
3749 3798
3750 if ( (card->info.type != QETH_CARD_TYPE_OSN) && 3799 if ( (card->info.type != QETH_CARD_TYPE_OSN) &&
3751 (card->options.layer2) && 3800 (card->options.layer2) &&
3752 (!card->info.layer2_mac_registered)) { 3801 (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))) {
3753 QETH_DBF_TEXT(trace,4,"nomacadr"); 3802 QETH_DBF_TEXT(trace,4,"nomacadr");
3754 return -EPERM; 3803 return -EPERM;
3755 } 3804 }
@@ -4311,6 +4360,8 @@ qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
4311out: 4360out:
4312 if (flush_count) 4361 if (flush_count)
4313 qeth_flush_buffers(queue, 0, start_index, flush_count); 4362 qeth_flush_buffers(queue, 0, start_index, flush_count);
4363 else if (!atomic_read(&queue->set_pci_flags_count))
4364 atomic_swap(&queue->state, QETH_OUT_Q_LOCKED_FLUSH);
4314 /* 4365 /*
4315 * queue->state will go from LOCKED -> UNLOCKED or from 4366 * queue->state will go from LOCKED -> UNLOCKED or from
4316 * LOCKED_FLUSH -> LOCKED if output_handler wanted to 'notify' us 4367 * LOCKED_FLUSH -> LOCKED if output_handler wanted to 'notify' us
@@ -4975,6 +5026,10 @@ qeth_default_setassparms_cb(struct qeth_card *, struct qeth_reply *,
4975 unsigned long); 5026 unsigned long);
4976 5027
4977static int 5028static int
5029qeth_default_setadapterparms_cb(struct qeth_card *card,
5030 struct qeth_reply *reply,
5031 unsigned long data);
5032static int
4978qeth_send_setassparms(struct qeth_card *, struct qeth_cmd_buffer *, 5033qeth_send_setassparms(struct qeth_card *, struct qeth_cmd_buffer *,
4979 __u16, long, 5034 __u16, long,
4980 int (*reply_cb) 5035 int (*reply_cb)
@@ -5301,8 +5356,7 @@ qeth_free_vlan_addresses4(struct qeth_card *card, unsigned short vid)
5301 struct qeth_ipaddr *addr; 5356 struct qeth_ipaddr *addr;
5302 5357
5303 QETH_DBF_TEXT(trace, 4, "frvaddr4"); 5358 QETH_DBF_TEXT(trace, 4, "frvaddr4");
5304 if (!card->vlangrp) 5359
5305 return;
5306 rcu_read_lock(); 5360 rcu_read_lock();
5307 in_dev = __in_dev_get_rcu(card->vlangrp->vlan_devices[vid]); 5361 in_dev = __in_dev_get_rcu(card->vlangrp->vlan_devices[vid]);
5308 if (!in_dev) 5362 if (!in_dev)
@@ -5330,8 +5384,7 @@ qeth_free_vlan_addresses6(struct qeth_card *card, unsigned short vid)
5330 struct qeth_ipaddr *addr; 5384 struct qeth_ipaddr *addr;
5331 5385
5332 QETH_DBF_TEXT(trace, 4, "frvaddr6"); 5386 QETH_DBF_TEXT(trace, 4, "frvaddr6");
5333 if (!card->vlangrp) 5387
5334 return;
5335 in6_dev = in6_dev_get(card->vlangrp->vlan_devices[vid]); 5388 in6_dev = in6_dev_get(card->vlangrp->vlan_devices[vid]);
5336 if (!in6_dev) 5389 if (!in6_dev)
5337 return; 5390 return;
@@ -5351,10 +5404,38 @@ qeth_free_vlan_addresses6(struct qeth_card *card, unsigned short vid)
5351} 5404}
5352 5405
5353static void 5406static void
5407qeth_free_vlan_addresses(struct qeth_card *card, unsigned short vid)
5408{
5409 if (card->options.layer2 || !card->vlangrp)
5410 return;
5411 qeth_free_vlan_addresses4(card, vid);
5412 qeth_free_vlan_addresses6(card, vid);
5413}
5414
5415static int
5416qeth_layer2_send_setdelvlan_cb(struct qeth_card *card,
5417 struct qeth_reply *reply,
5418 unsigned long data)
5419{
5420 struct qeth_ipa_cmd *cmd;
5421
5422 QETH_DBF_TEXT(trace, 2, "L2sdvcb");
5423 cmd = (struct qeth_ipa_cmd *) data;
5424 if (cmd->hdr.return_code) {
5425 PRINT_ERR("Error in processing VLAN %i on %s: 0x%x. "
5426 "Continuing\n",cmd->data.setdelvlan.vlan_id,
5427 QETH_CARD_IFNAME(card), cmd->hdr.return_code);
5428 QETH_DBF_TEXT_(trace, 2, "L2VL%4x", cmd->hdr.command);
5429 QETH_DBF_TEXT_(trace, 2, "L2%s", CARD_BUS_ID(card));
5430 QETH_DBF_TEXT_(trace, 2, "err%d", cmd->hdr.return_code);
5431 }
5432 return 0;
5433}
5434
5435static int
5354qeth_layer2_send_setdelvlan(struct qeth_card *card, __u16 i, 5436qeth_layer2_send_setdelvlan(struct qeth_card *card, __u16 i,
5355 enum qeth_ipa_cmds ipacmd) 5437 enum qeth_ipa_cmds ipacmd)
5356{ 5438{
5357 int rc;
5358 struct qeth_ipa_cmd *cmd; 5439 struct qeth_ipa_cmd *cmd;
5359 struct qeth_cmd_buffer *iob; 5440 struct qeth_cmd_buffer *iob;
5360 5441
@@ -5362,15 +5443,8 @@ qeth_layer2_send_setdelvlan(struct qeth_card *card, __u16 i,
5362 iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); 5443 iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
5363 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 5444 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
5364 cmd->data.setdelvlan.vlan_id = i; 5445 cmd->data.setdelvlan.vlan_id = i;
5365 5446 return qeth_send_ipa_cmd(card, iob,
5366 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); 5447 qeth_layer2_send_setdelvlan_cb, NULL);
5367 if (rc) {
5368 PRINT_ERR("Error in processing VLAN %i on %s: 0x%x. "
5369 "Continuing\n",i, QETH_CARD_IFNAME(card), rc);
5370 QETH_DBF_TEXT_(trace, 2, "L2VL%4x", ipacmd);
5371 QETH_DBF_TEXT_(trace, 2, "L2%s", CARD_BUS_ID(card));
5372 QETH_DBF_TEXT_(trace, 2, "err%d", rc);
5373 }
5374} 5448}
5375 5449
5376static void 5450static void
@@ -5420,8 +5494,7 @@ qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
5420 qeth_free_vlan_skbs(card, vid); 5494 qeth_free_vlan_skbs(card, vid);
5421 spin_lock_irqsave(&card->vlanlock, flags); 5495 spin_lock_irqsave(&card->vlanlock, flags);
5422 /* unregister IP addresses of vlan device */ 5496 /* unregister IP addresses of vlan device */
5423 qeth_free_vlan_addresses4(card, vid); 5497 qeth_free_vlan_addresses(card, vid);
5424 qeth_free_vlan_addresses6(card, vid);
5425 if (card->vlangrp) 5498 if (card->vlangrp)
5426 card->vlangrp->vlan_devices[vid] = NULL; 5499 card->vlangrp->vlan_devices[vid] = NULL;
5427 spin_unlock_irqrestore(&card->vlanlock, flags); 5500 spin_unlock_irqrestore(&card->vlanlock, flags);
@@ -5430,6 +5503,59 @@ qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
5430 qeth_set_multicast_list(card->dev); 5503 qeth_set_multicast_list(card->dev);
5431} 5504}
5432#endif 5505#endif
5506/**
5507 * Examine hardware response to SET_PROMISC_MODE
5508 */
5509static int
5510qeth_setadp_promisc_mode_cb(struct qeth_card *card,
5511 struct qeth_reply *reply,
5512 unsigned long data)
5513{
5514 struct qeth_ipa_cmd *cmd;
5515 struct qeth_ipacmd_setadpparms *setparms;
5516
5517 QETH_DBF_TEXT(trace,4,"prmadpcb");
5518
5519 cmd = (struct qeth_ipa_cmd *) data;
5520 setparms = &(cmd->data.setadapterparms);
5521
5522 qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
5523 if (cmd->hdr.return_code) {
5524 QETH_DBF_TEXT_(trace,4,"prmrc%2.2x",cmd->hdr.return_code);
5525 setparms->data.mode = SET_PROMISC_MODE_OFF;
5526 }
5527 card->info.promisc_mode = setparms->data.mode;
5528 return 0;
5529}
5530/*
5531 * Set promiscuous mode (on or off) (SET_PROMISC_MODE command)
5532 */
5533static void
5534qeth_setadp_promisc_mode(struct qeth_card *card)
5535{
5536 enum qeth_ipa_promisc_modes mode;
5537 struct net_device *dev = card->dev;
5538 struct qeth_cmd_buffer *iob;
5539 struct qeth_ipa_cmd *cmd;
5540
5541 QETH_DBF_TEXT(trace, 4, "setprom");
5542
5543 if (((dev->flags & IFF_PROMISC) &&
5544 (card->info.promisc_mode == SET_PROMISC_MODE_ON)) ||
5545 (!(dev->flags & IFF_PROMISC) &&
5546 (card->info.promisc_mode == SET_PROMISC_MODE_OFF)))
5547 return;
5548 mode = SET_PROMISC_MODE_OFF;
5549 if (dev->flags & IFF_PROMISC)
5550 mode = SET_PROMISC_MODE_ON;
5551 QETH_DBF_TEXT_(trace, 4, "mode:%x", mode);
5552
5553 iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE,
5554 sizeof(struct qeth_ipacmd_setadpparms));
5555 cmd = (struct qeth_ipa_cmd *)(iob->data + IPA_PDU_HEADER_SIZE);
5556 cmd->data.setadapterparms.data.mode = mode;
5557 qeth_send_ipa_cmd(card, iob, qeth_setadp_promisc_mode_cb, NULL);
5558}
5433 5559
5434/** 5560/**
5435 * set multicast address on card 5561 * set multicast address on card
@@ -5444,12 +5570,22 @@ qeth_set_multicast_list(struct net_device *dev)
5444 5570
5445 QETH_DBF_TEXT(trace,3,"setmulti"); 5571 QETH_DBF_TEXT(trace,3,"setmulti");
5446 qeth_delete_mc_addresses(card); 5572 qeth_delete_mc_addresses(card);
5573 if (card->options.layer2) {
5574 qeth_layer2_add_multicast(card);
5575 goto out;
5576 }
5447 qeth_add_multicast_ipv4(card); 5577 qeth_add_multicast_ipv4(card);
5448#ifdef CONFIG_QETH_IPV6 5578#ifdef CONFIG_QETH_IPV6
5449 qeth_add_multicast_ipv6(card); 5579 qeth_add_multicast_ipv6(card);
5450#endif 5580#endif
5581out:
5451 if (qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD) == 0) 5582 if (qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD) == 0)
5452 schedule_work(&card->kernel_thread_starter); 5583 schedule_work(&card->kernel_thread_starter);
5584 if (!qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
5585 return;
5586 if (qeth_set_thread_start_bit(card, QETH_SET_PROMISC_MODE_THREAD)==0)
5587 schedule_work(&card->kernel_thread_starter);
5588
5453} 5589}
5454 5590
5455static int 5591static int
@@ -5657,6 +5793,24 @@ qeth_add_multicast_ipv4(struct qeth_card *card)
5657 in_dev_put(in4_dev); 5793 in_dev_put(in4_dev);
5658} 5794}
5659 5795
5796static void
5797qeth_layer2_add_multicast(struct qeth_card *card)
5798{
5799 struct qeth_ipaddr *ipm;
5800 struct dev_mc_list *dm;
5801
5802 QETH_DBF_TEXT(trace,4,"L2addmc");
5803 for (dm = card->dev->mc_list; dm; dm = dm->next) {
5804 ipm = qeth_get_addr_buffer(QETH_PROT_IPV4);
5805 if (!ipm)
5806 continue;
5807 memcpy(ipm->mac,dm->dmi_addr,MAX_ADDR_LEN);
5808 ipm->is_multicast = 1;
5809 if (!qeth_add_ip(card, ipm))
5810 kfree(ipm);
5811 }
5812}
5813
5660#ifdef CONFIG_QETH_IPV6 5814#ifdef CONFIG_QETH_IPV6
5661static inline void 5815static inline void
5662qeth_add_mc6(struct qeth_card *card, struct inet6_dev *in6_dev) 5816qeth_add_mc6(struct qeth_card *card, struct inet6_dev *in6_dev)
@@ -5825,10 +5979,10 @@ qeth_layer2_send_setmac_cb(struct qeth_card *card,
5825 PRINT_WARN("Error in registering MAC address on " \ 5979 PRINT_WARN("Error in registering MAC address on " \
5826 "device %s: x%x\n", CARD_BUS_ID(card), 5980 "device %s: x%x\n", CARD_BUS_ID(card),
5827 cmd->hdr.return_code); 5981 cmd->hdr.return_code);
5828 card->info.layer2_mac_registered = 0; 5982 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
5829 cmd->hdr.return_code = -EIO; 5983 cmd->hdr.return_code = -EIO;
5830 } else { 5984 } else {
5831 card->info.layer2_mac_registered = 1; 5985 card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED;
5832 memcpy(card->dev->dev_addr,cmd->data.setdelmac.mac, 5986 memcpy(card->dev->dev_addr,cmd->data.setdelmac.mac,
5833 OSA_ADDR_LEN); 5987 OSA_ADDR_LEN);
5834 PRINT_INFO("MAC address %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x " 5988 PRINT_INFO("MAC address %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x "
@@ -5866,7 +6020,7 @@ qeth_layer2_send_delmac_cb(struct qeth_card *card,
5866 cmd->hdr.return_code = -EIO; 6020 cmd->hdr.return_code = -EIO;
5867 return 0; 6021 return 0;
5868 } 6022 }
5869 card->info.layer2_mac_registered = 0; 6023 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
5870 6024
5871 return 0; 6025 return 0;
5872} 6026}
@@ -5874,7 +6028,7 @@ static int
5874qeth_layer2_send_delmac(struct qeth_card *card, __u8 *mac) 6028qeth_layer2_send_delmac(struct qeth_card *card, __u8 *mac)
5875{ 6029{
5876 QETH_DBF_TEXT(trace, 2, "L2Delmac"); 6030 QETH_DBF_TEXT(trace, 2, "L2Delmac");
5877 if (!card->info.layer2_mac_registered) 6031 if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))
5878 return 0; 6032 return 0;
5879 return qeth_layer2_send_setdelmac(card, mac, IPA_CMD_DELVMAC, 6033 return qeth_layer2_send_setdelmac(card, mac, IPA_CMD_DELVMAC,
5880 qeth_layer2_send_delmac_cb); 6034 qeth_layer2_send_delmac_cb);
@@ -5896,7 +6050,7 @@ qeth_layer2_set_mac_address(struct net_device *dev, void *p)
5896 card = (struct qeth_card *) dev->priv; 6050 card = (struct qeth_card *) dev->priv;
5897 6051
5898 if (!card->options.layer2) { 6052 if (!card->options.layer2) {
5899 PRINT_WARN("Setting MAC address on %s is not supported" 6053 PRINT_WARN("Setting MAC address on %s is not supported "
5900 "in Layer 3 mode.\n", dev->name); 6054 "in Layer 3 mode.\n", dev->name);
5901 QETH_DBF_TEXT(trace, 3, "setmcLY3"); 6055 QETH_DBF_TEXT(trace, 3, "setmcLY3");
5902 return -EOPNOTSUPP; 6056 return -EOPNOTSUPP;
@@ -6441,6 +6595,8 @@ qeth_default_setadapterparms_cb(struct qeth_card *card,
6441 return 0; 6595 return 0;
6442} 6596}
6443 6597
6598
6599
6444static int 6600static int
6445qeth_query_setadapterparms_cb(struct qeth_card *card, struct qeth_reply *reply, 6601qeth_query_setadapterparms_cb(struct qeth_card *card, struct qeth_reply *reply,
6446 unsigned long data) 6602 unsigned long data)
@@ -6481,8 +6637,13 @@ qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
6481 QETH_DBF_TEXT(trace,4,"chgmaccb"); 6637 QETH_DBF_TEXT(trace,4,"chgmaccb");
6482 6638
6483 cmd = (struct qeth_ipa_cmd *) data; 6639 cmd = (struct qeth_ipa_cmd *) data;
6484 memcpy(card->dev->dev_addr, 6640 if (!card->options.layer2 || card->info.guestlan ||
6485 &cmd->data.setadapterparms.data.change_addr.addr,OSA_ADDR_LEN); 6641 !(card->info.mac_bits & QETH_LAYER2_MAC_READ)) {
6642 memcpy(card->dev->dev_addr,
6643 &cmd->data.setadapterparms.data.change_addr.addr,
6644 OSA_ADDR_LEN);
6645 card->info.mac_bits |= QETH_LAYER2_MAC_READ;
6646 }
6486 qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd); 6647 qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
6487 return 0; 6648 return 0;
6488} 6649}
@@ -6602,6 +6763,12 @@ qeth_layer2_initialize(struct qeth_card *card)
6602 QETH_DBF_TEXT(setup, 2, "doL2init"); 6763 QETH_DBF_TEXT(setup, 2, "doL2init");
6603 QETH_DBF_TEXT_(setup, 2, "doL2%s", CARD_BUS_ID(card)); 6764 QETH_DBF_TEXT_(setup, 2, "doL2%s", CARD_BUS_ID(card));
6604 6765
6766 rc = qeth_query_setadapterparms(card);
6767 if (rc) {
6768 PRINT_WARN("could not query adapter parameters on device %s: "
6769 "x%x\n", CARD_BUS_ID(card), rc);
6770 }
6771
6605 rc = qeth_setadpparms_change_macaddr(card); 6772 rc = qeth_setadpparms_change_macaddr(card);
6606 if (rc) { 6773 if (rc) {
6607 PRINT_WARN("couldn't get MAC address on " 6774 PRINT_WARN("couldn't get MAC address on "
@@ -8548,7 +8715,7 @@ EXPORT_SYMBOL(qeth_osn_deregister);
8548EXPORT_SYMBOL(qeth_osn_assist); 8715EXPORT_SYMBOL(qeth_osn_assist);
8549module_init(qeth_init); 8716module_init(qeth_init);
8550module_exit(qeth_exit); 8717module_exit(qeth_exit);
8551MODULE_AUTHOR("Frank Pavlic <pavlic@de.ibm.com>"); 8718MODULE_AUTHOR("Frank Pavlic <fpavlic@de.ibm.com>");
8552MODULE_DESCRIPTION("Linux on zSeries OSA Express and HiperSockets support\n" \ 8719MODULE_DESCRIPTION("Linux on zSeries OSA Express and HiperSockets support\n" \
8553 "Copyright 2000,2003 IBM Corporation\n"); 8720 "Copyright 2000,2003 IBM Corporation\n");
8554 8721