• Home
  • Raw
  • Download

Lines Matching full:card

79 static struct qeth_ipaddr *qeth_l3_find_addr_by_ip(struct qeth_card *card,  in qeth_l3_find_addr_by_ip()  argument
86 hash_for_each_possible(card->ip_mc_htable, addr, hnode, key) in qeth_l3_find_addr_by_ip()
90 hash_for_each_possible(card->ip_htable, addr, hnode, key) in qeth_l3_find_addr_by_ip()
111 static bool qeth_l3_is_addr_covered_by_ipato(struct qeth_card *card, in qeth_l3_is_addr_covered_by_ipato() argument
119 if (!card->ipato.enabled) in qeth_l3_is_addr_covered_by_ipato()
126 list_for_each_entry(ipatoe, &card->ipato.entries, entry) { in qeth_l3_is_addr_covered_by_ipato()
142 if ((addr->proto == QETH_PROT_IPV4) && card->ipato.invert4) in qeth_l3_is_addr_covered_by_ipato()
144 else if ((addr->proto == QETH_PROT_IPV6) && card->ipato.invert6) in qeth_l3_is_addr_covered_by_ipato()
150 static int qeth_l3_delete_ip(struct qeth_card *card, in qeth_l3_delete_ip() argument
157 QETH_CARD_TEXT(card, 2, "delrxip"); in qeth_l3_delete_ip()
159 QETH_CARD_TEXT(card, 2, "delvipa"); in qeth_l3_delete_ip()
161 QETH_CARD_TEXT(card, 2, "delip"); in qeth_l3_delete_ip()
164 QETH_CARD_HEX(card, 4, &tmp_addr->u.a4.addr, 4); in qeth_l3_delete_ip()
166 QETH_CARD_HEX(card, 4, &tmp_addr->u.a6.addr, 8); in qeth_l3_delete_ip()
167 QETH_CARD_HEX(card, 4, ((char *)&tmp_addr->u.a6.addr) + 8, 8); in qeth_l3_delete_ip()
170 addr = qeth_l3_find_addr_by_ip(card, tmp_addr); in qeth_l3_delete_ip()
180 if (qeth_card_hw_is_reachable(card)) in qeth_l3_delete_ip()
181 rc = qeth_l3_deregister_addr_entry(card, addr); in qeth_l3_delete_ip()
189 static int qeth_l3_add_ip(struct qeth_card *card, struct qeth_ipaddr *tmp_addr) in qeth_l3_add_ip() argument
196 QETH_CARD_TEXT(card, 2, "addrxip"); in qeth_l3_add_ip()
198 QETH_CARD_TEXT(card, 2, "addvipa"); in qeth_l3_add_ip()
200 QETH_CARD_TEXT(card, 2, "addip"); in qeth_l3_add_ip()
203 QETH_CARD_HEX(card, 4, &tmp_addr->u.a4.addr, 4); in qeth_l3_add_ip()
205 QETH_CARD_HEX(card, 4, &tmp_addr->u.a6.addr, 8); in qeth_l3_add_ip()
206 QETH_CARD_HEX(card, 4, ((char *)&tmp_addr->u.a6.addr) + 8, 8); in qeth_l3_add_ip()
209 addr = qeth_l3_find_addr_by_ip(card, tmp_addr); in qeth_l3_add_ip()
219 dev_warn(&card->gdev->dev, in qeth_l3_add_ip()
230 if (qeth_l3_is_addr_covered_by_ipato(card, addr)) { in qeth_l3_add_ip()
231 QETH_CARD_TEXT(card, 2, "tkovaddr"); in qeth_l3_add_ip()
234 hash_add(card->ip_htable, &addr->hnode, in qeth_l3_add_ip()
237 if (!qeth_card_hw_is_reachable(card)) { in qeth_l3_add_ip()
251 spin_unlock_bh(&card->ip_lock); in qeth_l3_add_ip()
252 rc = qeth_l3_register_addr_entry(card, addr); in qeth_l3_add_ip()
253 spin_lock_bh(&card->ip_lock); in qeth_l3_add_ip()
256 rc = qeth_l3_register_addr_entry(card, addr); in qeth_l3_add_ip()
262 qeth_l3_deregister_addr_entry(card, addr); in qeth_l3_add_ip()
274 static void qeth_l3_clear_ip_htable(struct qeth_card *card, int recover) in qeth_l3_clear_ip_htable() argument
280 QETH_CARD_TEXT(card, 4, "clearip"); in qeth_l3_clear_ip_htable()
282 spin_lock_bh(&card->ip_lock); in qeth_l3_clear_ip_htable()
284 hash_for_each_safe(card->ip_htable, i, tmp, addr, hnode) { in qeth_l3_clear_ip_htable()
293 spin_unlock_bh(&card->ip_lock); in qeth_l3_clear_ip_htable()
295 spin_lock_bh(&card->mclock); in qeth_l3_clear_ip_htable()
297 hash_for_each_safe(card->ip_mc_htable, i, tmp, addr, hnode) { in qeth_l3_clear_ip_htable()
302 spin_unlock_bh(&card->mclock); in qeth_l3_clear_ip_htable()
306 static void qeth_l3_recover_ip(struct qeth_card *card) in qeth_l3_recover_ip() argument
313 QETH_CARD_TEXT(card, 4, "recovrip"); in qeth_l3_recover_ip()
315 spin_lock_bh(&card->ip_lock); in qeth_l3_recover_ip()
317 hash_for_each_safe(card->ip_htable, i, tmp, addr, hnode) { in qeth_l3_recover_ip()
321 spin_unlock_bh(&card->ip_lock); in qeth_l3_recover_ip()
322 rc = qeth_l3_register_addr_entry(card, addr); in qeth_l3_recover_ip()
323 spin_lock_bh(&card->ip_lock); in qeth_l3_recover_ip()
326 rc = qeth_l3_register_addr_entry(card, addr); in qeth_l3_recover_ip()
331 qeth_l3_delete_ip(card, addr); in qeth_l3_recover_ip()
339 spin_unlock_bh(&card->ip_lock); in qeth_l3_recover_ip()
343 static int qeth_l3_send_setdelmc(struct qeth_card *card, in qeth_l3_send_setdelmc() argument
350 QETH_CARD_TEXT(card, 4, "setdelmc"); in qeth_l3_send_setdelmc()
352 iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto); in qeth_l3_send_setdelmc()
363 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); in qeth_l3_send_setdelmc()
395 static int qeth_l3_send_setdelip(struct qeth_card *card, in qeth_l3_send_setdelip() argument
404 QETH_CARD_TEXT(card, 4, "setdelip"); in qeth_l3_send_setdelip()
406 iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto); in qeth_l3_send_setdelip()
412 QETH_CARD_TEXT_(card, 4, "flags%02X", flags); in qeth_l3_send_setdelip()
427 return qeth_send_ipa_cmd(card, iob, NULL, NULL); in qeth_l3_send_setdelip()
430 static int qeth_l3_send_setrouting(struct qeth_card *card, in qeth_l3_send_setrouting() argument
437 QETH_CARD_TEXT(card, 4, "setroutg"); in qeth_l3_send_setrouting()
438 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETRTG, prot); in qeth_l3_send_setrouting()
443 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); in qeth_l3_send_setrouting()
448 static int qeth_l3_correct_routing_type(struct qeth_card *card, in qeth_l3_correct_routing_type() argument
451 if (card->info.type == QETH_CARD_TYPE_IQD) { in qeth_l3_correct_routing_type()
468 if (qeth_is_ipafunc_supported(card, prot, in qeth_l3_correct_routing_type()
480 int qeth_l3_setrouting_v4(struct qeth_card *card) in qeth_l3_setrouting_v4() argument
484 QETH_CARD_TEXT(card, 3, "setrtg4"); in qeth_l3_setrouting_v4()
486 rc = qeth_l3_correct_routing_type(card, &card->options.route4.type, in qeth_l3_setrouting_v4()
491 rc = qeth_l3_send_setrouting(card, card->options.route4.type, in qeth_l3_setrouting_v4()
494 card->options.route4.type = NO_ROUTER; in qeth_l3_setrouting_v4()
497 QETH_CARD_IFNAME(card)); in qeth_l3_setrouting_v4()
502 int qeth_l3_setrouting_v6(struct qeth_card *card) in qeth_l3_setrouting_v6() argument
506 QETH_CARD_TEXT(card, 3, "setrtg6"); in qeth_l3_setrouting_v6()
508 if (!qeth_is_supported(card, IPA_IPV6)) in qeth_l3_setrouting_v6()
510 rc = qeth_l3_correct_routing_type(card, &card->options.route6.type, in qeth_l3_setrouting_v6()
515 rc = qeth_l3_send_setrouting(card, card->options.route6.type, in qeth_l3_setrouting_v6()
518 card->options.route6.type = NO_ROUTER; in qeth_l3_setrouting_v6()
521 QETH_CARD_IFNAME(card)); in qeth_l3_setrouting_v6()
535 void qeth_l3_update_ipato(struct qeth_card *card) in qeth_l3_update_ipato() argument
540 hash_for_each(card->ip_htable, i, addr, hnode) { in qeth_l3_update_ipato()
543 addr->ipato = qeth_l3_is_addr_covered_by_ipato(card, addr); in qeth_l3_update_ipato()
547 static void qeth_l3_clear_ipato_list(struct qeth_card *card) in qeth_l3_clear_ipato_list() argument
551 spin_lock_bh(&card->ip_lock); in qeth_l3_clear_ipato_list()
553 list_for_each_entry_safe(ipatoe, tmp, &card->ipato.entries, entry) { in qeth_l3_clear_ipato_list()
558 qeth_l3_update_ipato(card); in qeth_l3_clear_ipato_list()
559 spin_unlock_bh(&card->ip_lock); in qeth_l3_clear_ipato_list()
562 int qeth_l3_add_ipato_entry(struct qeth_card *card, in qeth_l3_add_ipato_entry() argument
568 QETH_CARD_TEXT(card, 2, "addipato"); in qeth_l3_add_ipato_entry()
570 spin_lock_bh(&card->ip_lock); in qeth_l3_add_ipato_entry()
572 list_for_each_entry(ipatoe, &card->ipato.entries, entry) { in qeth_l3_add_ipato_entry()
584 list_add_tail(&new->entry, &card->ipato.entries); in qeth_l3_add_ipato_entry()
585 qeth_l3_update_ipato(card); in qeth_l3_add_ipato_entry()
588 spin_unlock_bh(&card->ip_lock); in qeth_l3_add_ipato_entry()
593 int qeth_l3_del_ipato_entry(struct qeth_card *card, in qeth_l3_del_ipato_entry() argument
600 QETH_CARD_TEXT(card, 2, "delipato"); in qeth_l3_del_ipato_entry()
602 spin_lock_bh(&card->ip_lock); in qeth_l3_del_ipato_entry()
604 list_for_each_entry_safe(ipatoe, tmp, &card->ipato.entries, entry) { in qeth_l3_del_ipato_entry()
611 qeth_l3_update_ipato(card); in qeth_l3_del_ipato_entry()
617 spin_unlock_bh(&card->ip_lock); in qeth_l3_del_ipato_entry()
621 int qeth_l3_modify_rxip_vipa(struct qeth_card *card, bool add, const u8 *ip, in qeth_l3_modify_rxip_vipa() argument
634 spin_lock_bh(&card->ip_lock); in qeth_l3_modify_rxip_vipa()
635 rc = add ? qeth_l3_add_ip(card, &addr) : qeth_l3_delete_ip(card, &addr); in qeth_l3_modify_rxip_vipa()
636 spin_unlock_bh(&card->ip_lock); in qeth_l3_modify_rxip_vipa()
640 int qeth_l3_modify_hsuid(struct qeth_card *card, bool add) in qeth_l3_modify_hsuid() argument
649 addr.u.a6.addr.s6_addr[8+i] = card->options.hsuid[i]; in qeth_l3_modify_hsuid()
651 spin_lock_bh(&card->ip_lock); in qeth_l3_modify_hsuid()
652 rc = add ? qeth_l3_add_ip(card, &addr) : qeth_l3_delete_ip(card, &addr); in qeth_l3_modify_hsuid()
653 spin_unlock_bh(&card->ip_lock); in qeth_l3_modify_hsuid()
657 static int qeth_l3_register_addr_entry(struct qeth_card *card, in qeth_l3_register_addr_entry() argument
664 if (card->options.sniffer) in qeth_l3_register_addr_entry()
668 QETH_CARD_TEXT(card, 2, "setaddr4"); in qeth_l3_register_addr_entry()
669 QETH_CARD_HEX(card, 3, &addr->u.a4.addr, sizeof(int)); in qeth_l3_register_addr_entry()
671 QETH_CARD_TEXT(card, 2, "setaddr6"); in qeth_l3_register_addr_entry()
672 QETH_CARD_HEX(card, 3, &addr->u.a6.addr, 8); in qeth_l3_register_addr_entry()
673 QETH_CARD_HEX(card, 3, ((char *)&addr->u.a6.addr) + 8, 8); in qeth_l3_register_addr_entry()
675 QETH_CARD_TEXT(card, 2, "setaddr?"); in qeth_l3_register_addr_entry()
676 QETH_CARD_HEX(card, 3, addr, sizeof(struct qeth_ipaddr)); in qeth_l3_register_addr_entry()
680 rc = qeth_l3_send_setdelmc(card, addr, IPA_CMD_SETIPM); in qeth_l3_register_addr_entry()
682 rc = qeth_l3_send_setdelip(card, addr, IPA_CMD_SETIP); in qeth_l3_register_addr_entry()
684 QETH_CARD_TEXT(card, 2, "failed"); in qeth_l3_register_addr_entry()
687 QETH_CARD_TEXT(card, 2, "FAILED"); in qeth_l3_register_addr_entry()
689 dev_warn(&card->gdev->dev, in qeth_l3_register_addr_entry()
695 static int qeth_l3_deregister_addr_entry(struct qeth_card *card, in qeth_l3_deregister_addr_entry() argument
700 if (card->options.sniffer) in qeth_l3_deregister_addr_entry()
704 QETH_CARD_TEXT(card, 2, "deladdr4"); in qeth_l3_deregister_addr_entry()
705 QETH_CARD_HEX(card, 3, &addr->u.a4.addr, sizeof(int)); in qeth_l3_deregister_addr_entry()
707 QETH_CARD_TEXT(card, 2, "deladdr6"); in qeth_l3_deregister_addr_entry()
708 QETH_CARD_HEX(card, 3, &addr->u.a6.addr, 8); in qeth_l3_deregister_addr_entry()
709 QETH_CARD_HEX(card, 3, ((char *)&addr->u.a6.addr) + 8, 8); in qeth_l3_deregister_addr_entry()
711 QETH_CARD_TEXT(card, 2, "deladdr?"); in qeth_l3_deregister_addr_entry()
712 QETH_CARD_HEX(card, 3, addr, sizeof(struct qeth_ipaddr)); in qeth_l3_deregister_addr_entry()
715 rc = qeth_l3_send_setdelmc(card, addr, IPA_CMD_DELIPM); in qeth_l3_deregister_addr_entry()
717 rc = qeth_l3_send_setdelip(card, addr, IPA_CMD_DELIP); in qeth_l3_deregister_addr_entry()
719 QETH_CARD_TEXT(card, 2, "failed"); in qeth_l3_deregister_addr_entry()
724 static int qeth_l3_setadapter_parms(struct qeth_card *card) in qeth_l3_setadapter_parms() argument
730 if (qeth_adp_supported(card, IPA_SETADP_ALTER_MAC_ADDRESS)) { in qeth_l3_setadapter_parms()
731 rc = qeth_setadpparms_change_macaddr(card); in qeth_l3_setadapter_parms()
733 dev_warn(&card->gdev->dev, "Reading the adapter MAC" in qeth_l3_setadapter_parms()
740 static int qeth_l3_start_ipa_arp_processing(struct qeth_card *card) in qeth_l3_start_ipa_arp_processing() argument
744 QETH_CARD_TEXT(card, 3, "ipaarp"); in qeth_l3_start_ipa_arp_processing()
746 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { in qeth_l3_start_ipa_arp_processing()
747 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_arp_processing()
749 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_arp_processing()
752 rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING, in qeth_l3_start_ipa_arp_processing()
755 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_arp_processing()
757 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_arp_processing()
762 static int qeth_l3_start_ipa_source_mac(struct qeth_card *card) in qeth_l3_start_ipa_source_mac() argument
766 QETH_CARD_TEXT(card, 3, "stsrcmac"); in qeth_l3_start_ipa_source_mac()
768 if (!qeth_is_supported(card, IPA_SOURCE_MAC)) { in qeth_l3_start_ipa_source_mac()
769 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_source_mac()
771 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_source_mac()
775 rc = qeth_send_simple_setassparms(card, IPA_SOURCE_MAC, in qeth_l3_start_ipa_source_mac()
778 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_source_mac()
780 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_source_mac()
784 static int qeth_l3_start_ipa_vlan(struct qeth_card *card) in qeth_l3_start_ipa_vlan() argument
788 QETH_CARD_TEXT(card, 3, "strtvlan"); in qeth_l3_start_ipa_vlan()
790 if (!qeth_is_supported(card, IPA_FULL_VLAN)) { in qeth_l3_start_ipa_vlan()
791 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_vlan()
792 "VLAN not supported on %s\n", QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_vlan()
796 rc = qeth_send_simple_setassparms(card, IPA_VLAN_PRIO, in qeth_l3_start_ipa_vlan()
799 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_vlan()
801 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_vlan()
803 dev_info(&card->gdev->dev, "VLAN enabled\n"); in qeth_l3_start_ipa_vlan()
808 static int qeth_l3_start_ipa_multicast(struct qeth_card *card) in qeth_l3_start_ipa_multicast() argument
812 QETH_CARD_TEXT(card, 3, "stmcast"); in qeth_l3_start_ipa_multicast()
814 if (!qeth_is_supported(card, IPA_MULTICASTING)) { in qeth_l3_start_ipa_multicast()
815 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_multicast()
817 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_multicast()
821 rc = qeth_send_simple_setassparms(card, IPA_MULTICASTING, in qeth_l3_start_ipa_multicast()
824 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_multicast()
826 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_multicast()
828 dev_info(&card->gdev->dev, "Multicast enabled\n"); in qeth_l3_start_ipa_multicast()
829 card->dev->flags |= IFF_MULTICAST; in qeth_l3_start_ipa_multicast()
834 static int qeth_l3_softsetup_ipv6(struct qeth_card *card) in qeth_l3_softsetup_ipv6() argument
838 QETH_CARD_TEXT(card, 3, "softipv6"); in qeth_l3_softsetup_ipv6()
840 if (card->info.type == QETH_CARD_TYPE_IQD) in qeth_l3_softsetup_ipv6()
843 rc = qeth_send_simple_setassparms(card, IPA_IPV6, in qeth_l3_softsetup_ipv6()
846 dev_err(&card->gdev->dev, in qeth_l3_softsetup_ipv6()
848 QETH_CARD_IFNAME(card)); in qeth_l3_softsetup_ipv6()
851 rc = qeth_send_simple_setassparms_v6(card, IPA_IPV6, in qeth_l3_softsetup_ipv6()
854 dev_err(&card->gdev->dev, in qeth_l3_softsetup_ipv6()
856 QETH_CARD_IFNAME(card)); in qeth_l3_softsetup_ipv6()
859 rc = qeth_send_simple_setassparms_v6(card, IPA_PASSTHRU, in qeth_l3_softsetup_ipv6()
862 dev_warn(&card->gdev->dev, in qeth_l3_softsetup_ipv6()
864 QETH_CARD_IFNAME(card)); in qeth_l3_softsetup_ipv6()
868 dev_info(&card->gdev->dev, "IPV6 enabled\n"); in qeth_l3_softsetup_ipv6()
872 static int qeth_l3_start_ipa_ipv6(struct qeth_card *card) in qeth_l3_start_ipa_ipv6() argument
874 QETH_CARD_TEXT(card, 3, "strtipv6"); in qeth_l3_start_ipa_ipv6()
876 if (!qeth_is_supported(card, IPA_IPV6)) { in qeth_l3_start_ipa_ipv6()
877 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_ipv6()
878 "IPv6 not supported on %s\n", QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_ipv6()
881 return qeth_l3_softsetup_ipv6(card); in qeth_l3_start_ipa_ipv6()
884 static int qeth_l3_start_ipa_broadcast(struct qeth_card *card) in qeth_l3_start_ipa_broadcast() argument
888 QETH_CARD_TEXT(card, 3, "stbrdcst"); in qeth_l3_start_ipa_broadcast()
889 card->info.broadcast_capable = 0; in qeth_l3_start_ipa_broadcast()
890 if (!qeth_is_supported(card, IPA_FILTERING)) { in qeth_l3_start_ipa_broadcast()
891 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_broadcast()
893 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_broadcast()
897 rc = qeth_send_simple_setassparms(card, IPA_FILTERING, in qeth_l3_start_ipa_broadcast()
900 dev_warn(&card->gdev->dev, "Enabling broadcast filtering for " in qeth_l3_start_ipa_broadcast()
901 "%s failed\n", QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_broadcast()
905 rc = qeth_send_simple_setassparms(card, IPA_FILTERING, in qeth_l3_start_ipa_broadcast()
908 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_broadcast()
910 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_broadcast()
913 card->info.broadcast_capable = QETH_BROADCAST_WITH_ECHO; in qeth_l3_start_ipa_broadcast()
914 dev_info(&card->gdev->dev, "Broadcast enabled\n"); in qeth_l3_start_ipa_broadcast()
915 rc = qeth_send_simple_setassparms(card, IPA_FILTERING, in qeth_l3_start_ipa_broadcast()
918 dev_warn(&card->gdev->dev, "Setting up broadcast echo " in qeth_l3_start_ipa_broadcast()
919 "filtering for %s failed\n", QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_broadcast()
922 card->info.broadcast_capable = QETH_BROADCAST_WITHOUT_ECHO; in qeth_l3_start_ipa_broadcast()
924 if (card->info.broadcast_capable) in qeth_l3_start_ipa_broadcast()
925 card->dev->flags |= IFF_BROADCAST; in qeth_l3_start_ipa_broadcast()
927 card->dev->flags &= ~IFF_BROADCAST; in qeth_l3_start_ipa_broadcast()
931 static int qeth_l3_start_ipassists(struct qeth_card *card) in qeth_l3_start_ipassists() argument
933 QETH_CARD_TEXT(card, 3, "strtipas"); in qeth_l3_start_ipassists()
935 if (qeth_set_access_ctrl_online(card, 0)) in qeth_l3_start_ipassists()
937 qeth_l3_start_ipa_arp_processing(card); /* go on*/ in qeth_l3_start_ipassists()
938 qeth_l3_start_ipa_source_mac(card); /* go on*/ in qeth_l3_start_ipassists()
939 qeth_l3_start_ipa_vlan(card); /* go on*/ in qeth_l3_start_ipassists()
940 qeth_l3_start_ipa_multicast(card); /* go on*/ in qeth_l3_start_ipassists()
941 qeth_l3_start_ipa_ipv6(card); /* go on*/ in qeth_l3_start_ipassists()
942 qeth_l3_start_ipa_broadcast(card); /* go on*/ in qeth_l3_start_ipassists()
946 static int qeth_l3_iqd_read_initial_mac_cb(struct qeth_card *card, in qeth_l3_iqd_read_initial_mac_cb() argument
953 ether_addr_copy(card->dev->dev_addr, in qeth_l3_iqd_read_initial_mac_cb()
956 eth_random_addr(card->dev->dev_addr); in qeth_l3_iqd_read_initial_mac_cb()
961 static int qeth_l3_iqd_read_initial_mac(struct qeth_card *card) in qeth_l3_iqd_read_initial_mac() argument
969 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, in qeth_l3_iqd_read_initial_mac()
975 card->info.unique_id; in qeth_l3_iqd_read_initial_mac()
977 rc = qeth_send_ipa_cmd(card, iob, qeth_l3_iqd_read_initial_mac_cb, in qeth_l3_iqd_read_initial_mac()
982 static int qeth_l3_get_unique_id_cb(struct qeth_card *card, in qeth_l3_get_unique_id_cb() argument
989 card->info.unique_id = *((__u16 *) in qeth_l3_get_unique_id_cb()
992 card->info.unique_id = UNIQUE_ID_IF_CREATE_ADDR_FAILED | in qeth_l3_get_unique_id_cb()
994 dev_warn(&card->gdev->dev, "The network adapter failed to " in qeth_l3_get_unique_id_cb()
1000 static int qeth_l3_get_unique_id(struct qeth_card *card) in qeth_l3_get_unique_id() argument
1008 if (!qeth_is_supported(card, IPA_IPV6)) { in qeth_l3_get_unique_id()
1009 card->info.unique_id = UNIQUE_ID_IF_CREATE_ADDR_FAILED | in qeth_l3_get_unique_id()
1014 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, in qeth_l3_get_unique_id()
1020 card->info.unique_id; in qeth_l3_get_unique_id()
1022 rc = qeth_send_ipa_cmd(card, iob, qeth_l3_get_unique_id_cb, NULL); in qeth_l3_get_unique_id()
1027 qeth_diags_trace_cb(struct qeth_card *card, struct qeth_reply *reply, in qeth_diags_trace_cb() argument
1038 QETH_CARD_TEXT_(card, 2, "dxter%x", rc); in qeth_diags_trace_cb()
1046 card->info.promisc_mode = SET_PROMISC_MODE_OFF; in qeth_diags_trace_cb()
1047 dev_info(&card->gdev->dev, "The HiperSockets network " in qeth_diags_trace_cb()
1057 card->info.promisc_mode = SET_PROMISC_MODE_ON; in qeth_diags_trace_cb()
1058 dev_info(&card->gdev->dev, "The HiperSockets network " in qeth_diags_trace_cb()
1062 dev_warn(&card->gdev->dev, "The device is not " in qeth_diags_trace_cb()
1067 dev_warn(&card->gdev->dev, "A HiperSockets " in qeth_diags_trace_cb()
1077 cmd->data.diagass.action, QETH_CARD_IFNAME(card)); in qeth_diags_trace_cb()
1084 qeth_diags_trace(struct qeth_card *card, enum qeth_diags_trace_cmds diags_cmd) in qeth_diags_trace() argument
1091 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0); in qeth_diags_trace()
1099 return qeth_send_ipa_cmd(card, iob, qeth_diags_trace_cb, NULL); in qeth_diags_trace()
1103 qeth_l3_add_mc_to_hash(struct qeth_card *card, struct in_device *in4_dev) in qeth_l3_add_mc_to_hash() argument
1108 QETH_CARD_TEXT(card, 4, "addmc"); in qeth_l3_add_mc_to_hash()
1120 ipm = qeth_l3_find_addr_by_ip(card, tmp); in qeth_l3_add_mc_to_hash()
1132 hash_add(card->ip_mc_htable, in qeth_l3_add_mc_to_hash()
1141 static void qeth_l3_add_vlan_mc(struct qeth_card *card) in qeth_l3_add_vlan_mc() argument
1146 QETH_CARD_TEXT(card, 4, "addmcvl"); in qeth_l3_add_vlan_mc()
1148 if (!qeth_is_supported(card, IPA_FULL_VLAN)) in qeth_l3_add_vlan_mc()
1151 for_each_set_bit(vid, card->active_vlans, VLAN_N_VID) { in qeth_l3_add_vlan_mc()
1154 netdev = __vlan_find_dev_deep_rcu(card->dev, htons(ETH_P_8021Q), in qeth_l3_add_vlan_mc()
1162 qeth_l3_add_mc_to_hash(card, in_dev); in qeth_l3_add_vlan_mc()
1166 static void qeth_l3_add_multicast_ipv4(struct qeth_card *card) in qeth_l3_add_multicast_ipv4() argument
1170 QETH_CARD_TEXT(card, 4, "chkmcv4"); in qeth_l3_add_multicast_ipv4()
1173 in4_dev = __in_dev_get_rcu(card->dev); in qeth_l3_add_multicast_ipv4()
1176 qeth_l3_add_mc_to_hash(card, in4_dev); in qeth_l3_add_multicast_ipv4()
1177 qeth_l3_add_vlan_mc(card); in qeth_l3_add_multicast_ipv4()
1182 static void qeth_l3_add_mc6_to_hash(struct qeth_card *card, in qeth_l3_add_mc6_to_hash() argument
1189 QETH_CARD_TEXT(card, 4, "addmc6"); in qeth_l3_add_mc6_to_hash()
1201 ipm = qeth_l3_find_addr_by_ip(card, tmp); in qeth_l3_add_mc6_to_hash()
1217 hash_add(card->ip_mc_htable, in qeth_l3_add_mc6_to_hash()
1225 static void qeth_l3_add_vlan_mc6(struct qeth_card *card) in qeth_l3_add_vlan_mc6() argument
1230 QETH_CARD_TEXT(card, 4, "admc6vl"); in qeth_l3_add_vlan_mc6()
1232 if (!qeth_is_supported(card, IPA_FULL_VLAN)) in qeth_l3_add_vlan_mc6()
1235 for_each_set_bit(vid, card->active_vlans, VLAN_N_VID) { in qeth_l3_add_vlan_mc6()
1238 netdev = __vlan_find_dev_deep_rcu(card->dev, htons(ETH_P_8021Q), in qeth_l3_add_vlan_mc6()
1247 qeth_l3_add_mc6_to_hash(card, in_dev); in qeth_l3_add_vlan_mc6()
1253 static void qeth_l3_add_multicast_ipv6(struct qeth_card *card) in qeth_l3_add_multicast_ipv6() argument
1257 QETH_CARD_TEXT(card, 4, "chkmcv6"); in qeth_l3_add_multicast_ipv6()
1259 if (!qeth_is_supported(card, IPA_IPV6)) in qeth_l3_add_multicast_ipv6()
1261 in6_dev = in6_dev_get(card->dev); in qeth_l3_add_multicast_ipv6()
1267 qeth_l3_add_mc6_to_hash(card, in6_dev); in qeth_l3_add_multicast_ipv6()
1268 qeth_l3_add_vlan_mc6(card); in qeth_l3_add_multicast_ipv6()
1277 struct qeth_card *card = dev->ml_priv; in qeth_l3_vlan_rx_add_vid() local
1279 set_bit(vid, card->active_vlans); in qeth_l3_vlan_rx_add_vid()
1286 struct qeth_card *card = dev->ml_priv; in qeth_l3_vlan_rx_kill_vid() local
1288 QETH_CARD_TEXT_(card, 4, "kid:%d", vid); in qeth_l3_vlan_rx_kill_vid()
1290 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { in qeth_l3_vlan_rx_kill_vid()
1291 QETH_CARD_TEXT(card, 3, "kidREC"); in qeth_l3_vlan_rx_kill_vid()
1294 clear_bit(vid, card->active_vlans); in qeth_l3_vlan_rx_kill_vid()
1299 static void qeth_l3_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, in qeth_l3_rebuild_skb() argument
1315 card->stats.multicast++; in qeth_l3_rebuild_skb()
1318 ether_addr_copy(tg_addr, card->dev->broadcast); in qeth_l3_rebuild_skb()
1319 card->stats.multicast++; in qeth_l3_rebuild_skb()
1322 if (card->options.sniffer) in qeth_l3_rebuild_skb()
1324 ether_addr_copy(tg_addr, card->dev->dev_addr); in qeth_l3_rebuild_skb()
1328 card->dev->header_ops->create(skb, card->dev, prot, in qeth_l3_rebuild_skb()
1332 card->dev->header_ops->create(skb, card->dev, prot, in qeth_l3_rebuild_skb()
1336 skb->protocol = eth_type_trans(skb, card->dev); in qeth_l3_rebuild_skb()
1339 if (!card->options.sniffer && in qeth_l3_rebuild_skb()
1348 qeth_rx_csum(card, skb, hdr->hdr.l3.ext_flags); in qeth_l3_rebuild_skb()
1351 static int qeth_l3_process_inbound_buffer(struct qeth_card *card, in qeth_l3_process_inbound_buffer() argument
1363 skb = qeth_core_get_next_skb(card, in qeth_l3_process_inbound_buffer()
1364 &card->qdio.in_q->bufs[card->rx.b_index], in qeth_l3_process_inbound_buffer()
1365 &card->rx.b_element, &card->rx.e_offset, &hdr); in qeth_l3_process_inbound_buffer()
1373 if ((card->info.type == QETH_CARD_TYPE_IQD) && in qeth_l3_process_inbound_buffer()
1377 card->dev->header_ops->create(skb, card->dev, 0, in qeth_l3_process_inbound_buffer()
1378 card->dev->dev_addr, "FAKELL", len); in qeth_l3_process_inbound_buffer()
1382 qeth_l3_rebuild_skb(card, skb, hdr); in qeth_l3_process_inbound_buffer()
1384 napi_gro_receive(&card->napi, skb); in qeth_l3_process_inbound_buffer()
1394 QETH_CARD_TEXT(card, 3, "inbunkno"); in qeth_l3_process_inbound_buffer()
1400 card->stats.rx_packets++; in qeth_l3_process_inbound_buffer()
1401 card->stats.rx_bytes += len; in qeth_l3_process_inbound_buffer()
1406 static void qeth_l3_stop_card(struct qeth_card *card, int recovery_mode) in qeth_l3_stop_card() argument
1409 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); in qeth_l3_stop_card()
1411 qeth_set_allowed_threads(card, 0, 1); in qeth_l3_stop_card()
1412 if (card->options.sniffer && in qeth_l3_stop_card()
1413 (card->info.promisc_mode == SET_PROMISC_MODE_ON)) in qeth_l3_stop_card()
1414 qeth_diags_trace(card, QETH_DIAGS_CMD_TRACE_DISABLE); in qeth_l3_stop_card()
1415 if (card->read.state == CH_STATE_UP && in qeth_l3_stop_card()
1416 card->write.state == CH_STATE_UP && in qeth_l3_stop_card()
1417 (card->state == CARD_STATE_UP)) { in qeth_l3_stop_card()
1419 qeth_l3_stop(card->dev); in qeth_l3_stop_card()
1422 dev_close(card->dev); in qeth_l3_stop_card()
1425 card->state = CARD_STATE_SOFTSETUP; in qeth_l3_stop_card()
1427 if (card->state == CARD_STATE_SOFTSETUP) { in qeth_l3_stop_card()
1428 qeth_l3_clear_ip_htable(card, 1); in qeth_l3_stop_card()
1429 qeth_clear_ipacmd_list(card); in qeth_l3_stop_card()
1430 card->state = CARD_STATE_HARDSETUP; in qeth_l3_stop_card()
1432 if (card->state == CARD_STATE_HARDSETUP) { in qeth_l3_stop_card()
1433 qeth_qdio_clear_card(card, 0); in qeth_l3_stop_card()
1434 qeth_clear_qdio_buffers(card); in qeth_l3_stop_card()
1435 qeth_clear_working_pool_list(card); in qeth_l3_stop_card()
1436 card->state = CARD_STATE_DOWN; in qeth_l3_stop_card()
1438 if (card->state == CARD_STATE_DOWN) { in qeth_l3_stop_card()
1439 qeth_clear_cmd_buffers(&card->read); in qeth_l3_stop_card()
1440 qeth_clear_cmd_buffers(&card->write); in qeth_l3_stop_card()
1449 qeth_l3_handle_promisc_mode(struct qeth_card *card) in qeth_l3_handle_promisc_mode() argument
1451 struct net_device *dev = card->dev; in qeth_l3_handle_promisc_mode()
1454 (card->info.promisc_mode == SET_PROMISC_MODE_ON)) || in qeth_l3_handle_promisc_mode()
1456 (card->info.promisc_mode == SET_PROMISC_MODE_OFF))) in qeth_l3_handle_promisc_mode()
1459 if (card->info.guestlan) { /* Guestlan trace */ in qeth_l3_handle_promisc_mode()
1460 if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE)) in qeth_l3_handle_promisc_mode()
1461 qeth_setadp_promisc_mode(card); in qeth_l3_handle_promisc_mode()
1462 } else if (card->options.sniffer && /* HiperSockets trace */ in qeth_l3_handle_promisc_mode()
1463 qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) { in qeth_l3_handle_promisc_mode()
1465 QETH_CARD_TEXT(card, 3, "+promisc"); in qeth_l3_handle_promisc_mode()
1466 qeth_diags_trace(card, QETH_DIAGS_CMD_TRACE_ENABLE); in qeth_l3_handle_promisc_mode()
1468 QETH_CARD_TEXT(card, 3, "-promisc"); in qeth_l3_handle_promisc_mode()
1469 qeth_diags_trace(card, QETH_DIAGS_CMD_TRACE_DISABLE); in qeth_l3_handle_promisc_mode()
1476 struct qeth_card *card = dev->ml_priv; in qeth_l3_set_rx_mode() local
1481 QETH_CARD_TEXT(card, 3, "setmulti"); in qeth_l3_set_rx_mode()
1482 if (qeth_threads_running(card, QETH_RECOVER_THREAD) && in qeth_l3_set_rx_mode()
1483 (card->state != CARD_STATE_UP)) in qeth_l3_set_rx_mode()
1485 if (!card->options.sniffer) { in qeth_l3_set_rx_mode()
1486 spin_lock_bh(&card->mclock); in qeth_l3_set_rx_mode()
1488 qeth_l3_add_multicast_ipv4(card); in qeth_l3_set_rx_mode()
1489 qeth_l3_add_multicast_ipv6(card); in qeth_l3_set_rx_mode()
1491 hash_for_each_safe(card->ip_mc_htable, i, tmp, addr, hnode) { in qeth_l3_set_rx_mode()
1494 rc = qeth_l3_deregister_addr_entry(card, addr); in qeth_l3_set_rx_mode()
1501 rc = qeth_l3_register_addr_entry(card, addr); in qeth_l3_set_rx_mode()
1515 spin_unlock_bh(&card->mclock); in qeth_l3_set_rx_mode()
1517 if (!qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE)) in qeth_l3_set_rx_mode()
1520 qeth_l3_handle_promisc_mode(card); in qeth_l3_set_rx_mode()
1546 static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries) in qeth_l3_arp_set_no_entries() argument
1551 QETH_CARD_TEXT(card, 3, "arpstnoe"); in qeth_l3_arp_set_no_entries()
1558 if (card->info.guestlan) in qeth_l3_arp_set_no_entries()
1560 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { in qeth_l3_arp_set_no_entries()
1563 rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING, in qeth_l3_arp_set_no_entries()
1569 "%s: %s (0x%x/%d)\n", QETH_CARD_IFNAME(card), in qeth_l3_arp_set_no_entries()
1575 static __u32 get_arp_entry_size(struct qeth_card *card, in get_arp_entry_size() argument
1584 QETH_CARD_TEXT(card, 4, "arpev4"); in get_arp_entry_size()
1593 QETH_CARD_TEXT(card, 4, "arpev6"); in get_arp_entry_size()
1604 QETH_CARD_TEXT(card, 4, "arpinv"); in get_arp_entry_size()
1617 static int qeth_l3_arp_query_cb(struct qeth_card *card, in qeth_l3_arp_query_cb() argument
1629 QETH_CARD_TEXT(card, 3, "arpquecb"); in qeth_l3_arp_query_cb()
1633 QETH_CARD_TEXT_(card, 4, "%i", cmd->hdr.prot_version); in qeth_l3_arp_query_cb()
1635 QETH_CARD_TEXT(card, 4, "arpcberr"); in qeth_l3_arp_query_cb()
1636 QETH_CARD_TEXT_(card, 4, "%i", cmd->hdr.return_code); in qeth_l3_arp_query_cb()
1641 QETH_CARD_TEXT(card, 4, "setaperr"); in qeth_l3_arp_query_cb()
1642 QETH_CARD_TEXT_(card, 4, "%i", cmd->hdr.return_code); in qeth_l3_arp_query_cb()
1646 QETH_CARD_TEXT_(card, 4, "anoen%i", qdata->no_entries); in qeth_l3_arp_query_cb()
1659 QETH_CARD_TEXT(card, 4, "pmis"); in qeth_l3_arp_query_cb()
1660 QETH_CARD_TEXT_(card, 4, "%i", etype->ip); in qeth_l3_arp_query_cb()
1663 esize = get_arp_entry_size(card, qdata, etype, in qeth_l3_arp_query_cb()
1665 QETH_CARD_TEXT_(card, 5, "esz%i", esize); in qeth_l3_arp_query_cb()
1670 QETH_CARD_TEXT_(card, 4, "qaer3%i", -ENOMEM); in qeth_l3_arp_query_cb()
1686 QETH_CARD_TEXT_(card, 4, "nove%i", qinfo->no_entries); in qeth_l3_arp_query_cb()
1693 QETH_CARD_TEXT_(card, 4, "rc%i", 0); in qeth_l3_arp_query_cb()
1701 static int qeth_l3_send_ipa_arp_cmd(struct qeth_card *card, in qeth_l3_send_ipa_arp_cmd() argument
1707 QETH_CARD_TEXT(card, 4, "sendarp"); in qeth_l3_send_ipa_arp_cmd()
1711 &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH); in qeth_l3_send_ipa_arp_cmd()
1712 return qeth_send_control_data(card, IPA_PDU_HEADER_SIZE + len, iob, in qeth_l3_send_ipa_arp_cmd()
1716 static int qeth_l3_query_arp_cache_info(struct qeth_card *card, in qeth_l3_query_arp_cache_info() argument
1725 QETH_CARD_TEXT_(card, 3, "qarpipv%i", prot); in qeth_l3_query_arp_cache_info()
1727 iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING, in qeth_l3_query_arp_cache_info()
1738 rc = qeth_l3_send_ipa_arp_cmd(card, iob, in qeth_l3_query_arp_cache_info()
1745 "(0x%x/%d)\n", QETH_CARD_IFNAME(card), in qeth_l3_query_arp_cache_info()
1752 static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata) in qeth_l3_arp_query() argument
1757 QETH_CARD_TEXT(card, 3, "arpquery"); in qeth_l3_arp_query()
1759 if (!qeth_is_supported(card,/*IPA_QUERY_ARP_ADDR_INFO*/ in qeth_l3_arp_query()
1761 QETH_CARD_TEXT(card, 3, "arpqnsup"); in qeth_l3_arp_query()
1776 rc = qeth_l3_query_arp_cache_info(card, QETH_PROT_IPV4, &qinfo); in qeth_l3_arp_query()
1784 qeth_l3_query_arp_cache_info(card, QETH_PROT_IPV6, &qinfo); in qeth_l3_arp_query()
1787 QETH_CARD_TEXT(card, 4, "qactf"); in qeth_l3_arp_query()
1791 QETH_CARD_TEXT(card, 4, "qacts"); in qeth_l3_arp_query()
1799 static int qeth_l3_arp_add_entry(struct qeth_card *card, in qeth_l3_arp_add_entry() argument
1807 QETH_CARD_TEXT(card, 3, "arpadent"); in qeth_l3_arp_add_entry()
1814 if (card->info.guestlan) in qeth_l3_arp_add_entry()
1816 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { in qeth_l3_arp_add_entry()
1820 iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING, in qeth_l3_arp_add_entry()
1826 rc = qeth_send_setassparms(card, iob, in qeth_l3_arp_add_entry()
1834 "on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card), in qeth_l3_arp_add_entry()
1840 static int qeth_l3_arp_remove_entry(struct qeth_card *card, in qeth_l3_arp_remove_entry() argument
1848 QETH_CARD_TEXT(card, 3, "arprment"); in qeth_l3_arp_remove_entry()
1855 if (card->info.guestlan) in qeth_l3_arp_remove_entry()
1857 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { in qeth_l3_arp_remove_entry()
1861 iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING, in qeth_l3_arp_remove_entry()
1867 rc = qeth_send_setassparms(card, iob, in qeth_l3_arp_remove_entry()
1875 " on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card), in qeth_l3_arp_remove_entry()
1881 static int qeth_l3_arp_flush_cache(struct qeth_card *card) in qeth_l3_arp_flush_cache() argument
1886 QETH_CARD_TEXT(card, 3, "arpflush"); in qeth_l3_arp_flush_cache()
1893 if (card->info.guestlan || (card->info.type == QETH_CARD_TYPE_IQD)) in qeth_l3_arp_flush_cache()
1895 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { in qeth_l3_arp_flush_cache()
1898 rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING, in qeth_l3_arp_flush_cache()
1903 "(0x%x/%d)\n", QETH_CARD_IFNAME(card), in qeth_l3_arp_flush_cache()
1911 struct qeth_card *card = dev->ml_priv; in qeth_l3_do_ioctl() local
1921 rc = qeth_l3_arp_set_no_entries(card, rq->ifr_ifru.ifru_ivalue); in qeth_l3_do_ioctl()
1928 rc = qeth_l3_arp_query(card, rq->ifr_ifru.ifru_data); in qeth_l3_do_ioctl()
1939 rc = qeth_l3_arp_add_entry(card, &arp_entry); in qeth_l3_do_ioctl()
1950 rc = qeth_l3_arp_remove_entry(card, &arp_entry); in qeth_l3_do_ioctl()
1957 rc = qeth_l3_arp_flush_cache(card); in qeth_l3_do_ioctl()
2035 static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, in qeth_l3_fill_header() argument
2048 if ((ipv == 4) || (card->info.type == QETH_CARD_TYPE_IQD)) in qeth_l3_fill_header()
2057 if (card->options.performance_stats) in qeth_l3_fill_header()
2058 card->perf_stats.tx_csum++; in qeth_l3_fill_header()
2093 if (card->info.type != QETH_CARD_TYPE_IQD) in qeth_l3_fill_header()
2099 static void qeth_tso_fill_header(struct qeth_card *card, in qeth_tso_fill_header() argument
2136 * @card: qeth card structure, to check max. elems.
2143 * Checks if the result plus extra_elems fits under the limit for the card.
2147 static int qeth_l3_get_elements_no_tso(struct qeth_card *card, in qeth_l3_get_elements_no_tso() argument
2157 if ((elements + extra_elems) > QETH_MAX_BUFFER_ELEMENTS(card)) { in qeth_l3_get_elements_no_tso()
2166 static int qeth_l3_xmit_offload(struct qeth_card *card, struct sk_buff *skb, in qeth_l3_xmit_offload() argument
2186 push_len = qeth_add_hw_header(card, skb, &hdr, hw_hdr_len, 0, in qeth_l3_xmit_offload()
2198 qeth_l3_fill_header(card, hdr, skb, ipv, cast_type, frame_len); in qeth_l3_xmit_offload()
2201 if (IS_IQD(card)) { in qeth_l3_xmit_offload()
2206 rc = qeth_do_send_packet(card, queue, skb, hdr, 0, hd_len, in qeth_l3_xmit_offload()
2211 if (card->options.performance_stats) { in qeth_l3_xmit_offload()
2212 card->perf_stats.buf_elements_sent += elements; in qeth_l3_xmit_offload()
2214 card->perf_stats.sg_skbs_sent++; in qeth_l3_xmit_offload()
2229 static int qeth_l3_xmit(struct qeth_card *card, struct sk_buff *skb, in qeth_l3_xmit() argument
2268 if ((use_tso && !qeth_l3_get_elements_no_tso(card, new_skb, 1)) || in qeth_l3_xmit()
2269 (!use_tso && !qeth_get_elements_no(card, new_skb, 0, 0))) { in qeth_l3_xmit()
2272 if (card->options.performance_stats) { in qeth_l3_xmit()
2274 card->perf_stats.tx_linfail++; in qeth_l3_xmit()
2276 card->perf_stats.tx_lin++; in qeth_l3_xmit()
2285 qeth_l3_fill_header(card, hdr, new_skb, ipv, cast_type, in qeth_l3_xmit()
2287 qeth_tso_fill_header(card, hdr, new_skb); in qeth_l3_xmit()
2291 qeth_l3_fill_header(card, hdr, new_skb, ipv, cast_type, in qeth_l3_xmit()
2296 qeth_l3_get_elements_no_tso(card, new_skb, hdr_elements) : in qeth_l3_xmit()
2297 qeth_get_elements_no(card, new_skb, hdr_elements, 0); in qeth_l3_xmit()
2319 rc = qeth_do_send_packet(card, queue, new_skb, hdr, hd_len, hd_len, in qeth_l3_xmit()
2325 if (card->options.performance_stats) { in qeth_l3_xmit()
2326 card->perf_stats.buf_elements_sent += elements; in qeth_l3_xmit()
2328 card->perf_stats.sg_skbs_sent++; in qeth_l3_xmit()
2330 card->perf_stats.large_send_bytes += tx_bytes; in qeth_l3_xmit()
2331 card->perf_stats.large_send_cnt++; in qeth_l3_xmit()
2345 struct qeth_card *card = dev->ml_priv; in qeth_l3_hard_start_xmit() local
2351 if (IS_IQD(card)) { in qeth_l3_hard_start_xmit()
2352 if (card->options.sniffer) in qeth_l3_hard_start_xmit()
2354 if ((card->options.cq != QETH_CQ_ENABLED && !ipv) || in qeth_l3_hard_start_xmit()
2355 (card->options.cq == QETH_CQ_ENABLED && in qeth_l3_hard_start_xmit()
2360 if (card->state != CARD_STATE_UP || !card->lan_online) { in qeth_l3_hard_start_xmit()
2361 card->stats.tx_carrier_errors++; in qeth_l3_hard_start_xmit()
2365 if (cast_type == RTN_BROADCAST && !card->info.broadcast_capable) in qeth_l3_hard_start_xmit()
2368 queue = qeth_get_tx_queue(card, skb, ipv, cast_type); in qeth_l3_hard_start_xmit()
2370 if (card->options.performance_stats) { in qeth_l3_hard_start_xmit()
2371 card->perf_stats.outbound_cnt++; in qeth_l3_hard_start_xmit()
2372 card->perf_stats.outbound_start_time = qeth_get_micros(); in qeth_l3_hard_start_xmit()
2376 if (IS_IQD(card) || (!skb_is_gso(skb) && ipv == 4)) in qeth_l3_hard_start_xmit()
2377 rc = qeth_l3_xmit_offload(card, skb, queue, ipv, cast_type); in qeth_l3_hard_start_xmit()
2379 rc = qeth_l3_xmit(card, skb, queue, ipv, cast_type); in qeth_l3_hard_start_xmit()
2382 card->stats.tx_packets++; in qeth_l3_hard_start_xmit()
2383 card->stats.tx_bytes += tx_bytes; in qeth_l3_hard_start_xmit()
2384 if (card->options.performance_stats) in qeth_l3_hard_start_xmit()
2385 card->perf_stats.outbound_time += qeth_get_micros() - in qeth_l3_hard_start_xmit()
2386 card->perf_stats.outbound_start_time; in qeth_l3_hard_start_xmit()
2394 card->stats.tx_dropped++; in qeth_l3_hard_start_xmit()
2395 card->stats.tx_errors++; in qeth_l3_hard_start_xmit()
2403 struct qeth_card *card = dev->ml_priv; in __qeth_l3_open() local
2406 QETH_CARD_TEXT(card, 4, "qethopen"); in __qeth_l3_open()
2407 if (card->state == CARD_STATE_UP) in __qeth_l3_open()
2409 if (card->state != CARD_STATE_SOFTSETUP) in __qeth_l3_open()
2411 card->data.state = CH_STATE_UP; in __qeth_l3_open()
2412 card->state = CARD_STATE_UP; in __qeth_l3_open()
2415 if (qdio_stop_irq(card->data.ccwdev, 0) >= 0) { in __qeth_l3_open()
2416 napi_enable(&card->napi); in __qeth_l3_open()
2418 napi_schedule(&card->napi); in __qeth_l3_open()
2428 struct qeth_card *card = dev->ml_priv; in qeth_l3_open() local
2430 QETH_CARD_TEXT(card, 5, "qethope_"); in qeth_l3_open()
2431 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { in qeth_l3_open()
2432 QETH_CARD_TEXT(card, 3, "openREC"); in qeth_l3_open()
2440 struct qeth_card *card = dev->ml_priv; in qeth_l3_stop() local
2442 QETH_CARD_TEXT(card, 4, "qethstop"); in qeth_l3_stop()
2444 if (card->state == CARD_STATE_UP) { in qeth_l3_stop()
2445 card->state = CARD_STATE_SOFTSETUP; in qeth_l3_stop()
2446 napi_disable(&card->napi); in qeth_l3_stop()
2516 static int qeth_l3_setup_netdev(struct qeth_card *card) in qeth_l3_setup_netdev() argument
2520 if (qeth_netdev_is_registered(card->dev)) in qeth_l3_setup_netdev()
2523 if (card->info.type == QETH_CARD_TYPE_OSD || in qeth_l3_setup_netdev()
2524 card->info.type == QETH_CARD_TYPE_OSX) { in qeth_l3_setup_netdev()
2525 if ((card->info.link_type == QETH_LINK_TYPE_LANE_TR) || in qeth_l3_setup_netdev()
2526 (card->info.link_type == QETH_LINK_TYPE_HSTR)) { in qeth_l3_setup_netdev()
2531 card->dev->netdev_ops = &qeth_l3_osa_netdev_ops; in qeth_l3_setup_netdev()
2534 qeth_l3_get_unique_id(card); in qeth_l3_setup_netdev()
2535 if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD)) in qeth_l3_setup_netdev()
2536 card->dev->dev_id = card->info.unique_id & 0xffff; in qeth_l3_setup_netdev()
2538 if (!card->info.guestlan) { in qeth_l3_setup_netdev()
2539 card->dev->features |= NETIF_F_SG; in qeth_l3_setup_netdev()
2540 card->dev->hw_features |= NETIF_F_TSO | in qeth_l3_setup_netdev()
2542 card->dev->vlan_features |= NETIF_F_TSO | in qeth_l3_setup_netdev()
2546 if (qeth_is_supported6(card, IPA_OUTBOUND_CHECKSUM_V6)) { in qeth_l3_setup_netdev()
2547 card->dev->hw_features |= NETIF_F_IPV6_CSUM; in qeth_l3_setup_netdev()
2548 card->dev->vlan_features |= NETIF_F_IPV6_CSUM; in qeth_l3_setup_netdev()
2550 } else if (card->info.type == QETH_CARD_TYPE_IQD) { in qeth_l3_setup_netdev()
2551 card->dev->flags |= IFF_NOARP; in qeth_l3_setup_netdev()
2552 card->dev->netdev_ops = &qeth_l3_netdev_ops; in qeth_l3_setup_netdev()
2554 rc = qeth_l3_iqd_read_initial_mac(card); in qeth_l3_setup_netdev()
2558 if (card->options.hsuid[0]) in qeth_l3_setup_netdev()
2559 memcpy(card->dev->perm_addr, card->options.hsuid, 9); in qeth_l3_setup_netdev()
2563 card->dev->ethtool_ops = &qeth_l3_ethtool_ops; in qeth_l3_setup_netdev()
2564 card->dev->needed_headroom = sizeof(struct qeth_hdr) - ETH_HLEN; in qeth_l3_setup_netdev()
2565 card->dev->features |= NETIF_F_HW_VLAN_CTAG_TX | in qeth_l3_setup_netdev()
2569 netif_keep_dst(card->dev); in qeth_l3_setup_netdev()
2570 if (card->dev->hw_features & NETIF_F_TSO) in qeth_l3_setup_netdev()
2571 netif_set_gso_max_size(card->dev, in qeth_l3_setup_netdev()
2572 PAGE_SIZE * (QETH_MAX_BUFFER_ELEMENTS(card) - 1)); in qeth_l3_setup_netdev()
2574 netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT); in qeth_l3_setup_netdev()
2575 rc = register_netdev(card->dev); in qeth_l3_setup_netdev()
2578 card->dev->netdev_ops = NULL; in qeth_l3_setup_netdev()
2589 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l3_probe_device() local
2592 hash_init(card->ip_htable); in qeth_l3_probe_device()
2600 hash_init(card->ip_mc_htable); in qeth_l3_probe_device()
2601 card->options.layer2 = 0; in qeth_l3_probe_device()
2602 card->info.hwtrap = 0; in qeth_l3_probe_device()
2608 struct qeth_card *card = dev_get_drvdata(&cgdev->dev); in qeth_l3_remove_device() local
2613 qeth_set_allowed_threads(card, 0, 1); in qeth_l3_remove_device()
2614 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); in qeth_l3_remove_device()
2619 cancel_work_sync(&card->close_dev_work); in qeth_l3_remove_device()
2620 if (qeth_netdev_is_registered(card->dev)) in qeth_l3_remove_device()
2621 unregister_netdev(card->dev); in qeth_l3_remove_device()
2622 qeth_l3_clear_ip_htable(card, 0); in qeth_l3_remove_device()
2623 qeth_l3_clear_ipato_list(card); in qeth_l3_remove_device()
2628 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in __qeth_l3_set_online() local
2632 mutex_lock(&card->discipline_mutex); in __qeth_l3_set_online()
2633 mutex_lock(&card->conf_mutex); in __qeth_l3_set_online()
2635 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); in __qeth_l3_set_online()
2637 recover_flag = card->state; in __qeth_l3_set_online()
2638 rc = qeth_core_hardsetup_card(card); in __qeth_l3_set_online()
2645 rc = qeth_l3_setup_netdev(card); in __qeth_l3_set_online()
2649 if (qeth_is_diagass_supported(card, QETH_DIAGS_CMD_TRAP)) { in __qeth_l3_set_online()
2650 if (card->info.hwtrap && in __qeth_l3_set_online()
2651 qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM)) in __qeth_l3_set_online()
2652 card->info.hwtrap = 0; in __qeth_l3_set_online()
2654 card->info.hwtrap = 0; in __qeth_l3_set_online()
2656 card->state = CARD_STATE_HARDSETUP; in __qeth_l3_set_online()
2657 qeth_print_status_message(card); in __qeth_l3_set_online()
2662 rc = qeth_l3_setadapter_parms(card); in __qeth_l3_set_online()
2665 if (!card->options.sniffer) { in __qeth_l3_set_online()
2666 rc = qeth_l3_start_ipassists(card); in __qeth_l3_set_online()
2671 rc = qeth_l3_setrouting_v4(card); in __qeth_l3_set_online()
2674 rc = qeth_l3_setrouting_v6(card); in __qeth_l3_set_online()
2678 netif_tx_disable(card->dev); in __qeth_l3_set_online()
2680 rc = qeth_init_qdio_queues(card); in __qeth_l3_set_online()
2686 card->state = CARD_STATE_SOFTSETUP; in __qeth_l3_set_online()
2688 qeth_set_allowed_threads(card, 0xffffffff, 0); in __qeth_l3_set_online()
2689 qeth_l3_recover_ip(card); in __qeth_l3_set_online()
2690 if (card->lan_online) in __qeth_l3_set_online()
2691 netif_carrier_on(card->dev); in __qeth_l3_set_online()
2693 netif_carrier_off(card->dev); in __qeth_l3_set_online()
2695 qeth_enable_hw_features(card->dev); in __qeth_l3_set_online()
2699 __qeth_l3_open(card->dev); in __qeth_l3_set_online()
2700 qeth_l3_set_rx_mode(card->dev); in __qeth_l3_set_online()
2702 dev_open(card->dev); in __qeth_l3_set_online()
2706 qeth_trace_features(card); in __qeth_l3_set_online()
2709 mutex_unlock(&card->conf_mutex); in __qeth_l3_set_online()
2710 mutex_unlock(&card->discipline_mutex); in __qeth_l3_set_online()
2713 qeth_l3_stop_card(card, 0); in __qeth_l3_set_online()
2714 ccw_device_set_offline(CARD_DDEV(card)); in __qeth_l3_set_online()
2715 ccw_device_set_offline(CARD_WDEV(card)); in __qeth_l3_set_online()
2716 ccw_device_set_offline(CARD_RDEV(card)); in __qeth_l3_set_online()
2717 qdio_free(CARD_DDEV(card)); in __qeth_l3_set_online()
2719 card->state = CARD_STATE_RECOVER; in __qeth_l3_set_online()
2721 card->state = CARD_STATE_DOWN; in __qeth_l3_set_online()
2722 mutex_unlock(&card->conf_mutex); in __qeth_l3_set_online()
2723 mutex_unlock(&card->discipline_mutex); in __qeth_l3_set_online()
2735 struct qeth_card *card = dev_get_drvdata(&cgdev->dev); in __qeth_l3_set_offline() local
2739 mutex_lock(&card->discipline_mutex); in __qeth_l3_set_offline()
2740 mutex_lock(&card->conf_mutex); in __qeth_l3_set_offline()
2742 QETH_DBF_HEX(SETUP, 3, &card, sizeof(void *)); in __qeth_l3_set_offline()
2744 netif_carrier_off(card->dev); in __qeth_l3_set_offline()
2745 recover_flag = card->state; in __qeth_l3_set_offline()
2746 if ((!recovery_mode && card->info.hwtrap) || card->info.hwtrap == 2) { in __qeth_l3_set_offline()
2747 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); in __qeth_l3_set_offline()
2748 card->info.hwtrap = 1; in __qeth_l3_set_offline()
2750 qeth_l3_stop_card(card, recovery_mode); in __qeth_l3_set_offline()
2751 if ((card->options.cq == QETH_CQ_ENABLED) && card->dev) { in __qeth_l3_set_offline()
2753 call_netdevice_notifiers(NETDEV_REBOOT, card->dev); in __qeth_l3_set_offline()
2756 rc = ccw_device_set_offline(CARD_DDEV(card)); in __qeth_l3_set_offline()
2757 rc2 = ccw_device_set_offline(CARD_WDEV(card)); in __qeth_l3_set_offline()
2758 rc3 = ccw_device_set_offline(CARD_RDEV(card)); in __qeth_l3_set_offline()
2763 qdio_free(CARD_DDEV(card)); in __qeth_l3_set_offline()
2765 card->state = CARD_STATE_RECOVER; in __qeth_l3_set_offline()
2768 mutex_unlock(&card->conf_mutex); in __qeth_l3_set_offline()
2769 mutex_unlock(&card->discipline_mutex); in __qeth_l3_set_offline()
2780 struct qeth_card *card; in qeth_l3_recover() local
2783 card = (struct qeth_card *) ptr; in qeth_l3_recover()
2784 QETH_CARD_TEXT(card, 2, "recover1"); in qeth_l3_recover()
2785 QETH_CARD_HEX(card, 2, &card, sizeof(void *)); in qeth_l3_recover()
2786 if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD)) in qeth_l3_recover()
2788 QETH_CARD_TEXT(card, 2, "recover2"); in qeth_l3_recover()
2789 dev_warn(&card->gdev->dev, in qeth_l3_recover()
2791 qeth_set_recovery_task(card); in qeth_l3_recover()
2792 __qeth_l3_set_offline(card->gdev, 1); in qeth_l3_recover()
2793 rc = __qeth_l3_set_online(card->gdev, 1); in qeth_l3_recover()
2795 dev_info(&card->gdev->dev, in qeth_l3_recover()
2798 qeth_close_dev(card); in qeth_l3_recover()
2799 dev_warn(&card->gdev->dev, "The qeth device driver " in qeth_l3_recover()
2802 qeth_clear_recovery_task(card); in qeth_l3_recover()
2803 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); in qeth_l3_recover()
2804 qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD); in qeth_l3_recover()
2810 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l3_pm_suspend() local
2812 netif_device_detach(card->dev); in qeth_l3_pm_suspend()
2813 qeth_set_allowed_threads(card, 0, 1); in qeth_l3_pm_suspend()
2814 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); in qeth_l3_pm_suspend()
2817 if (card->state == CARD_STATE_UP) { in qeth_l3_pm_suspend()
2818 if (card->info.hwtrap) in qeth_l3_pm_suspend()
2819 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); in qeth_l3_pm_suspend()
2820 __qeth_l3_set_offline(card->gdev, 1); in qeth_l3_pm_suspend()
2822 __qeth_l3_set_offline(card->gdev, 0); in qeth_l3_pm_suspend()
2828 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l3_pm_resume() local
2834 if (card->state == CARD_STATE_RECOVER) { in qeth_l3_pm_resume()
2835 rc = __qeth_l3_set_online(card->gdev, 1); in qeth_l3_pm_resume()
2838 dev_close(card->dev); in qeth_l3_pm_resume()
2842 rc = __qeth_l3_set_online(card->gdev, 0); in qeth_l3_pm_resume()
2844 qeth_set_allowed_threads(card, 0xffffffff, 0); in qeth_l3_pm_resume()
2845 netif_device_attach(card->dev); in qeth_l3_pm_resume()
2847 dev_warn(&card->gdev->dev, "The qeth device driver " in qeth_l3_pm_resume()
2853 static int qeth_l3_control_event(struct qeth_card *card, in qeth_l3_control_event() argument
2875 static int qeth_l3_handle_ip_event(struct qeth_card *card, in qeth_l3_handle_ip_event() argument
2881 spin_lock_bh(&card->ip_lock); in qeth_l3_handle_ip_event()
2882 qeth_l3_add_ip(card, addr); in qeth_l3_handle_ip_event()
2883 spin_unlock_bh(&card->ip_lock); in qeth_l3_handle_ip_event()
2886 spin_lock_bh(&card->ip_lock); in qeth_l3_handle_ip_event()
2887 qeth_l3_delete_ip(card, addr); in qeth_l3_handle_ip_event()
2888 spin_unlock_bh(&card->ip_lock); in qeth_l3_handle_ip_event()
2912 struct qeth_card *card; in qeth_l3_ip_event() local
2917 card = qeth_l3_get_card_from_dev(dev); in qeth_l3_ip_event()
2918 if (!card) in qeth_l3_ip_event()
2920 QETH_CARD_TEXT(card, 3, "ipevent"); in qeth_l3_ip_event()
2926 return qeth_l3_handle_ip_event(card, &addr, event); in qeth_l3_ip_event()
2940 struct qeth_card *card; in qeth_l3_ip6_event() local
2942 card = qeth_l3_get_card_from_dev(dev); in qeth_l3_ip6_event()
2943 if (!card) in qeth_l3_ip6_event()
2945 QETH_CARD_TEXT(card, 3, "ip6event"); in qeth_l3_ip6_event()
2946 if (!qeth_is_supported(card, IPA_IPV6)) in qeth_l3_ip6_event()
2953 return qeth_l3_handle_ip_event(card, &addr, event); in qeth_l3_ip6_event()