Lines Matching refs:card

170 int qeth_l3_is_addr_covered_by_ipato(struct qeth_card *card,  in qeth_l3_is_addr_covered_by_ipato()  argument
178 if (!card->ipato.enabled) in qeth_l3_is_addr_covered_by_ipato()
183 list_for_each_entry(ipatoe, &card->ipato.entries, entry) { in qeth_l3_is_addr_covered_by_ipato()
199 if ((addr->proto == QETH_PROT_IPV4) && card->ipato.invert4) in qeth_l3_is_addr_covered_by_ipato()
201 else if ((addr->proto == QETH_PROT_IPV6) && card->ipato.invert6) in qeth_l3_is_addr_covered_by_ipato()
212 static int __qeth_l3_insert_ip_todo(struct qeth_card *card, in __qeth_l3_insert_ip_todo() argument
218 if (card->options.sniffer) in __qeth_l3_insert_ip_todo()
220 list_for_each_entry_safe(tmp, t, card->ip_tbd_list, entry) { in __qeth_l3_insert_ip_todo()
256 list_add(&addr->entry, card->ip_tbd_list); in __qeth_l3_insert_ip_todo()
261 qeth_l3_is_addr_covered_by_ipato(card, addr)) { in __qeth_l3_insert_ip_todo()
262 QETH_CARD_TEXT(card, 2, "tkovaddr"); in __qeth_l3_insert_ip_todo()
265 list_add_tail(&addr->entry, card->ip_tbd_list); in __qeth_l3_insert_ip_todo()
271 int qeth_l3_delete_ip(struct qeth_card *card, struct qeth_ipaddr *addr) in qeth_l3_delete_ip() argument
276 QETH_CARD_TEXT(card, 4, "delip"); in qeth_l3_delete_ip()
279 QETH_CARD_HEX(card, 4, &addr->u.a4.addr, 4); in qeth_l3_delete_ip()
281 QETH_CARD_HEX(card, 4, &addr->u.a6.addr, 8); in qeth_l3_delete_ip()
282 QETH_CARD_HEX(card, 4, ((char *)&addr->u.a6.addr) + 8, 8); in qeth_l3_delete_ip()
284 spin_lock_irqsave(&card->ip_lock, flags); in qeth_l3_delete_ip()
285 rc = __qeth_l3_insert_ip_todo(card, addr, 0); in qeth_l3_delete_ip()
286 spin_unlock_irqrestore(&card->ip_lock, flags); in qeth_l3_delete_ip()
290 int qeth_l3_add_ip(struct qeth_card *card, struct qeth_ipaddr *addr) in qeth_l3_add_ip() argument
295 QETH_CARD_TEXT(card, 4, "addip"); in qeth_l3_add_ip()
297 QETH_CARD_HEX(card, 4, &addr->u.a4.addr, 4); in qeth_l3_add_ip()
299 QETH_CARD_HEX(card, 4, &addr->u.a6.addr, 8); in qeth_l3_add_ip()
300 QETH_CARD_HEX(card, 4, ((char *)&addr->u.a6.addr) + 8, 8); in qeth_l3_add_ip()
302 spin_lock_irqsave(&card->ip_lock, flags); in qeth_l3_add_ip()
303 rc = __qeth_l3_insert_ip_todo(card, addr, 1); in qeth_l3_add_ip()
304 spin_unlock_irqrestore(&card->ip_lock, flags); in qeth_l3_add_ip()
323 static void qeth_l3_delete_mc_addresses(struct qeth_card *card) in qeth_l3_delete_mc_addresses() argument
328 QETH_CARD_TEXT(card, 4, "delmc"); in qeth_l3_delete_mc_addresses()
331 QETH_CARD_TEXT(card, 2, "dmcnomem"); in qeth_l3_delete_mc_addresses()
335 spin_lock_irqsave(&card->ip_lock, flags); in qeth_l3_delete_mc_addresses()
336 if (!__qeth_l3_insert_ip_todo(card, iptodo, 0)) in qeth_l3_delete_mc_addresses()
338 spin_unlock_irqrestore(&card->ip_lock, flags); in qeth_l3_delete_mc_addresses()
354 static int __qeth_l3_ref_ip_on_card(struct qeth_card *card, in __qeth_l3_ref_ip_on_card() argument
360 list_for_each_entry(addr, &card->ip_list, entry) { in __qeth_l3_ref_ip_on_card()
400 static void __qeth_l3_delete_all_mc(struct qeth_card *card, in __qeth_l3_delete_all_mc() argument
409 list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) { in __qeth_l3_delete_all_mc()
412 spin_unlock_irqrestore(&card->ip_lock, *flags); in __qeth_l3_delete_all_mc()
413 rc = qeth_l3_deregister_addr_entry(card, addr); in __qeth_l3_delete_all_mc()
414 spin_lock_irqsave(&card->ip_lock, *flags); in __qeth_l3_delete_all_mc()
422 list_splice(&fail_list, &card->ip_list); in __qeth_l3_delete_all_mc()
425 void qeth_l3_set_ip_addr_list(struct qeth_card *card) in qeth_l3_set_ip_addr_list() argument
432 QETH_CARD_TEXT(card, 2, "sdiplist"); in qeth_l3_set_ip_addr_list()
433 QETH_CARD_HEX(card, 2, &card, sizeof(void *)); in qeth_l3_set_ip_addr_list()
435 if (!qeth_card_hw_is_reachable(card) || card->options.sniffer) in qeth_l3_set_ip_addr_list()
438 spin_lock_irqsave(&card->ip_lock, flags); in qeth_l3_set_ip_addr_list()
439 tbd_list = card->ip_tbd_list; in qeth_l3_set_ip_addr_list()
440 card->ip_tbd_list = kzalloc(sizeof(struct list_head), GFP_ATOMIC); in qeth_l3_set_ip_addr_list()
441 if (!card->ip_tbd_list) { in qeth_l3_set_ip_addr_list()
442 QETH_CARD_TEXT(card, 0, "silnomem"); in qeth_l3_set_ip_addr_list()
443 card->ip_tbd_list = tbd_list; in qeth_l3_set_ip_addr_list()
444 spin_unlock_irqrestore(&card->ip_lock, flags); in qeth_l3_set_ip_addr_list()
447 INIT_LIST_HEAD(card->ip_tbd_list); in qeth_l3_set_ip_addr_list()
453 __qeth_l3_delete_all_mc(card, &flags); in qeth_l3_set_ip_addr_list()
457 rc = __qeth_l3_ref_ip_on_card(card, todo, &addr); in qeth_l3_set_ip_addr_list()
463 spin_unlock_irqrestore(&card->ip_lock, flags); in qeth_l3_set_ip_addr_list()
464 rc = qeth_l3_register_addr_entry(card, todo); in qeth_l3_set_ip_addr_list()
465 spin_lock_irqsave(&card->ip_lock, flags); in qeth_l3_set_ip_addr_list()
467 list_add_tail(&todo->entry, &card->ip_list); in qeth_l3_set_ip_addr_list()
473 spin_unlock_irqrestore(&card->ip_lock, flags); in qeth_l3_set_ip_addr_list()
474 rc = qeth_l3_deregister_addr_entry(card, addr); in qeth_l3_set_ip_addr_list()
475 spin_lock_irqsave(&card->ip_lock, flags); in qeth_l3_set_ip_addr_list()
479 list_add_tail(&addr->entry, &card->ip_list); in qeth_l3_set_ip_addr_list()
483 spin_unlock_irqrestore(&card->ip_lock, flags); in qeth_l3_set_ip_addr_list()
487 static void qeth_l3_clear_ip_list(struct qeth_card *card, int recover) in qeth_l3_clear_ip_list() argument
492 QETH_CARD_TEXT(card, 4, "clearip"); in qeth_l3_clear_ip_list()
493 if (recover && card->options.sniffer) in qeth_l3_clear_ip_list()
495 spin_lock_irqsave(&card->ip_lock, flags); in qeth_l3_clear_ip_list()
497 list_for_each_entry_safe(addr, tmp, card->ip_tbd_list, entry) { in qeth_l3_clear_ip_list()
502 while (!list_empty(&card->ip_list)) { in qeth_l3_clear_ip_list()
503 addr = list_entry(card->ip_list.next, in qeth_l3_clear_ip_list()
510 list_add_tail(&addr->entry, card->ip_tbd_list); in qeth_l3_clear_ip_list()
512 spin_unlock_irqrestore(&card->ip_lock, flags); in qeth_l3_clear_ip_list()
540 static int qeth_l3_send_setdelmc(struct qeth_card *card, in qeth_l3_send_setdelmc() argument
547 QETH_CARD_TEXT(card, 4, "setdelmc"); in qeth_l3_send_setdelmc()
549 iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto); in qeth_l3_send_setdelmc()
560 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); in qeth_l3_send_setdelmc()
579 static int qeth_l3_send_setdelip(struct qeth_card *card, in qeth_l3_send_setdelip() argument
587 QETH_CARD_TEXT(card, 4, "setdelip"); in qeth_l3_send_setdelip()
588 QETH_CARD_TEXT_(card, 4, "flags%02X", flags); in qeth_l3_send_setdelip()
590 iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto); in qeth_l3_send_setdelip()
607 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); in qeth_l3_send_setdelip()
612 static int qeth_l3_send_setrouting(struct qeth_card *card, in qeth_l3_send_setrouting() argument
619 QETH_CARD_TEXT(card, 4, "setroutg"); in qeth_l3_send_setrouting()
620 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETRTG, prot); in qeth_l3_send_setrouting()
625 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); in qeth_l3_send_setrouting()
630 static int qeth_l3_correct_routing_type(struct qeth_card *card, in qeth_l3_correct_routing_type() argument
633 if (card->info.type == QETH_CARD_TYPE_IQD) { in qeth_l3_correct_routing_type()
650 if (qeth_is_ipafunc_supported(card, prot, in qeth_l3_correct_routing_type()
662 int qeth_l3_setrouting_v4(struct qeth_card *card) in qeth_l3_setrouting_v4() argument
666 QETH_CARD_TEXT(card, 3, "setrtg4"); in qeth_l3_setrouting_v4()
668 rc = qeth_l3_correct_routing_type(card, &card->options.route4.type, in qeth_l3_setrouting_v4()
673 rc = qeth_l3_send_setrouting(card, card->options.route4.type, in qeth_l3_setrouting_v4()
676 card->options.route4.type = NO_ROUTER; in qeth_l3_setrouting_v4()
679 QETH_CARD_IFNAME(card)); in qeth_l3_setrouting_v4()
684 int qeth_l3_setrouting_v6(struct qeth_card *card) in qeth_l3_setrouting_v6() argument
688 QETH_CARD_TEXT(card, 3, "setrtg6"); in qeth_l3_setrouting_v6()
691 if (!qeth_is_supported(card, IPA_IPV6)) in qeth_l3_setrouting_v6()
693 rc = qeth_l3_correct_routing_type(card, &card->options.route6.type, in qeth_l3_setrouting_v6()
698 rc = qeth_l3_send_setrouting(card, card->options.route6.type, in qeth_l3_setrouting_v6()
701 card->options.route6.type = NO_ROUTER; in qeth_l3_setrouting_v6()
704 QETH_CARD_IFNAME(card)); in qeth_l3_setrouting_v6()
713 static void qeth_l3_clear_ipato_list(struct qeth_card *card) in qeth_l3_clear_ipato_list() argument
719 spin_lock_irqsave(&card->ip_lock, flags); in qeth_l3_clear_ipato_list()
720 list_for_each_entry_safe(ipatoe, tmp, &card->ipato.entries, entry) { in qeth_l3_clear_ipato_list()
724 spin_unlock_irqrestore(&card->ip_lock, flags); in qeth_l3_clear_ipato_list()
727 int qeth_l3_add_ipato_entry(struct qeth_card *card, in qeth_l3_add_ipato_entry() argument
734 QETH_CARD_TEXT(card, 2, "addipato"); in qeth_l3_add_ipato_entry()
735 spin_lock_irqsave(&card->ip_lock, flags); in qeth_l3_add_ipato_entry()
736 list_for_each_entry(ipatoe, &card->ipato.entries, entry) { in qeth_l3_add_ipato_entry()
747 list_add_tail(&new->entry, &card->ipato.entries); in qeth_l3_add_ipato_entry()
749 spin_unlock_irqrestore(&card->ip_lock, flags); in qeth_l3_add_ipato_entry()
753 void qeth_l3_del_ipato_entry(struct qeth_card *card, in qeth_l3_del_ipato_entry() argument
759 QETH_CARD_TEXT(card, 2, "delipato"); in qeth_l3_del_ipato_entry()
760 spin_lock_irqsave(&card->ip_lock, flags); in qeth_l3_del_ipato_entry()
761 list_for_each_entry_safe(ipatoe, tmp, &card->ipato.entries, entry) { in qeth_l3_del_ipato_entry()
771 spin_unlock_irqrestore(&card->ip_lock, flags); in qeth_l3_del_ipato_entry()
777 int qeth_l3_add_vipa(struct qeth_card *card, enum qeth_prot_versions proto, in qeth_l3_add_vipa() argument
787 QETH_CARD_TEXT(card, 2, "addvipa4"); in qeth_l3_add_vipa()
791 QETH_CARD_TEXT(card, 2, "addvipa6"); in qeth_l3_add_vipa()
800 spin_lock_irqsave(&card->ip_lock, flags); in qeth_l3_add_vipa()
801 if (qeth_l3_address_exists_in_list(&card->ip_list, ipaddr, 0) || in qeth_l3_add_vipa()
802 qeth_l3_address_exists_in_list(card->ip_tbd_list, ipaddr, 0)) in qeth_l3_add_vipa()
804 spin_unlock_irqrestore(&card->ip_lock, flags); in qeth_l3_add_vipa()
809 if (!qeth_l3_add_ip(card, ipaddr)) in qeth_l3_add_vipa()
811 qeth_l3_set_ip_addr_list(card); in qeth_l3_add_vipa()
815 void qeth_l3_del_vipa(struct qeth_card *card, enum qeth_prot_versions proto, in qeth_l3_del_vipa() argument
823 QETH_CARD_TEXT(card, 2, "delvipa4"); in qeth_l3_del_vipa()
827 QETH_CARD_TEXT(card, 2, "delvipa6"); in qeth_l3_del_vipa()
834 if (!qeth_l3_delete_ip(card, ipaddr)) in qeth_l3_del_vipa()
836 qeth_l3_set_ip_addr_list(card); in qeth_l3_del_vipa()
842 int qeth_l3_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto, in qeth_l3_add_rxip() argument
852 QETH_CARD_TEXT(card, 2, "addrxip4"); in qeth_l3_add_rxip()
856 QETH_CARD_TEXT(card, 2, "addrxip6"); in qeth_l3_add_rxip()
865 spin_lock_irqsave(&card->ip_lock, flags); in qeth_l3_add_rxip()
866 if (qeth_l3_address_exists_in_list(&card->ip_list, ipaddr, 0) || in qeth_l3_add_rxip()
867 qeth_l3_address_exists_in_list(card->ip_tbd_list, ipaddr, 0)) in qeth_l3_add_rxip()
869 spin_unlock_irqrestore(&card->ip_lock, flags); in qeth_l3_add_rxip()
874 if (!qeth_l3_add_ip(card, ipaddr)) in qeth_l3_add_rxip()
876 qeth_l3_set_ip_addr_list(card); in qeth_l3_add_rxip()
880 void qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto, in qeth_l3_del_rxip() argument
888 QETH_CARD_TEXT(card, 2, "addrxip4"); in qeth_l3_del_rxip()
892 QETH_CARD_TEXT(card, 2, "addrxip6"); in qeth_l3_del_rxip()
899 if (!qeth_l3_delete_ip(card, ipaddr)) in qeth_l3_del_rxip()
901 qeth_l3_set_ip_addr_list(card); in qeth_l3_del_rxip()
904 static int qeth_l3_register_addr_entry(struct qeth_card *card, in qeth_l3_register_addr_entry() argument
912 QETH_CARD_TEXT(card, 2, "setaddr4"); in qeth_l3_register_addr_entry()
913 QETH_CARD_HEX(card, 3, &addr->u.a4.addr, sizeof(int)); in qeth_l3_register_addr_entry()
915 QETH_CARD_TEXT(card, 2, "setaddr6"); in qeth_l3_register_addr_entry()
916 QETH_CARD_HEX(card, 3, &addr->u.a6.addr, 8); in qeth_l3_register_addr_entry()
917 QETH_CARD_HEX(card, 3, ((char *)&addr->u.a6.addr) + 8, 8); in qeth_l3_register_addr_entry()
919 QETH_CARD_TEXT(card, 2, "setaddr?"); in qeth_l3_register_addr_entry()
920 QETH_CARD_HEX(card, 3, addr, sizeof(struct qeth_ipaddr)); in qeth_l3_register_addr_entry()
924 rc = qeth_l3_send_setdelmc(card, addr, IPA_CMD_SETIPM); in qeth_l3_register_addr_entry()
926 rc = qeth_l3_send_setdelip(card, addr, IPA_CMD_SETIP, in qeth_l3_register_addr_entry()
929 QETH_CARD_TEXT(card, 2, "failed"); in qeth_l3_register_addr_entry()
932 QETH_CARD_TEXT(card, 2, "FAILED"); in qeth_l3_register_addr_entry()
934 dev_warn(&card->gdev->dev, in qeth_l3_register_addr_entry()
940 static int qeth_l3_deregister_addr_entry(struct qeth_card *card, in qeth_l3_deregister_addr_entry() argument
946 QETH_CARD_TEXT(card, 2, "deladdr4"); in qeth_l3_deregister_addr_entry()
947 QETH_CARD_HEX(card, 3, &addr->u.a4.addr, sizeof(int)); in qeth_l3_deregister_addr_entry()
949 QETH_CARD_TEXT(card, 2, "deladdr6"); in qeth_l3_deregister_addr_entry()
950 QETH_CARD_HEX(card, 3, &addr->u.a6.addr, 8); in qeth_l3_deregister_addr_entry()
951 QETH_CARD_HEX(card, 3, ((char *)&addr->u.a6.addr) + 8, 8); in qeth_l3_deregister_addr_entry()
953 QETH_CARD_TEXT(card, 2, "deladdr?"); in qeth_l3_deregister_addr_entry()
954 QETH_CARD_HEX(card, 3, addr, sizeof(struct qeth_ipaddr)); in qeth_l3_deregister_addr_entry()
957 rc = qeth_l3_send_setdelmc(card, addr, IPA_CMD_DELIPM); in qeth_l3_deregister_addr_entry()
959 rc = qeth_l3_send_setdelip(card, addr, IPA_CMD_DELIP, in qeth_l3_deregister_addr_entry()
962 QETH_CARD_TEXT(card, 2, "failed"); in qeth_l3_deregister_addr_entry()
988 static int qeth_l3_setadapter_parms(struct qeth_card *card) in qeth_l3_setadapter_parms() argument
994 if (!qeth_is_supported(card, IPA_SETADAPTERPARMS)) { in qeth_l3_setadapter_parms()
995 dev_info(&card->gdev->dev, in qeth_l3_setadapter_parms()
1000 rc = qeth_query_setadapterparms(card); in qeth_l3_setadapter_parms()
1003 "0x%x\n", dev_name(&card->gdev->dev), rc); in qeth_l3_setadapter_parms()
1006 if (qeth_adp_supported(card, IPA_SETADP_ALTER_MAC_ADDRESS)) { in qeth_l3_setadapter_parms()
1007 rc = qeth_setadpparms_change_macaddr(card); in qeth_l3_setadapter_parms()
1009 dev_warn(&card->gdev->dev, "Reading the adapter MAC" in qeth_l3_setadapter_parms()
1016 static int qeth_l3_default_setassparms_cb(struct qeth_card *card, in qeth_l3_default_setassparms_cb() argument
1021 QETH_CARD_TEXT(card, 4, "defadpcb"); in qeth_l3_default_setassparms_cb()
1027 card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled; in qeth_l3_default_setassparms_cb()
1029 card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled; in qeth_l3_default_setassparms_cb()
1033 card->info.csum_mask = cmd->data.setassparms.data.flags_32bit; in qeth_l3_default_setassparms_cb()
1034 QETH_CARD_TEXT_(card, 3, "csum:%d", card->info.csum_mask); in qeth_l3_default_setassparms_cb()
1038 card->info.tx_csum_mask = in qeth_l3_default_setassparms_cb()
1040 QETH_CARD_TEXT_(card, 3, "tcsu:%d", card->info.tx_csum_mask); in qeth_l3_default_setassparms_cb()
1047 struct qeth_card *card, enum qeth_ipa_funcs ipa_func, __u16 cmd_code, in qeth_l3_get_setassparms_cmd() argument
1053 QETH_CARD_TEXT(card, 4, "getasscm"); in qeth_l3_get_setassparms_cmd()
1054 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETASSPARMS, prot); in qeth_l3_get_setassparms_cmd()
1069 static int qeth_l3_send_simple_setassparms_ipv6(struct qeth_card *card, in qeth_l3_send_simple_setassparms_ipv6() argument
1075 QETH_CARD_TEXT(card, 4, "simassp6"); in qeth_l3_send_simple_setassparms_ipv6()
1076 iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code, in qeth_l3_send_simple_setassparms_ipv6()
1080 rc = qeth_send_setassparms(card, iob, 0, 0, in qeth_l3_send_simple_setassparms_ipv6()
1086 static int qeth_l3_start_ipa_arp_processing(struct qeth_card *card) in qeth_l3_start_ipa_arp_processing() argument
1090 QETH_CARD_TEXT(card, 3, "ipaarp"); in qeth_l3_start_ipa_arp_processing()
1092 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { in qeth_l3_start_ipa_arp_processing()
1093 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_arp_processing()
1095 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_arp_processing()
1098 rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING, in qeth_l3_start_ipa_arp_processing()
1101 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_arp_processing()
1103 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_arp_processing()
1108 static int qeth_l3_start_ipa_ip_fragmentation(struct qeth_card *card) in qeth_l3_start_ipa_ip_fragmentation() argument
1112 QETH_CARD_TEXT(card, 3, "ipaipfrg"); in qeth_l3_start_ipa_ip_fragmentation()
1114 if (!qeth_is_supported(card, IPA_IP_FRAGMENTATION)) { in qeth_l3_start_ipa_ip_fragmentation()
1115 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_ip_fragmentation()
1117 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_ip_fragmentation()
1121 rc = qeth_send_simple_setassparms(card, IPA_IP_FRAGMENTATION, in qeth_l3_start_ipa_ip_fragmentation()
1124 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_ip_fragmentation()
1126 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_ip_fragmentation()
1128 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_ip_fragmentation()
1133 static int qeth_l3_start_ipa_source_mac(struct qeth_card *card) in qeth_l3_start_ipa_source_mac() argument
1137 QETH_CARD_TEXT(card, 3, "stsrcmac"); in qeth_l3_start_ipa_source_mac()
1139 if (!qeth_is_supported(card, IPA_SOURCE_MAC)) { in qeth_l3_start_ipa_source_mac()
1140 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_source_mac()
1142 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_source_mac()
1146 rc = qeth_send_simple_setassparms(card, IPA_SOURCE_MAC, in qeth_l3_start_ipa_source_mac()
1149 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_source_mac()
1151 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_source_mac()
1155 static int qeth_l3_start_ipa_vlan(struct qeth_card *card) in qeth_l3_start_ipa_vlan() argument
1159 QETH_CARD_TEXT(card, 3, "strtvlan"); in qeth_l3_start_ipa_vlan()
1161 if (!qeth_is_supported(card, IPA_FULL_VLAN)) { in qeth_l3_start_ipa_vlan()
1162 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_vlan()
1163 "VLAN not supported on %s\n", QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_vlan()
1167 rc = qeth_send_simple_setassparms(card, IPA_VLAN_PRIO, in qeth_l3_start_ipa_vlan()
1170 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_vlan()
1172 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_vlan()
1174 dev_info(&card->gdev->dev, "VLAN enabled\n"); in qeth_l3_start_ipa_vlan()
1179 static int qeth_l3_start_ipa_multicast(struct qeth_card *card) in qeth_l3_start_ipa_multicast() argument
1183 QETH_CARD_TEXT(card, 3, "stmcast"); in qeth_l3_start_ipa_multicast()
1185 if (!qeth_is_supported(card, IPA_MULTICASTING)) { in qeth_l3_start_ipa_multicast()
1186 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_multicast()
1188 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_multicast()
1192 rc = qeth_send_simple_setassparms(card, IPA_MULTICASTING, in qeth_l3_start_ipa_multicast()
1195 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_multicast()
1197 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_multicast()
1199 dev_info(&card->gdev->dev, "Multicast enabled\n"); in qeth_l3_start_ipa_multicast()
1200 card->dev->flags |= IFF_MULTICAST; in qeth_l3_start_ipa_multicast()
1206 static int qeth_l3_softsetup_ipv6(struct qeth_card *card) in qeth_l3_softsetup_ipv6() argument
1210 QETH_CARD_TEXT(card, 3, "softipv6"); in qeth_l3_softsetup_ipv6()
1212 if (card->info.type == QETH_CARD_TYPE_IQD) in qeth_l3_softsetup_ipv6()
1215 rc = qeth_query_ipassists(card, QETH_PROT_IPV6); in qeth_l3_softsetup_ipv6()
1217 dev_err(&card->gdev->dev, in qeth_l3_softsetup_ipv6()
1219 QETH_CARD_IFNAME(card)); in qeth_l3_softsetup_ipv6()
1222 rc = qeth_send_simple_setassparms(card, IPA_IPV6, in qeth_l3_softsetup_ipv6()
1225 dev_err(&card->gdev->dev, in qeth_l3_softsetup_ipv6()
1227 QETH_CARD_IFNAME(card)); in qeth_l3_softsetup_ipv6()
1230 rc = qeth_l3_send_simple_setassparms_ipv6(card, IPA_IPV6, in qeth_l3_softsetup_ipv6()
1233 dev_err(&card->gdev->dev, in qeth_l3_softsetup_ipv6()
1235 QETH_CARD_IFNAME(card)); in qeth_l3_softsetup_ipv6()
1238 rc = qeth_l3_send_simple_setassparms_ipv6(card, IPA_PASSTHRU, in qeth_l3_softsetup_ipv6()
1241 dev_warn(&card->gdev->dev, in qeth_l3_softsetup_ipv6()
1243 QETH_CARD_IFNAME(card)); in qeth_l3_softsetup_ipv6()
1247 dev_info(&card->gdev->dev, "IPV6 enabled\n"); in qeth_l3_softsetup_ipv6()
1252 static int qeth_l3_start_ipa_ipv6(struct qeth_card *card) in qeth_l3_start_ipa_ipv6() argument
1256 QETH_CARD_TEXT(card, 3, "strtipv6"); in qeth_l3_start_ipa_ipv6()
1258 if (!qeth_is_supported(card, IPA_IPV6)) { in qeth_l3_start_ipa_ipv6()
1259 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_ipv6()
1260 "IPv6 not supported on %s\n", QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_ipv6()
1264 rc = qeth_l3_softsetup_ipv6(card); in qeth_l3_start_ipa_ipv6()
1269 static int qeth_l3_start_ipa_broadcast(struct qeth_card *card) in qeth_l3_start_ipa_broadcast() argument
1273 QETH_CARD_TEXT(card, 3, "stbrdcst"); in qeth_l3_start_ipa_broadcast()
1274 card->info.broadcast_capable = 0; in qeth_l3_start_ipa_broadcast()
1275 if (!qeth_is_supported(card, IPA_FILTERING)) { in qeth_l3_start_ipa_broadcast()
1276 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_broadcast()
1278 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_broadcast()
1282 rc = qeth_send_simple_setassparms(card, IPA_FILTERING, in qeth_l3_start_ipa_broadcast()
1285 dev_warn(&card->gdev->dev, "Enabling broadcast filtering for " in qeth_l3_start_ipa_broadcast()
1286 "%s failed\n", QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_broadcast()
1290 rc = qeth_send_simple_setassparms(card, IPA_FILTERING, in qeth_l3_start_ipa_broadcast()
1293 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_broadcast()
1295 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_broadcast()
1298 card->info.broadcast_capable = QETH_BROADCAST_WITH_ECHO; in qeth_l3_start_ipa_broadcast()
1299 dev_info(&card->gdev->dev, "Broadcast enabled\n"); in qeth_l3_start_ipa_broadcast()
1300 rc = qeth_send_simple_setassparms(card, IPA_FILTERING, in qeth_l3_start_ipa_broadcast()
1303 dev_warn(&card->gdev->dev, "Setting up broadcast echo " in qeth_l3_start_ipa_broadcast()
1304 "filtering for %s failed\n", QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_broadcast()
1307 card->info.broadcast_capable = QETH_BROADCAST_WITHOUT_ECHO; in qeth_l3_start_ipa_broadcast()
1309 if (card->info.broadcast_capable) in qeth_l3_start_ipa_broadcast()
1310 card->dev->flags |= IFF_BROADCAST; in qeth_l3_start_ipa_broadcast()
1312 card->dev->flags &= ~IFF_BROADCAST; in qeth_l3_start_ipa_broadcast()
1316 static void qeth_l3_start_ipa_checksum(struct qeth_card *card) in qeth_l3_start_ipa_checksum() argument
1318 QETH_CARD_TEXT(card, 3, "strtcsum"); in qeth_l3_start_ipa_checksum()
1319 if (qeth_is_supported(card, IPA_INBOUND_CHECKSUM) in qeth_l3_start_ipa_checksum()
1320 && (card->dev->features & NETIF_F_RXCSUM)) in qeth_l3_start_ipa_checksum()
1321 qeth_set_rx_csum(card, 1); in qeth_l3_start_ipa_checksum()
1324 static void qeth_l3_start_ipa_tx_checksum(struct qeth_card *card) in qeth_l3_start_ipa_tx_checksum() argument
1326 QETH_CARD_TEXT(card, 3, "strttxcs"); in qeth_l3_start_ipa_tx_checksum()
1327 qeth_start_ipa_tx_checksum(card); in qeth_l3_start_ipa_tx_checksum()
1330 static int qeth_l3_start_ipa_tso(struct qeth_card *card) in qeth_l3_start_ipa_tso() argument
1334 QETH_CARD_TEXT(card, 3, "sttso"); in qeth_l3_start_ipa_tso()
1336 if (!qeth_is_supported(card, IPA_OUTBOUND_TSO)) { in qeth_l3_start_ipa_tso()
1337 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_tso()
1339 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_tso()
1342 rc = qeth_send_simple_setassparms(card, IPA_OUTBOUND_TSO, in qeth_l3_start_ipa_tso()
1345 dev_warn(&card->gdev->dev, "Starting outbound TCP " in qeth_l3_start_ipa_tso()
1347 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_tso()
1349 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_tso()
1353 card->dev->features &= ~NETIF_F_TSO; in qeth_l3_start_ipa_tso()
1357 static int qeth_l3_start_ipassists(struct qeth_card *card) in qeth_l3_start_ipassists() argument
1359 QETH_CARD_TEXT(card, 3, "strtipas"); in qeth_l3_start_ipassists()
1361 if (qeth_set_access_ctrl_online(card, 0)) in qeth_l3_start_ipassists()
1363 qeth_l3_start_ipa_arp_processing(card); /* go on*/ in qeth_l3_start_ipassists()
1364 qeth_l3_start_ipa_ip_fragmentation(card); /* go on*/ in qeth_l3_start_ipassists()
1365 qeth_l3_start_ipa_source_mac(card); /* go on*/ in qeth_l3_start_ipassists()
1366 qeth_l3_start_ipa_vlan(card); /* go on*/ in qeth_l3_start_ipassists()
1367 qeth_l3_start_ipa_multicast(card); /* go on*/ in qeth_l3_start_ipassists()
1368 qeth_l3_start_ipa_ipv6(card); /* go on*/ in qeth_l3_start_ipassists()
1369 qeth_l3_start_ipa_broadcast(card); /* go on*/ in qeth_l3_start_ipassists()
1370 qeth_l3_start_ipa_checksum(card); /* go on*/ in qeth_l3_start_ipassists()
1371 qeth_l3_start_ipa_tx_checksum(card); in qeth_l3_start_ipassists()
1372 qeth_l3_start_ipa_tso(card); /* go on*/ in qeth_l3_start_ipassists()
1376 static int qeth_l3_iqd_read_initial_mac_cb(struct qeth_card *card, in qeth_l3_iqd_read_initial_mac_cb() argument
1383 memcpy(card->dev->dev_addr, in qeth_l3_iqd_read_initial_mac_cb()
1386 eth_random_addr(card->dev->dev_addr); in qeth_l3_iqd_read_initial_mac_cb()
1391 static int qeth_l3_iqd_read_initial_mac(struct qeth_card *card) in qeth_l3_iqd_read_initial_mac() argument
1399 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, in qeth_l3_iqd_read_initial_mac()
1405 card->info.unique_id; in qeth_l3_iqd_read_initial_mac()
1407 rc = qeth_send_ipa_cmd(card, iob, qeth_l3_iqd_read_initial_mac_cb, in qeth_l3_iqd_read_initial_mac()
1412 static int qeth_l3_get_unique_id_cb(struct qeth_card *card, in qeth_l3_get_unique_id_cb() argument
1419 card->info.unique_id = *((__u16 *) in qeth_l3_get_unique_id_cb()
1422 card->info.unique_id = UNIQUE_ID_IF_CREATE_ADDR_FAILED | in qeth_l3_get_unique_id_cb()
1424 dev_warn(&card->gdev->dev, "The network adapter failed to " in qeth_l3_get_unique_id_cb()
1430 static int qeth_l3_get_unique_id(struct qeth_card *card) in qeth_l3_get_unique_id() argument
1438 if (!qeth_is_supported(card, IPA_IPV6)) { in qeth_l3_get_unique_id()
1439 card->info.unique_id = UNIQUE_ID_IF_CREATE_ADDR_FAILED | in qeth_l3_get_unique_id()
1444 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, in qeth_l3_get_unique_id()
1450 card->info.unique_id; in qeth_l3_get_unique_id()
1452 rc = qeth_send_ipa_cmd(card, iob, qeth_l3_get_unique_id_cb, NULL); in qeth_l3_get_unique_id()
1457 qeth_diags_trace_cb(struct qeth_card *card, struct qeth_reply *reply, in qeth_diags_trace_cb() argument
1468 QETH_CARD_TEXT_(card, 2, "dxter%x", rc); in qeth_diags_trace_cb()
1476 card->info.promisc_mode = SET_PROMISC_MODE_OFF; in qeth_diags_trace_cb()
1477 dev_info(&card->gdev->dev, "The HiperSockets network " in qeth_diags_trace_cb()
1487 card->info.promisc_mode = SET_PROMISC_MODE_ON; in qeth_diags_trace_cb()
1488 dev_info(&card->gdev->dev, "The HiperSockets network " in qeth_diags_trace_cb()
1492 dev_warn(&card->gdev->dev, "The device is not " in qeth_diags_trace_cb()
1497 dev_warn(&card->gdev->dev, "A HiperSockets " in qeth_diags_trace_cb()
1507 cmd->data.diagass.action, QETH_CARD_IFNAME(card)); in qeth_diags_trace_cb()
1514 qeth_diags_trace(struct qeth_card *card, enum qeth_diags_trace_cmds diags_cmd) in qeth_diags_trace() argument
1521 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0); in qeth_diags_trace()
1529 return qeth_send_ipa_cmd(card, iob, qeth_diags_trace_cb, NULL); in qeth_diags_trace()
1538 static void qeth_l3_add_mc(struct qeth_card *card, struct in_device *in4_dev) in qeth_l3_add_mc() argument
1544 QETH_CARD_TEXT(card, 4, "addmc"); in qeth_l3_add_mc()
1554 if (!qeth_l3_add_ip(card, ipm)) in qeth_l3_add_mc()
1560 static void qeth_l3_add_vlan_mc(struct qeth_card *card) in qeth_l3_add_vlan_mc() argument
1565 QETH_CARD_TEXT(card, 4, "addmcvl"); in qeth_l3_add_vlan_mc()
1566 if (!qeth_is_supported(card, IPA_FULL_VLAN)) in qeth_l3_add_vlan_mc()
1569 for_each_set_bit(vid, card->active_vlans, VLAN_N_VID) { in qeth_l3_add_vlan_mc()
1572 netdev = __vlan_find_dev_deep_rcu(card->dev, htons(ETH_P_8021Q), in qeth_l3_add_vlan_mc()
1580 qeth_l3_add_mc(card, in_dev); in qeth_l3_add_vlan_mc()
1584 static void qeth_l3_add_multicast_ipv4(struct qeth_card *card) in qeth_l3_add_multicast_ipv4() argument
1588 QETH_CARD_TEXT(card, 4, "chkmcv4"); in qeth_l3_add_multicast_ipv4()
1590 in4_dev = __in_dev_get_rcu(card->dev); in qeth_l3_add_multicast_ipv4()
1593 qeth_l3_add_mc(card, in4_dev); in qeth_l3_add_multicast_ipv4()
1594 qeth_l3_add_vlan_mc(card); in qeth_l3_add_multicast_ipv4()
1600 static void qeth_l3_add_mc6(struct qeth_card *card, struct inet6_dev *in6_dev) in qeth_l3_add_mc6() argument
1606 QETH_CARD_TEXT(card, 4, "addmc6"); in qeth_l3_add_mc6()
1616 if (!qeth_l3_add_ip(card, ipm)) in qeth_l3_add_mc6()
1622 static void qeth_l3_add_vlan_mc6(struct qeth_card *card) in qeth_l3_add_vlan_mc6() argument
1627 QETH_CARD_TEXT(card, 4, "admc6vl"); in qeth_l3_add_vlan_mc6()
1628 if (!qeth_is_supported(card, IPA_FULL_VLAN)) in qeth_l3_add_vlan_mc6()
1631 for_each_set_bit(vid, card->active_vlans, VLAN_N_VID) { in qeth_l3_add_vlan_mc6()
1634 netdev = __vlan_find_dev_deep_rcu(card->dev, htons(ETH_P_8021Q), in qeth_l3_add_vlan_mc6()
1643 qeth_l3_add_mc6(card, in_dev); in qeth_l3_add_vlan_mc6()
1649 static void qeth_l3_add_multicast_ipv6(struct qeth_card *card) in qeth_l3_add_multicast_ipv6() argument
1653 QETH_CARD_TEXT(card, 4, "chkmcv6"); in qeth_l3_add_multicast_ipv6()
1654 if (!qeth_is_supported(card, IPA_IPV6)) in qeth_l3_add_multicast_ipv6()
1656 in6_dev = in6_dev_get(card->dev); in qeth_l3_add_multicast_ipv6()
1661 qeth_l3_add_mc6(card, in6_dev); in qeth_l3_add_multicast_ipv6()
1662 qeth_l3_add_vlan_mc6(card); in qeth_l3_add_multicast_ipv6()
1669 static void qeth_l3_free_vlan_addresses4(struct qeth_card *card, in qeth_l3_free_vlan_addresses4() argument
1677 QETH_CARD_TEXT(card, 4, "frvaddr4"); in qeth_l3_free_vlan_addresses4()
1679 netdev = __vlan_find_dev_deep_rcu(card->dev, htons(ETH_P_8021Q), vid); in qeth_l3_free_vlan_addresses4()
1691 if (!qeth_l3_delete_ip(card, addr)) in qeth_l3_free_vlan_addresses4()
1698 static void qeth_l3_free_vlan_addresses6(struct qeth_card *card, in qeth_l3_free_vlan_addresses6() argument
1707 QETH_CARD_TEXT(card, 4, "frvaddr6"); in qeth_l3_free_vlan_addresses6()
1709 netdev = __vlan_find_dev_deep_rcu(card->dev, htons(ETH_P_8021Q), vid); in qeth_l3_free_vlan_addresses6()
1722 if (!qeth_l3_delete_ip(card, addr)) in qeth_l3_free_vlan_addresses6()
1730 static void qeth_l3_free_vlan_addresses(struct qeth_card *card, in qeth_l3_free_vlan_addresses() argument
1734 qeth_l3_free_vlan_addresses4(card, vid); in qeth_l3_free_vlan_addresses()
1735 qeth_l3_free_vlan_addresses6(card, vid); in qeth_l3_free_vlan_addresses()
1742 struct qeth_card *card = dev->ml_priv; in qeth_l3_vlan_rx_add_vid() local
1744 set_bit(vid, card->active_vlans); in qeth_l3_vlan_rx_add_vid()
1751 struct qeth_card *card = dev->ml_priv; in qeth_l3_vlan_rx_kill_vid() local
1754 QETH_CARD_TEXT_(card, 4, "kid:%d", vid); in qeth_l3_vlan_rx_kill_vid()
1755 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { in qeth_l3_vlan_rx_kill_vid()
1756 QETH_CARD_TEXT(card, 3, "kidREC"); in qeth_l3_vlan_rx_kill_vid()
1759 spin_lock_irqsave(&card->vlanlock, flags); in qeth_l3_vlan_rx_kill_vid()
1761 qeth_l3_free_vlan_addresses(card, vid); in qeth_l3_vlan_rx_kill_vid()
1762 clear_bit(vid, card->active_vlans); in qeth_l3_vlan_rx_kill_vid()
1763 spin_unlock_irqrestore(&card->vlanlock, flags); in qeth_l3_vlan_rx_kill_vid()
1764 qeth_l3_set_multicast_list(card->dev); in qeth_l3_vlan_rx_kill_vid()
1768 static inline int qeth_l3_rebuild_skb(struct qeth_card *card, in qeth_l3_rebuild_skb() argument
1787 tg_addr, card->dev, 0); in qeth_l3_rebuild_skb()
1795 memcpy(tg_addr, card->dev->broadcast, in qeth_l3_rebuild_skb()
1796 card->dev->addr_len); in qeth_l3_rebuild_skb()
1798 card->stats.multicast++; in qeth_l3_rebuild_skb()
1802 memcpy(tg_addr, card->dev->broadcast, in qeth_l3_rebuild_skb()
1803 card->dev->addr_len); in qeth_l3_rebuild_skb()
1804 card->stats.multicast++; in qeth_l3_rebuild_skb()
1811 if (card->options.sniffer) in qeth_l3_rebuild_skb()
1815 memcpy(tg_addr, card->dev->dev_addr, in qeth_l3_rebuild_skb()
1816 card->dev->addr_len); in qeth_l3_rebuild_skb()
1819 card->dev->header_ops->create(skb, card->dev, prot, in qeth_l3_rebuild_skb()
1821 card->dev->addr_len); in qeth_l3_rebuild_skb()
1823 card->dev->header_ops->create(skb, card->dev, prot, in qeth_l3_rebuild_skb()
1824 tg_addr, "FAKELL", card->dev->addr_len); in qeth_l3_rebuild_skb()
1827 skb->protocol = eth_type_trans(skb, card->dev); in qeth_l3_rebuild_skb()
1836 if (card->dev->features & NETIF_F_RXCSUM) { in qeth_l3_rebuild_skb()
1850 static int qeth_l3_process_inbound_buffer(struct qeth_card *card, in qeth_l3_process_inbound_buffer() argument
1864 skb = qeth_core_get_next_skb(card, in qeth_l3_process_inbound_buffer()
1865 &card->qdio.in_q->bufs[card->rx.b_index], in qeth_l3_process_inbound_buffer()
1866 &card->rx.b_element, &card->rx.e_offset, &hdr); in qeth_l3_process_inbound_buffer()
1871 skb->dev = card->dev; in qeth_l3_process_inbound_buffer()
1875 if ((card->info.type == QETH_CARD_TYPE_IQD) && in qeth_l3_process_inbound_buffer()
1880 skb->dev = card->dev; in qeth_l3_process_inbound_buffer()
1882 card->dev->header_ops->create(skb, card->dev, 0, in qeth_l3_process_inbound_buffer()
1883 card->dev->dev_addr, "FAKELL", in qeth_l3_process_inbound_buffer()
1884 card->dev->addr_len); in qeth_l3_process_inbound_buffer()
1887 is_vlan = qeth_l3_rebuild_skb(card, skb, hdr, in qeth_l3_process_inbound_buffer()
1890 if (is_vlan && !card->options.sniffer) in qeth_l3_process_inbound_buffer()
1893 napi_gro_receive(&card->napi, skb); in qeth_l3_process_inbound_buffer()
1904 QETH_CARD_TEXT(card, 3, "inbunkno"); in qeth_l3_process_inbound_buffer()
1910 card->stats.rx_packets++; in qeth_l3_process_inbound_buffer()
1911 card->stats.rx_bytes += len; in qeth_l3_process_inbound_buffer()
1918 struct qeth_card *card = container_of(napi, struct qeth_card, napi); in qeth_l3_poll() local
1924 if (card->options.performance_stats) { in qeth_l3_poll()
1925 card->perf_stats.inbound_cnt++; in qeth_l3_poll()
1926 card->perf_stats.inbound_start_time = qeth_get_micros(); in qeth_l3_poll()
1930 if (!card->rx.b_count) { in qeth_l3_poll()
1931 card->rx.qdio_err = 0; in qeth_l3_poll()
1932 card->rx.b_count = qdio_get_next_buffers( in qeth_l3_poll()
1933 card->data.ccwdev, 0, &card->rx.b_index, in qeth_l3_poll()
1934 &card->rx.qdio_err); in qeth_l3_poll()
1935 if (card->rx.b_count <= 0) { in qeth_l3_poll()
1936 card->rx.b_count = 0; in qeth_l3_poll()
1939 card->rx.b_element = in qeth_l3_poll()
1940 &card->qdio.in_q->bufs[card->rx.b_index] in qeth_l3_poll()
1942 card->rx.e_offset = 0; in qeth_l3_poll()
1945 while (card->rx.b_count) { in qeth_l3_poll()
1946 buffer = &card->qdio.in_q->bufs[card->rx.b_index]; in qeth_l3_poll()
1947 if (!(card->rx.qdio_err && in qeth_l3_poll()
1948 qeth_check_qdio_errors(card, buffer->buffer, in qeth_l3_poll()
1949 card->rx.qdio_err, "qinerr"))) in qeth_l3_poll()
1951 card, new_budget, &done); in qeth_l3_poll()
1956 if (card->options.performance_stats) in qeth_l3_poll()
1957 card->perf_stats.bufs_rec++; in qeth_l3_poll()
1958 qeth_put_buffer_pool_entry(card, in qeth_l3_poll()
1960 qeth_queue_input_buffer(card, card->rx.b_index); in qeth_l3_poll()
1961 card->rx.b_count--; in qeth_l3_poll()
1962 if (card->rx.b_count) { in qeth_l3_poll()
1963 card->rx.b_index = in qeth_l3_poll()
1964 (card->rx.b_index + 1) % in qeth_l3_poll()
1966 card->rx.b_element = in qeth_l3_poll()
1967 &card->qdio.in_q in qeth_l3_poll()
1968 ->bufs[card->rx.b_index] in qeth_l3_poll()
1970 card->rx.e_offset = 0; in qeth_l3_poll()
1982 if (qdio_start_irq(card->data.ccwdev, 0)) in qeth_l3_poll()
1983 napi_schedule(&card->napi); in qeth_l3_poll()
1985 if (card->options.performance_stats) in qeth_l3_poll()
1986 card->perf_stats.inbound_time += qeth_get_micros() - in qeth_l3_poll()
1987 card->perf_stats.inbound_start_time; in qeth_l3_poll()
1992 struct qeth_card *card) in qeth_l3_verify_vlan_dev() argument
1997 for_each_set_bit(vid, card->active_vlans, VLAN_N_VID) { in qeth_l3_verify_vlan_dev()
2001 netdev = __vlan_find_dev_deep_rcu(card->dev, htons(ETH_P_8021Q), in qeth_l3_verify_vlan_dev()
2010 if (rc && !(vlan_dev_real_dev(dev)->ml_priv == (void *)card)) in qeth_l3_verify_vlan_dev()
2018 struct qeth_card *card; in qeth_l3_verify_dev() local
2023 list_for_each_entry(card, &qeth_core_card_list.list, list) { in qeth_l3_verify_dev()
2024 if (card->dev == dev) { in qeth_l3_verify_dev()
2028 rc = qeth_l3_verify_vlan_dev(dev, card); in qeth_l3_verify_dev()
2039 struct qeth_card *card = NULL; in qeth_l3_get_card_from_dev() local
2044 card = dev->ml_priv; in qeth_l3_get_card_from_dev()
2046 card = vlan_dev_real_dev(dev)->ml_priv; in qeth_l3_get_card_from_dev()
2047 if (card && card->options.layer2) in qeth_l3_get_card_from_dev()
2048 card = NULL; in qeth_l3_get_card_from_dev()
2049 if (card) in qeth_l3_get_card_from_dev()
2050 QETH_CARD_TEXT_(card, 4, "%d", rc); in qeth_l3_get_card_from_dev()
2051 return card ; in qeth_l3_get_card_from_dev()
2054 static void qeth_l3_stop_card(struct qeth_card *card, int recovery_mode) in qeth_l3_stop_card() argument
2057 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); in qeth_l3_stop_card()
2059 qeth_set_allowed_threads(card, 0, 1); in qeth_l3_stop_card()
2060 if (card->options.sniffer && in qeth_l3_stop_card()
2061 (card->info.promisc_mode == SET_PROMISC_MODE_ON)) in qeth_l3_stop_card()
2062 qeth_diags_trace(card, QETH_DIAGS_CMD_TRACE_DISABLE); in qeth_l3_stop_card()
2063 if (card->read.state == CH_STATE_UP && in qeth_l3_stop_card()
2064 card->write.state == CH_STATE_UP && in qeth_l3_stop_card()
2065 (card->state == CARD_STATE_UP)) { in qeth_l3_stop_card()
2067 qeth_l3_stop(card->dev); in qeth_l3_stop_card()
2070 dev_close(card->dev); in qeth_l3_stop_card()
2073 card->state = CARD_STATE_SOFTSETUP; in qeth_l3_stop_card()
2075 if (card->state == CARD_STATE_SOFTSETUP) { in qeth_l3_stop_card()
2076 qeth_l3_clear_ip_list(card, 1); in qeth_l3_stop_card()
2077 qeth_clear_ipacmd_list(card); in qeth_l3_stop_card()
2078 card->state = CARD_STATE_HARDSETUP; in qeth_l3_stop_card()
2080 if (card->state == CARD_STATE_HARDSETUP) { in qeth_l3_stop_card()
2081 qeth_qdio_clear_card(card, 0); in qeth_l3_stop_card()
2082 qeth_clear_qdio_buffers(card); in qeth_l3_stop_card()
2083 qeth_clear_working_pool_list(card); in qeth_l3_stop_card()
2084 card->state = CARD_STATE_DOWN; in qeth_l3_stop_card()
2086 if (card->state == CARD_STATE_DOWN) { in qeth_l3_stop_card()
2087 qeth_clear_cmd_buffers(&card->read); in qeth_l3_stop_card()
2088 qeth_clear_cmd_buffers(&card->write); in qeth_l3_stop_card()
2097 qeth_l3_handle_promisc_mode(struct qeth_card *card) in qeth_l3_handle_promisc_mode() argument
2099 struct net_device *dev = card->dev; in qeth_l3_handle_promisc_mode()
2102 (card->info.promisc_mode == SET_PROMISC_MODE_ON)) || in qeth_l3_handle_promisc_mode()
2104 (card->info.promisc_mode == SET_PROMISC_MODE_OFF))) in qeth_l3_handle_promisc_mode()
2107 if (card->info.guestlan) { /* Guestlan trace */ in qeth_l3_handle_promisc_mode()
2108 if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE)) in qeth_l3_handle_promisc_mode()
2109 qeth_setadp_promisc_mode(card); in qeth_l3_handle_promisc_mode()
2110 } else if (card->options.sniffer && /* HiperSockets trace */ in qeth_l3_handle_promisc_mode()
2111 qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) { in qeth_l3_handle_promisc_mode()
2113 QETH_CARD_TEXT(card, 3, "+promisc"); in qeth_l3_handle_promisc_mode()
2114 qeth_diags_trace(card, QETH_DIAGS_CMD_TRACE_ENABLE); in qeth_l3_handle_promisc_mode()
2116 QETH_CARD_TEXT(card, 3, "-promisc"); in qeth_l3_handle_promisc_mode()
2117 qeth_diags_trace(card, QETH_DIAGS_CMD_TRACE_DISABLE); in qeth_l3_handle_promisc_mode()
2124 struct qeth_card *card = dev->ml_priv; in qeth_l3_set_multicast_list() local
2126 QETH_CARD_TEXT(card, 3, "setmulti"); in qeth_l3_set_multicast_list()
2127 if (qeth_threads_running(card, QETH_RECOVER_THREAD) && in qeth_l3_set_multicast_list()
2128 (card->state != CARD_STATE_UP)) in qeth_l3_set_multicast_list()
2130 if (!card->options.sniffer) { in qeth_l3_set_multicast_list()
2131 qeth_l3_delete_mc_addresses(card); in qeth_l3_set_multicast_list()
2132 qeth_l3_add_multicast_ipv4(card); in qeth_l3_set_multicast_list()
2134 qeth_l3_add_multicast_ipv6(card); in qeth_l3_set_multicast_list()
2136 qeth_l3_set_ip_addr_list(card); in qeth_l3_set_multicast_list()
2137 if (!qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE)) in qeth_l3_set_multicast_list()
2140 qeth_l3_handle_promisc_mode(card); in qeth_l3_set_multicast_list()
2166 static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries) in qeth_l3_arp_set_no_entries() argument
2171 QETH_CARD_TEXT(card, 3, "arpstnoe"); in qeth_l3_arp_set_no_entries()
2178 if (card->info.guestlan) in qeth_l3_arp_set_no_entries()
2180 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { in qeth_l3_arp_set_no_entries()
2183 rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING, in qeth_l3_arp_set_no_entries()
2189 "%s: %s (0x%x/%d)\n", QETH_CARD_IFNAME(card), in qeth_l3_arp_set_no_entries()
2195 static __u32 get_arp_entry_size(struct qeth_card *card, in get_arp_entry_size() argument
2204 QETH_CARD_TEXT(card, 4, "arpev4"); in get_arp_entry_size()
2213 QETH_CARD_TEXT(card, 4, "arpev6"); in get_arp_entry_size()
2224 QETH_CARD_TEXT(card, 4, "arpinv"); in get_arp_entry_size()
2237 static int qeth_l3_arp_query_cb(struct qeth_card *card, in qeth_l3_arp_query_cb() argument
2249 QETH_CARD_TEXT(card, 3, "arpquecb"); in qeth_l3_arp_query_cb()
2253 QETH_CARD_TEXT_(card, 4, "%i", cmd->hdr.prot_version); in qeth_l3_arp_query_cb()
2255 QETH_CARD_TEXT(card, 4, "arpcberr"); in qeth_l3_arp_query_cb()
2256 QETH_CARD_TEXT_(card, 4, "%i", cmd->hdr.return_code); in qeth_l3_arp_query_cb()
2261 QETH_CARD_TEXT(card, 4, "setaperr"); in qeth_l3_arp_query_cb()
2262 QETH_CARD_TEXT_(card, 4, "%i", cmd->hdr.return_code); in qeth_l3_arp_query_cb()
2266 QETH_CARD_TEXT_(card, 4, "anoen%i", qdata->no_entries); in qeth_l3_arp_query_cb()
2279 QETH_CARD_TEXT(card, 4, "pmis"); in qeth_l3_arp_query_cb()
2280 QETH_CARD_TEXT_(card, 4, "%i", etype->ip); in qeth_l3_arp_query_cb()
2283 esize = get_arp_entry_size(card, qdata, etype, in qeth_l3_arp_query_cb()
2285 QETH_CARD_TEXT_(card, 5, "esz%i", esize); in qeth_l3_arp_query_cb()
2290 QETH_CARD_TEXT_(card, 4, "qaer3%i", -ENOMEM); in qeth_l3_arp_query_cb()
2306 QETH_CARD_TEXT_(card, 4, "nove%i", qinfo->no_entries); in qeth_l3_arp_query_cb()
2313 QETH_CARD_TEXT_(card, 4, "rc%i", 0); in qeth_l3_arp_query_cb()
2321 static int qeth_l3_send_ipa_arp_cmd(struct qeth_card *card, in qeth_l3_send_ipa_arp_cmd() argument
2327 QETH_CARD_TEXT(card, 4, "sendarp"); in qeth_l3_send_ipa_arp_cmd()
2331 &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH); in qeth_l3_send_ipa_arp_cmd()
2332 return qeth_send_control_data(card, IPA_PDU_HEADER_SIZE + len, iob, in qeth_l3_send_ipa_arp_cmd()
2336 static int qeth_l3_query_arp_cache_info(struct qeth_card *card, in qeth_l3_query_arp_cache_info() argument
2345 QETH_CARD_TEXT_(card, 3, "qarpipv%i", prot); in qeth_l3_query_arp_cache_info()
2347 iob = qeth_l3_get_setassparms_cmd(card, IPA_ARP_PROCESSING, in qeth_l3_query_arp_cache_info()
2357 rc = qeth_l3_send_ipa_arp_cmd(card, iob, in qeth_l3_query_arp_cache_info()
2364 "(0x%x/%d)\n", QETH_CARD_IFNAME(card), in qeth_l3_query_arp_cache_info()
2371 static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata) in qeth_l3_arp_query() argument
2376 QETH_CARD_TEXT(card, 3, "arpquery"); in qeth_l3_arp_query()
2378 if (!qeth_is_supported(card,/*IPA_QUERY_ARP_ADDR_INFO*/ in qeth_l3_arp_query()
2380 QETH_CARD_TEXT(card, 3, "arpqnsup"); in qeth_l3_arp_query()
2395 rc = qeth_l3_query_arp_cache_info(card, QETH_PROT_IPV4, &qinfo); in qeth_l3_arp_query()
2404 qeth_l3_query_arp_cache_info(card, QETH_PROT_IPV6, in qeth_l3_arp_query()
2409 QETH_CARD_TEXT(card, 4, "qactf"); in qeth_l3_arp_query()
2413 QETH_CARD_TEXT(card, 4, "qacts"); in qeth_l3_arp_query()
2421 static int qeth_l3_arp_add_entry(struct qeth_card *card, in qeth_l3_arp_add_entry() argument
2429 QETH_CARD_TEXT(card, 3, "arpadent"); in qeth_l3_arp_add_entry()
2436 if (card->info.guestlan) in qeth_l3_arp_add_entry()
2438 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { in qeth_l3_arp_add_entry()
2442 iob = qeth_l3_get_setassparms_cmd(card, IPA_ARP_PROCESSING, in qeth_l3_arp_add_entry()
2448 rc = qeth_send_setassparms(card, iob, in qeth_l3_arp_add_entry()
2456 "on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card), in qeth_l3_arp_add_entry()
2462 static int qeth_l3_arp_remove_entry(struct qeth_card *card, in qeth_l3_arp_remove_entry() argument
2470 QETH_CARD_TEXT(card, 3, "arprment"); in qeth_l3_arp_remove_entry()
2477 if (card->info.guestlan) in qeth_l3_arp_remove_entry()
2479 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { in qeth_l3_arp_remove_entry()
2483 iob = qeth_l3_get_setassparms_cmd(card, IPA_ARP_PROCESSING, in qeth_l3_arp_remove_entry()
2489 rc = qeth_send_setassparms(card, iob, in qeth_l3_arp_remove_entry()
2497 " on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card), in qeth_l3_arp_remove_entry()
2503 static int qeth_l3_arp_flush_cache(struct qeth_card *card) in qeth_l3_arp_flush_cache() argument
2508 QETH_CARD_TEXT(card, 3, "arpflush"); in qeth_l3_arp_flush_cache()
2515 if (card->info.guestlan || (card->info.type == QETH_CARD_TYPE_IQD)) in qeth_l3_arp_flush_cache()
2517 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { in qeth_l3_arp_flush_cache()
2520 rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING, in qeth_l3_arp_flush_cache()
2525 "(0x%x/%d)\n", QETH_CARD_IFNAME(card), in qeth_l3_arp_flush_cache()
2533 struct qeth_card *card = dev->ml_priv; in qeth_l3_do_ioctl() local
2538 if (!card) in qeth_l3_do_ioctl()
2541 if (!qeth_card_hw_is_reachable(card)) in qeth_l3_do_ioctl()
2550 rc = qeth_l3_arp_set_no_entries(card, rq->ifr_ifru.ifru_ivalue); in qeth_l3_do_ioctl()
2557 rc = qeth_l3_arp_query(card, rq->ifr_ifru.ifru_data); in qeth_l3_do_ioctl()
2568 rc = qeth_l3_arp_add_entry(card, &arp_entry); in qeth_l3_do_ioctl()
2579 rc = qeth_l3_arp_remove_entry(card, &arp_entry); in qeth_l3_do_ioctl()
2586 rc = qeth_l3_arp_flush_cache(card); in qeth_l3_do_ioctl()
2589 rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data); in qeth_l3_do_ioctl()
2592 if ((card->info.type == QETH_CARD_TYPE_OSD || in qeth_l3_do_ioctl()
2593 card->info.type == QETH_CARD_TYPE_OSX) && in qeth_l3_do_ioctl()
2594 !card->info.guestlan) in qeth_l3_do_ioctl()
2612 rc = qeth_query_oat_command(card, rq->ifr_ifru.ifru_data); in qeth_l3_do_ioctl()
2618 QETH_CARD_TEXT_(card, 2, "ioce%d", rc); in qeth_l3_do_ioctl()
2622 int inline qeth_l3_get_cast_type(struct qeth_card *card, struct sk_buff *skb) in qeth_l3_get_cast_type() argument
2660 switch (card->info.link_type) { in qeth_l3_get_cast_type()
2677 static void qeth_l3_fill_af_iucv_hdr(struct qeth_card *card, in qeth_l3_fill_af_iucv_hdr() argument
2684 card->dev->header_ops->create(skb, card->dev, 0, in qeth_l3_fill_af_iucv_hdr()
2685 card->dev->dev_addr, card->dev->dev_addr, in qeth_l3_fill_af_iucv_hdr()
2686 card->dev->addr_len); in qeth_l3_fill_af_iucv_hdr()
2701 static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, in qeth_l3_fill_header() argument
2715 if ((ipv == 4) || (card->info.type == QETH_CARD_TYPE_IQD)) in qeth_l3_fill_header()
2746 if (card->info.type == QETH_CARD_TYPE_IQD) in qeth_l3_fill_header()
2764 static inline void qeth_l3_hdr_csum(struct qeth_card *card, in qeth_l3_hdr_csum() argument
2777 if (card->options.performance_stats) in qeth_l3_hdr_csum()
2778 card->perf_stats.tx_csum++; in qeth_l3_hdr_csum()
2781 static void qeth_tso_fill_header(struct qeth_card *card, in qeth_tso_fill_header() argument
2836 struct qeth_card *card = dev->ml_priv; in qeth_l3_hard_start_xmit() local
2839 int cast_type = qeth_l3_get_cast_type(card, skb); in qeth_l3_hard_start_xmit()
2841 card->qdio.out_qs[card->qdio.do_prio_queueing in qeth_l3_hard_start_xmit()
2842 || (cast_type && card->info.is_multicast_different) ? in qeth_l3_hard_start_xmit()
2843 qeth_get_priority_queue(card, skb, ipv, cast_type) : in qeth_l3_hard_start_xmit()
2844 card->qdio.default_out_queue]; in qeth_l3_hard_start_xmit()
2850 if (((card->info.type == QETH_CARD_TYPE_IQD) && in qeth_l3_hard_start_xmit()
2851 (((card->options.cq != QETH_CQ_ENABLED) && !ipv) || in qeth_l3_hard_start_xmit()
2852 ((card->options.cq == QETH_CQ_ENABLED) && in qeth_l3_hard_start_xmit()
2854 card->options.sniffer) in qeth_l3_hard_start_xmit()
2857 if ((card->state != CARD_STATE_UP) || !card->lan_online) { in qeth_l3_hard_start_xmit()
2858 card->stats.tx_carrier_errors++; in qeth_l3_hard_start_xmit()
2863 (card->info.broadcast_capable == 0)) in qeth_l3_hard_start_xmit()
2866 if (card->options.performance_stats) { in qeth_l3_hard_start_xmit()
2867 card->perf_stats.outbound_cnt++; in qeth_l3_hard_start_xmit()
2868 card->perf_stats.outbound_start_time = qeth_get_micros(); in qeth_l3_hard_start_xmit()
2873 if ((card->info.type == QETH_CARD_TYPE_IQD) && (!large_send) && in qeth_l3_hard_start_xmit()
2892 if (card->info.type == QETH_CARD_TYPE_IQD) { in qeth_l3_hard_start_xmit()
2922 if (card->options.performance_stats) in qeth_l3_hard_start_xmit()
2923 card->perf_stats.tx_lin++; in qeth_l3_hard_start_xmit()
2931 qeth_l3_fill_header(card, hdr, new_skb, ipv, cast_type); in qeth_l3_hard_start_xmit()
2932 qeth_tso_fill_header(card, hdr, new_skb); in qeth_l3_hard_start_xmit()
2938 qeth_l3_fill_header(card, hdr, new_skb, ipv, in qeth_l3_hard_start_xmit()
2942 qeth_l3_fill_af_iucv_hdr(card, hdr, new_skb); in qeth_l3_hard_start_xmit()
2944 qeth_l3_fill_header(card, hdr, new_skb, ipv, in qeth_l3_hard_start_xmit()
2951 qeth_l3_hdr_csum(card, hdr, new_skb); in qeth_l3_hard_start_xmit()
2954 elems = qeth_get_elements_no(card, new_skb, elements_needed); in qeth_l3_hard_start_xmit()
2963 if (card->info.type != QETH_CARD_TYPE_IQD) { in qeth_l3_hard_start_xmit()
2974 rc = qeth_do_send_packet(card, queue, new_skb, hdr, in qeth_l3_hard_start_xmit()
2977 rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr, in qeth_l3_hard_start_xmit()
2981 card->stats.tx_packets++; in qeth_l3_hard_start_xmit()
2982 card->stats.tx_bytes += tx_bytes; in qeth_l3_hard_start_xmit()
2985 if (card->options.performance_stats) { in qeth_l3_hard_start_xmit()
2987 card->perf_stats.large_send_bytes += tx_bytes; in qeth_l3_hard_start_xmit()
2988 card->perf_stats.large_send_cnt++; in qeth_l3_hard_start_xmit()
2991 card->perf_stats.sg_skbs_sent++; in qeth_l3_hard_start_xmit()
2993 card->perf_stats.sg_frags_sent += nr_frags + 1; in qeth_l3_hard_start_xmit()
3010 if (card->options.performance_stats) in qeth_l3_hard_start_xmit()
3011 card->perf_stats.outbound_time += qeth_get_micros() - in qeth_l3_hard_start_xmit()
3012 card->perf_stats.outbound_start_time; in qeth_l3_hard_start_xmit()
3016 card->stats.tx_dropped++; in qeth_l3_hard_start_xmit()
3017 card->stats.tx_errors++; in qeth_l3_hard_start_xmit()
3027 struct qeth_card *card = dev->ml_priv; in __qeth_l3_open() local
3030 QETH_CARD_TEXT(card, 4, "qethopen"); in __qeth_l3_open()
3031 if (card->state == CARD_STATE_UP) in __qeth_l3_open()
3033 if (card->state != CARD_STATE_SOFTSETUP) in __qeth_l3_open()
3035 card->data.state = CH_STATE_UP; in __qeth_l3_open()
3036 card->state = CARD_STATE_UP; in __qeth_l3_open()
3039 if (qdio_stop_irq(card->data.ccwdev, 0) >= 0) { in __qeth_l3_open()
3040 napi_enable(&card->napi); in __qeth_l3_open()
3041 napi_schedule(&card->napi); in __qeth_l3_open()
3049 struct qeth_card *card = dev->ml_priv; in qeth_l3_open() local
3051 QETH_CARD_TEXT(card, 5, "qethope_"); in qeth_l3_open()
3052 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { in qeth_l3_open()
3053 QETH_CARD_TEXT(card, 3, "openREC"); in qeth_l3_open()
3061 struct qeth_card *card = dev->ml_priv; in qeth_l3_stop() local
3063 QETH_CARD_TEXT(card, 4, "qethstop"); in qeth_l3_stop()
3065 if (card->state == CARD_STATE_UP) { in qeth_l3_stop()
3066 card->state = CARD_STATE_SOFTSETUP; in qeth_l3_stop()
3067 napi_disable(&card->napi); in qeth_l3_stop()
3075 struct qeth_card *card = dev->ml_priv; in qeth_l3_fix_features() local
3077 if (!qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM)) in qeth_l3_fix_features()
3079 if (!qeth_is_supported(card, IPA_OUTBOUND_TSO)) in qeth_l3_fix_features()
3081 if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM)) in qeth_l3_fix_features()
3089 struct qeth_card *card = dev->ml_priv; in qeth_l3_set_features() local
3095 if (card->state == CARD_STATE_DOWN || in qeth_l3_set_features()
3096 card->state == CARD_STATE_RECOVER) in qeth_l3_set_features()
3099 return qeth_set_rx_csum(card, features & NETIF_F_RXCSUM ? 1 : 0); in qeth_l3_set_features()
3168 static int qeth_l3_setup_netdev(struct qeth_card *card) in qeth_l3_setup_netdev() argument
3172 if (card->info.type == QETH_CARD_TYPE_OSD || in qeth_l3_setup_netdev()
3173 card->info.type == QETH_CARD_TYPE_OSX) { in qeth_l3_setup_netdev()
3174 if ((card->info.link_type == QETH_LINK_TYPE_LANE_TR) || in qeth_l3_setup_netdev()
3175 (card->info.link_type == QETH_LINK_TYPE_HSTR)) { in qeth_l3_setup_netdev()
3179 card->dev = alloc_etherdev(0); in qeth_l3_setup_netdev()
3180 if (!card->dev) in qeth_l3_setup_netdev()
3182 card->dev->netdev_ops = &qeth_l3_osa_netdev_ops; in qeth_l3_setup_netdev()
3185 qeth_l3_get_unique_id(card); in qeth_l3_setup_netdev()
3186 if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD)) in qeth_l3_setup_netdev()
3187 card->dev->dev_id = card->info.unique_id & in qeth_l3_setup_netdev()
3189 if (!card->info.guestlan) { in qeth_l3_setup_netdev()
3190 card->dev->hw_features = NETIF_F_SG | in qeth_l3_setup_netdev()
3193 card->dev->features = NETIF_F_RXCSUM; in qeth_l3_setup_netdev()
3196 } else if (card->info.type == QETH_CARD_TYPE_IQD) { in qeth_l3_setup_netdev()
3197 card->dev = alloc_netdev(0, "hsi%d", NET_NAME_UNKNOWN, in qeth_l3_setup_netdev()
3199 if (!card->dev) in qeth_l3_setup_netdev()
3201 card->dev->flags |= IFF_NOARP; in qeth_l3_setup_netdev()
3202 card->dev->netdev_ops = &qeth_l3_netdev_ops; in qeth_l3_setup_netdev()
3203 rc = qeth_l3_iqd_read_initial_mac(card); in qeth_l3_setup_netdev()
3206 if (card->options.hsuid[0]) in qeth_l3_setup_netdev()
3207 memcpy(card->dev->perm_addr, card->options.hsuid, 9); in qeth_l3_setup_netdev()
3211 card->dev->ml_priv = card; in qeth_l3_setup_netdev()
3212 card->dev->watchdog_timeo = QETH_TX_TIMEOUT; in qeth_l3_setup_netdev()
3213 card->dev->mtu = card->info.initial_mtu; in qeth_l3_setup_netdev()
3214 card->dev->ethtool_ops = &qeth_l3_ethtool_ops; in qeth_l3_setup_netdev()
3215 card->dev->features |= NETIF_F_HW_VLAN_CTAG_TX | in qeth_l3_setup_netdev()
3218 netif_keep_dst(card->dev); in qeth_l3_setup_netdev()
3219 card->dev->gso_max_size = 15 * PAGE_SIZE; in qeth_l3_setup_netdev()
3221 SET_NETDEV_DEV(card->dev, &card->gdev->dev); in qeth_l3_setup_netdev()
3222 netif_napi_add(card->dev, &card->napi, qeth_l3_poll, QETH_NAPI_WEIGHT); in qeth_l3_setup_netdev()
3223 return register_netdev(card->dev); in qeth_l3_setup_netdev()
3228 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l3_probe_device() local
3231 card->options.layer2 = 0; in qeth_l3_probe_device()
3232 card->info.hwtrap = 0; in qeth_l3_probe_device()
3238 struct qeth_card *card = dev_get_drvdata(&cgdev->dev); in qeth_l3_remove_device() local
3242 qeth_set_allowed_threads(card, 0, 1); in qeth_l3_remove_device()
3243 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); in qeth_l3_remove_device()
3248 if (card->dev) { in qeth_l3_remove_device()
3249 unregister_netdev(card->dev); in qeth_l3_remove_device()
3250 card->dev = NULL; in qeth_l3_remove_device()
3253 qeth_l3_clear_ip_list(card, 0); in qeth_l3_remove_device()
3254 qeth_l3_clear_ipato_list(card); in qeth_l3_remove_device()
3260 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in __qeth_l3_set_online() local
3264 mutex_lock(&card->discipline_mutex); in __qeth_l3_set_online()
3265 mutex_lock(&card->conf_mutex); in __qeth_l3_set_online()
3267 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); in __qeth_l3_set_online()
3269 recover_flag = card->state; in __qeth_l3_set_online()
3270 rc = qeth_core_hardsetup_card(card); in __qeth_l3_set_online()
3277 if (!card->dev && qeth_l3_setup_netdev(card)) { in __qeth_l3_set_online()
3282 if (qeth_is_diagass_supported(card, QETH_DIAGS_CMD_TRAP)) { in __qeth_l3_set_online()
3283 if (card->info.hwtrap && in __qeth_l3_set_online()
3284 qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM)) in __qeth_l3_set_online()
3285 card->info.hwtrap = 0; in __qeth_l3_set_online()
3287 card->info.hwtrap = 0; in __qeth_l3_set_online()
3289 card->state = CARD_STATE_HARDSETUP; in __qeth_l3_set_online()
3290 memset(&card->rx, 0, sizeof(struct qeth_rx)); in __qeth_l3_set_online()
3291 qeth_print_status_message(card); in __qeth_l3_set_online()
3296 rc = qeth_send_startlan(card); in __qeth_l3_set_online()
3300 dev_warn(&card->gdev->dev, in __qeth_l3_set_online()
3302 card->lan_online = 0; in __qeth_l3_set_online()
3308 card->lan_online = 1; in __qeth_l3_set_online()
3311 rc = qeth_l3_setadapter_parms(card); in __qeth_l3_set_online()
3314 if (!card->options.sniffer) { in __qeth_l3_set_online()
3315 rc = qeth_l3_start_ipassists(card); in __qeth_l3_set_online()
3320 rc = qeth_l3_setrouting_v4(card); in __qeth_l3_set_online()
3323 rc = qeth_l3_setrouting_v6(card); in __qeth_l3_set_online()
3327 netif_tx_disable(card->dev); in __qeth_l3_set_online()
3329 rc = qeth_init_qdio_queues(card); in __qeth_l3_set_online()
3335 card->state = CARD_STATE_SOFTSETUP; in __qeth_l3_set_online()
3337 qeth_set_allowed_threads(card, 0xffffffff, 0); in __qeth_l3_set_online()
3338 qeth_l3_set_ip_addr_list(card); in __qeth_l3_set_online()
3339 if (card->lan_online) in __qeth_l3_set_online()
3340 netif_carrier_on(card->dev); in __qeth_l3_set_online()
3342 netif_carrier_off(card->dev); in __qeth_l3_set_online()
3346 __qeth_l3_open(card->dev); in __qeth_l3_set_online()
3348 dev_open(card->dev); in __qeth_l3_set_online()
3349 qeth_l3_set_multicast_list(card->dev); in __qeth_l3_set_online()
3352 qeth_trace_features(card); in __qeth_l3_set_online()
3355 mutex_unlock(&card->conf_mutex); in __qeth_l3_set_online()
3356 mutex_unlock(&card->discipline_mutex); in __qeth_l3_set_online()
3359 qeth_l3_stop_card(card, 0); in __qeth_l3_set_online()
3360 ccw_device_set_offline(CARD_DDEV(card)); in __qeth_l3_set_online()
3361 ccw_device_set_offline(CARD_WDEV(card)); in __qeth_l3_set_online()
3362 ccw_device_set_offline(CARD_RDEV(card)); in __qeth_l3_set_online()
3363 qdio_free(CARD_DDEV(card)); in __qeth_l3_set_online()
3365 card->state = CARD_STATE_RECOVER; in __qeth_l3_set_online()
3367 card->state = CARD_STATE_DOWN; in __qeth_l3_set_online()
3368 mutex_unlock(&card->conf_mutex); in __qeth_l3_set_online()
3369 mutex_unlock(&card->discipline_mutex); in __qeth_l3_set_online()
3381 struct qeth_card *card = dev_get_drvdata(&cgdev->dev); in __qeth_l3_set_offline() local
3385 mutex_lock(&card->discipline_mutex); in __qeth_l3_set_offline()
3386 mutex_lock(&card->conf_mutex); in __qeth_l3_set_offline()
3388 QETH_DBF_HEX(SETUP, 3, &card, sizeof(void *)); in __qeth_l3_set_offline()
3390 if (card->dev && netif_carrier_ok(card->dev)) in __qeth_l3_set_offline()
3391 netif_carrier_off(card->dev); in __qeth_l3_set_offline()
3392 recover_flag = card->state; in __qeth_l3_set_offline()
3393 if ((!recovery_mode && card->info.hwtrap) || card->info.hwtrap == 2) { in __qeth_l3_set_offline()
3394 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); in __qeth_l3_set_offline()
3395 card->info.hwtrap = 1; in __qeth_l3_set_offline()
3397 qeth_l3_stop_card(card, recovery_mode); in __qeth_l3_set_offline()
3398 if ((card->options.cq == QETH_CQ_ENABLED) && card->dev) { in __qeth_l3_set_offline()
3400 call_netdevice_notifiers(NETDEV_REBOOT, card->dev); in __qeth_l3_set_offline()
3403 rc = ccw_device_set_offline(CARD_DDEV(card)); in __qeth_l3_set_offline()
3404 rc2 = ccw_device_set_offline(CARD_WDEV(card)); in __qeth_l3_set_offline()
3405 rc3 = ccw_device_set_offline(CARD_RDEV(card)); in __qeth_l3_set_offline()
3410 qdio_free(CARD_DDEV(card)); in __qeth_l3_set_offline()
3412 card->state = CARD_STATE_RECOVER; in __qeth_l3_set_offline()
3415 mutex_unlock(&card->conf_mutex); in __qeth_l3_set_offline()
3416 mutex_unlock(&card->discipline_mutex); in __qeth_l3_set_offline()
3427 struct qeth_card *card; in qeth_l3_recover() local
3430 card = (struct qeth_card *) ptr; in qeth_l3_recover()
3431 QETH_CARD_TEXT(card, 2, "recover1"); in qeth_l3_recover()
3432 QETH_CARD_HEX(card, 2, &card, sizeof(void *)); in qeth_l3_recover()
3433 if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD)) in qeth_l3_recover()
3435 QETH_CARD_TEXT(card, 2, "recover2"); in qeth_l3_recover()
3436 dev_warn(&card->gdev->dev, in qeth_l3_recover()
3438 qeth_set_recovery_task(card); in qeth_l3_recover()
3439 __qeth_l3_set_offline(card->gdev, 1); in qeth_l3_recover()
3440 rc = __qeth_l3_set_online(card->gdev, 1); in qeth_l3_recover()
3442 dev_info(&card->gdev->dev, in qeth_l3_recover()
3445 qeth_close_dev(card); in qeth_l3_recover()
3446 dev_warn(&card->gdev->dev, "The qeth device driver " in qeth_l3_recover()
3449 qeth_clear_recovery_task(card); in qeth_l3_recover()
3450 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); in qeth_l3_recover()
3451 qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD); in qeth_l3_recover()
3457 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l3_shutdown() local
3458 qeth_set_allowed_threads(card, 0, 1); in qeth_l3_shutdown()
3459 if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap) in qeth_l3_shutdown()
3460 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); in qeth_l3_shutdown()
3461 qeth_qdio_clear_card(card, 0); in qeth_l3_shutdown()
3462 qeth_clear_qdio_buffers(card); in qeth_l3_shutdown()
3463 qdio_free(CARD_DDEV(card)); in qeth_l3_shutdown()
3468 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l3_pm_suspend() local
3470 if (card->dev) in qeth_l3_pm_suspend()
3471 netif_device_detach(card->dev); in qeth_l3_pm_suspend()
3472 qeth_set_allowed_threads(card, 0, 1); in qeth_l3_pm_suspend()
3473 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); in qeth_l3_pm_suspend()
3476 if (card->state == CARD_STATE_UP) { in qeth_l3_pm_suspend()
3477 if (card->info.hwtrap) in qeth_l3_pm_suspend()
3478 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); in qeth_l3_pm_suspend()
3479 __qeth_l3_set_offline(card->gdev, 1); in qeth_l3_pm_suspend()
3481 __qeth_l3_set_offline(card->gdev, 0); in qeth_l3_pm_suspend()
3487 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l3_pm_resume() local
3493 if (card->state == CARD_STATE_RECOVER) { in qeth_l3_pm_resume()
3494 rc = __qeth_l3_set_online(card->gdev, 1); in qeth_l3_pm_resume()
3497 dev_close(card->dev); in qeth_l3_pm_resume()
3501 rc = __qeth_l3_set_online(card->gdev, 0); in qeth_l3_pm_resume()
3503 qeth_set_allowed_threads(card, 0xffffffff, 0); in qeth_l3_pm_resume()
3504 if (card->dev) in qeth_l3_pm_resume()
3505 netif_device_attach(card->dev); in qeth_l3_pm_resume()
3507 dev_warn(&card->gdev->dev, "The qeth device driver " in qeth_l3_pm_resume()
3513 static int qeth_l3_control_event(struct qeth_card *card, in qeth_l3_control_event() argument
3542 struct qeth_card *card; in qeth_l3_ip_event() local
3547 card = qeth_l3_get_card_from_dev(dev); in qeth_l3_ip_event()
3548 if (!card) in qeth_l3_ip_event()
3550 QETH_CARD_TEXT(card, 3, "ipevent"); in qeth_l3_ip_event()
3562 if (!qeth_l3_add_ip(card, addr)) in qeth_l3_ip_event()
3566 if (!qeth_l3_delete_ip(card, addr)) in qeth_l3_ip_event()
3572 qeth_l3_set_ip_addr_list(card); in qeth_l3_ip_event()
3592 struct qeth_card *card; in qeth_l3_ip6_event() local
3594 card = qeth_l3_get_card_from_dev(dev); in qeth_l3_ip6_event()
3595 if (!card) in qeth_l3_ip6_event()
3597 QETH_CARD_TEXT(card, 3, "ip6event"); in qeth_l3_ip6_event()
3598 if (!qeth_is_supported(card, IPA_IPV6)) in qeth_l3_ip6_event()
3611 if (!qeth_l3_add_ip(card, addr)) in qeth_l3_ip6_event()
3615 if (!qeth_l3_delete_ip(card, addr)) in qeth_l3_ip6_event()
3621 qeth_l3_set_ip_addr_list(card); in qeth_l3_ip6_event()