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()
1068 static int qeth_l3_send_setassparms(struct qeth_card *card, in qeth_l3_send_setassparms() argument
1077 QETH_CARD_TEXT(card, 4, "sendassp"); in qeth_l3_send_setassparms()
1085 rc = qeth_send_ipa_cmd(card, iob, reply_cb, reply_param); in qeth_l3_send_setassparms()
1090 static int qeth_l3_send_simple_setassparms_ipv6(struct qeth_card *card, in qeth_l3_send_simple_setassparms_ipv6() argument
1096 QETH_CARD_TEXT(card, 4, "simassp6"); in qeth_l3_send_simple_setassparms_ipv6()
1097 iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code, in qeth_l3_send_simple_setassparms_ipv6()
1101 rc = qeth_l3_send_setassparms(card, iob, 0, 0, in qeth_l3_send_simple_setassparms_ipv6()
1107 static int qeth_l3_send_simple_setassparms(struct qeth_card *card, in qeth_l3_send_simple_setassparms() argument
1114 QETH_CARD_TEXT(card, 4, "simassp4"); in qeth_l3_send_simple_setassparms()
1117 iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code, in qeth_l3_send_simple_setassparms()
1121 rc = qeth_l3_send_setassparms(card, iob, length, data, in qeth_l3_send_simple_setassparms()
1126 static int qeth_l3_start_ipa_arp_processing(struct qeth_card *card) in qeth_l3_start_ipa_arp_processing() argument
1130 QETH_CARD_TEXT(card, 3, "ipaarp"); in qeth_l3_start_ipa_arp_processing()
1132 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { in qeth_l3_start_ipa_arp_processing()
1133 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_arp_processing()
1135 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_arp_processing()
1138 rc = qeth_l3_send_simple_setassparms(card, IPA_ARP_PROCESSING, in qeth_l3_start_ipa_arp_processing()
1141 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_arp_processing()
1143 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_arp_processing()
1148 static int qeth_l3_start_ipa_ip_fragmentation(struct qeth_card *card) in qeth_l3_start_ipa_ip_fragmentation() argument
1152 QETH_CARD_TEXT(card, 3, "ipaipfrg"); in qeth_l3_start_ipa_ip_fragmentation()
1154 if (!qeth_is_supported(card, IPA_IP_FRAGMENTATION)) { in qeth_l3_start_ipa_ip_fragmentation()
1155 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_ip_fragmentation()
1157 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_ip_fragmentation()
1161 rc = qeth_l3_send_simple_setassparms(card, IPA_IP_FRAGMENTATION, in qeth_l3_start_ipa_ip_fragmentation()
1164 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_ip_fragmentation()
1166 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_ip_fragmentation()
1168 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_ip_fragmentation()
1173 static int qeth_l3_start_ipa_source_mac(struct qeth_card *card) in qeth_l3_start_ipa_source_mac() argument
1177 QETH_CARD_TEXT(card, 3, "stsrcmac"); in qeth_l3_start_ipa_source_mac()
1179 if (!qeth_is_supported(card, IPA_SOURCE_MAC)) { in qeth_l3_start_ipa_source_mac()
1180 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_source_mac()
1182 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_source_mac()
1186 rc = qeth_l3_send_simple_setassparms(card, IPA_SOURCE_MAC, in qeth_l3_start_ipa_source_mac()
1189 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_source_mac()
1191 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_source_mac()
1195 static int qeth_l3_start_ipa_vlan(struct qeth_card *card) in qeth_l3_start_ipa_vlan() argument
1199 QETH_CARD_TEXT(card, 3, "strtvlan"); in qeth_l3_start_ipa_vlan()
1201 if (!qeth_is_supported(card, IPA_FULL_VLAN)) { in qeth_l3_start_ipa_vlan()
1202 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_vlan()
1203 "VLAN not supported on %s\n", QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_vlan()
1207 rc = qeth_l3_send_simple_setassparms(card, IPA_VLAN_PRIO, in qeth_l3_start_ipa_vlan()
1210 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_vlan()
1212 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_vlan()
1214 dev_info(&card->gdev->dev, "VLAN enabled\n"); in qeth_l3_start_ipa_vlan()
1219 static int qeth_l3_start_ipa_multicast(struct qeth_card *card) in qeth_l3_start_ipa_multicast() argument
1223 QETH_CARD_TEXT(card, 3, "stmcast"); in qeth_l3_start_ipa_multicast()
1225 if (!qeth_is_supported(card, IPA_MULTICASTING)) { in qeth_l3_start_ipa_multicast()
1226 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_multicast()
1228 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_multicast()
1232 rc = qeth_l3_send_simple_setassparms(card, IPA_MULTICASTING, in qeth_l3_start_ipa_multicast()
1235 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_multicast()
1237 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_multicast()
1239 dev_info(&card->gdev->dev, "Multicast enabled\n"); in qeth_l3_start_ipa_multicast()
1240 card->dev->flags |= IFF_MULTICAST; in qeth_l3_start_ipa_multicast()
1246 static int qeth_l3_softsetup_ipv6(struct qeth_card *card) in qeth_l3_softsetup_ipv6() argument
1250 QETH_CARD_TEXT(card, 3, "softipv6"); in qeth_l3_softsetup_ipv6()
1252 if (card->info.type == QETH_CARD_TYPE_IQD) in qeth_l3_softsetup_ipv6()
1255 rc = qeth_query_ipassists(card, QETH_PROT_IPV6); in qeth_l3_softsetup_ipv6()
1257 dev_err(&card->gdev->dev, in qeth_l3_softsetup_ipv6()
1259 QETH_CARD_IFNAME(card)); in qeth_l3_softsetup_ipv6()
1262 rc = qeth_l3_send_simple_setassparms(card, IPA_IPV6, in qeth_l3_softsetup_ipv6()
1265 dev_err(&card->gdev->dev, in qeth_l3_softsetup_ipv6()
1267 QETH_CARD_IFNAME(card)); in qeth_l3_softsetup_ipv6()
1270 rc = qeth_l3_send_simple_setassparms_ipv6(card, IPA_IPV6, in qeth_l3_softsetup_ipv6()
1273 dev_err(&card->gdev->dev, in qeth_l3_softsetup_ipv6()
1275 QETH_CARD_IFNAME(card)); in qeth_l3_softsetup_ipv6()
1278 rc = qeth_l3_send_simple_setassparms_ipv6(card, IPA_PASSTHRU, in qeth_l3_softsetup_ipv6()
1281 dev_warn(&card->gdev->dev, in qeth_l3_softsetup_ipv6()
1283 QETH_CARD_IFNAME(card)); in qeth_l3_softsetup_ipv6()
1287 dev_info(&card->gdev->dev, "IPV6 enabled\n"); in qeth_l3_softsetup_ipv6()
1292 static int qeth_l3_start_ipa_ipv6(struct qeth_card *card) in qeth_l3_start_ipa_ipv6() argument
1296 QETH_CARD_TEXT(card, 3, "strtipv6"); in qeth_l3_start_ipa_ipv6()
1298 if (!qeth_is_supported(card, IPA_IPV6)) { in qeth_l3_start_ipa_ipv6()
1299 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_ipv6()
1300 "IPv6 not supported on %s\n", QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_ipv6()
1304 rc = qeth_l3_softsetup_ipv6(card); in qeth_l3_start_ipa_ipv6()
1309 static int qeth_l3_start_ipa_broadcast(struct qeth_card *card) in qeth_l3_start_ipa_broadcast() argument
1313 QETH_CARD_TEXT(card, 3, "stbrdcst"); in qeth_l3_start_ipa_broadcast()
1314 card->info.broadcast_capable = 0; in qeth_l3_start_ipa_broadcast()
1315 if (!qeth_is_supported(card, IPA_FILTERING)) { in qeth_l3_start_ipa_broadcast()
1316 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_broadcast()
1318 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_broadcast()
1322 rc = qeth_l3_send_simple_setassparms(card, IPA_FILTERING, in qeth_l3_start_ipa_broadcast()
1325 dev_warn(&card->gdev->dev, "Enabling broadcast filtering for " in qeth_l3_start_ipa_broadcast()
1326 "%s failed\n", QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_broadcast()
1330 rc = qeth_l3_send_simple_setassparms(card, IPA_FILTERING, in qeth_l3_start_ipa_broadcast()
1333 dev_warn(&card->gdev->dev, in qeth_l3_start_ipa_broadcast()
1335 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_broadcast()
1338 card->info.broadcast_capable = QETH_BROADCAST_WITH_ECHO; in qeth_l3_start_ipa_broadcast()
1339 dev_info(&card->gdev->dev, "Broadcast enabled\n"); in qeth_l3_start_ipa_broadcast()
1340 rc = qeth_l3_send_simple_setassparms(card, IPA_FILTERING, in qeth_l3_start_ipa_broadcast()
1343 dev_warn(&card->gdev->dev, "Setting up broadcast echo " in qeth_l3_start_ipa_broadcast()
1344 "filtering for %s failed\n", QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_broadcast()
1347 card->info.broadcast_capable = QETH_BROADCAST_WITHOUT_ECHO; in qeth_l3_start_ipa_broadcast()
1349 if (card->info.broadcast_capable) in qeth_l3_start_ipa_broadcast()
1350 card->dev->flags |= IFF_BROADCAST; in qeth_l3_start_ipa_broadcast()
1352 card->dev->flags &= ~IFF_BROADCAST; in qeth_l3_start_ipa_broadcast()
1356 static int qeth_l3_send_checksum_command(struct qeth_card *card) in qeth_l3_send_checksum_command() argument
1360 rc = qeth_l3_send_simple_setassparms(card, IPA_INBOUND_CHECKSUM, in qeth_l3_send_checksum_command()
1363 dev_warn(&card->gdev->dev, "Starting HW checksumming for %s " in qeth_l3_send_checksum_command()
1365 QETH_CARD_IFNAME(card)); in qeth_l3_send_checksum_command()
1368 rc = qeth_l3_send_simple_setassparms(card, IPA_INBOUND_CHECKSUM, in qeth_l3_send_checksum_command()
1370 card->info.csum_mask); in qeth_l3_send_checksum_command()
1372 dev_warn(&card->gdev->dev, "Enabling HW checksumming for %s " in qeth_l3_send_checksum_command()
1374 QETH_CARD_IFNAME(card)); in qeth_l3_send_checksum_command()
1380 static int qeth_l3_set_rx_csum(struct qeth_card *card, int on) in qeth_l3_set_rx_csum() argument
1385 rc = qeth_l3_send_checksum_command(card); in qeth_l3_set_rx_csum()
1388 dev_info(&card->gdev->dev, in qeth_l3_set_rx_csum()
1391 rc = qeth_l3_send_simple_setassparms(card, in qeth_l3_set_rx_csum()
1400 static int qeth_l3_start_ipa_checksum(struct qeth_card *card) in qeth_l3_start_ipa_checksum() argument
1402 QETH_CARD_TEXT(card, 3, "strtcsum"); in qeth_l3_start_ipa_checksum()
1404 if (card->dev->features & NETIF_F_RXCSUM) { in qeth_l3_start_ipa_checksum()
1407 card->dev->features &= ~NETIF_F_RXCSUM; in qeth_l3_start_ipa_checksum()
1408 netdev_update_features(card->dev); in qeth_l3_start_ipa_checksum()
1414 static int qeth_l3_start_ipa_tx_checksum(struct qeth_card *card) in qeth_l3_start_ipa_tx_checksum() argument
1418 if (!qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM)) in qeth_l3_start_ipa_tx_checksum()
1420 rc = qeth_l3_send_simple_setassparms(card, IPA_OUTBOUND_CHECKSUM, in qeth_l3_start_ipa_tx_checksum()
1424 rc = qeth_l3_send_simple_setassparms(card, IPA_OUTBOUND_CHECKSUM, in qeth_l3_start_ipa_tx_checksum()
1425 IPA_CMD_ASS_ENABLE, card->info.tx_csum_mask); in qeth_l3_start_ipa_tx_checksum()
1428 dev_info(&card->gdev->dev, "HW TX Checksumming enabled\n"); in qeth_l3_start_ipa_tx_checksum()
1431 dev_warn(&card->gdev->dev, "Enabling HW TX checksumming for %s " in qeth_l3_start_ipa_tx_checksum()
1432 "failed, using SW TX checksumming\n", QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_tx_checksum()
1436 static int qeth_l3_start_ipa_tso(struct qeth_card *card) in qeth_l3_start_ipa_tso() argument
1440 QETH_CARD_TEXT(card, 3, "sttso"); in qeth_l3_start_ipa_tso()
1442 if (!qeth_is_supported(card, IPA_OUTBOUND_TSO)) { in qeth_l3_start_ipa_tso()
1443 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_tso()
1445 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_tso()
1448 rc = qeth_l3_send_simple_setassparms(card, IPA_OUTBOUND_TSO, in qeth_l3_start_ipa_tso()
1451 dev_warn(&card->gdev->dev, "Starting outbound TCP " in qeth_l3_start_ipa_tso()
1453 QETH_CARD_IFNAME(card)); in qeth_l3_start_ipa_tso()
1455 dev_info(&card->gdev->dev, in qeth_l3_start_ipa_tso()
1459 card->dev->features &= ~NETIF_F_TSO; in qeth_l3_start_ipa_tso()
1463 static int qeth_l3_start_ipassists(struct qeth_card *card) in qeth_l3_start_ipassists() argument
1465 QETH_CARD_TEXT(card, 3, "strtipas"); in qeth_l3_start_ipassists()
1467 if (qeth_set_access_ctrl_online(card, 0)) in qeth_l3_start_ipassists()
1469 qeth_l3_start_ipa_arp_processing(card); /* go on*/ in qeth_l3_start_ipassists()
1470 qeth_l3_start_ipa_ip_fragmentation(card); /* go on*/ in qeth_l3_start_ipassists()
1471 qeth_l3_start_ipa_source_mac(card); /* go on*/ in qeth_l3_start_ipassists()
1472 qeth_l3_start_ipa_vlan(card); /* go on*/ in qeth_l3_start_ipassists()
1473 qeth_l3_start_ipa_multicast(card); /* go on*/ in qeth_l3_start_ipassists()
1474 qeth_l3_start_ipa_ipv6(card); /* go on*/ in qeth_l3_start_ipassists()
1475 qeth_l3_start_ipa_broadcast(card); /* go on*/ in qeth_l3_start_ipassists()
1476 qeth_l3_start_ipa_checksum(card); /* go on*/ in qeth_l3_start_ipassists()
1477 qeth_l3_start_ipa_tx_checksum(card); in qeth_l3_start_ipassists()
1478 qeth_l3_start_ipa_tso(card); /* go on*/ in qeth_l3_start_ipassists()
1482 static int qeth_l3_iqd_read_initial_mac_cb(struct qeth_card *card, in qeth_l3_iqd_read_initial_mac_cb() argument
1489 memcpy(card->dev->dev_addr, in qeth_l3_iqd_read_initial_mac_cb()
1492 eth_random_addr(card->dev->dev_addr); in qeth_l3_iqd_read_initial_mac_cb()
1497 static int qeth_l3_iqd_read_initial_mac(struct qeth_card *card) in qeth_l3_iqd_read_initial_mac() argument
1505 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, in qeth_l3_iqd_read_initial_mac()
1511 card->info.unique_id; in qeth_l3_iqd_read_initial_mac()
1513 rc = qeth_send_ipa_cmd(card, iob, qeth_l3_iqd_read_initial_mac_cb, in qeth_l3_iqd_read_initial_mac()
1518 static int qeth_l3_get_unique_id_cb(struct qeth_card *card, in qeth_l3_get_unique_id_cb() argument
1525 card->info.unique_id = *((__u16 *) in qeth_l3_get_unique_id_cb()
1528 card->info.unique_id = UNIQUE_ID_IF_CREATE_ADDR_FAILED | in qeth_l3_get_unique_id_cb()
1530 dev_warn(&card->gdev->dev, "The network adapter failed to " in qeth_l3_get_unique_id_cb()
1536 static int qeth_l3_get_unique_id(struct qeth_card *card) in qeth_l3_get_unique_id() argument
1544 if (!qeth_is_supported(card, IPA_IPV6)) { in qeth_l3_get_unique_id()
1545 card->info.unique_id = UNIQUE_ID_IF_CREATE_ADDR_FAILED | in qeth_l3_get_unique_id()
1550 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR, in qeth_l3_get_unique_id()
1556 card->info.unique_id; in qeth_l3_get_unique_id()
1558 rc = qeth_send_ipa_cmd(card, iob, qeth_l3_get_unique_id_cb, NULL); in qeth_l3_get_unique_id()
1563 qeth_diags_trace_cb(struct qeth_card *card, struct qeth_reply *reply, in qeth_diags_trace_cb() argument
1574 QETH_CARD_TEXT_(card, 2, "dxter%x", rc); in qeth_diags_trace_cb()
1582 card->info.promisc_mode = SET_PROMISC_MODE_OFF; in qeth_diags_trace_cb()
1583 dev_info(&card->gdev->dev, "The HiperSockets network " in qeth_diags_trace_cb()
1593 card->info.promisc_mode = SET_PROMISC_MODE_ON; in qeth_diags_trace_cb()
1594 dev_info(&card->gdev->dev, "The HiperSockets network " in qeth_diags_trace_cb()
1598 dev_warn(&card->gdev->dev, "The device is not " in qeth_diags_trace_cb()
1603 dev_warn(&card->gdev->dev, "A HiperSockets " in qeth_diags_trace_cb()
1613 cmd->data.diagass.action, QETH_CARD_IFNAME(card)); in qeth_diags_trace_cb()
1620 qeth_diags_trace(struct qeth_card *card, enum qeth_diags_trace_cmds diags_cmd) in qeth_diags_trace() argument
1627 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0); in qeth_diags_trace()
1635 return qeth_send_ipa_cmd(card, iob, qeth_diags_trace_cb, NULL); in qeth_diags_trace()
1644 static void qeth_l3_add_mc(struct qeth_card *card, struct in_device *in4_dev) in qeth_l3_add_mc() argument
1650 QETH_CARD_TEXT(card, 4, "addmc"); in qeth_l3_add_mc()
1660 if (!qeth_l3_add_ip(card, ipm)) in qeth_l3_add_mc()
1666 static void qeth_l3_add_vlan_mc(struct qeth_card *card) in qeth_l3_add_vlan_mc() argument
1671 QETH_CARD_TEXT(card, 4, "addmcvl"); in qeth_l3_add_vlan_mc()
1672 if (!qeth_is_supported(card, IPA_FULL_VLAN)) in qeth_l3_add_vlan_mc()
1675 for_each_set_bit(vid, card->active_vlans, VLAN_N_VID) { in qeth_l3_add_vlan_mc()
1678 netdev = __vlan_find_dev_deep_rcu(card->dev, htons(ETH_P_8021Q), in qeth_l3_add_vlan_mc()
1686 qeth_l3_add_mc(card, in_dev); in qeth_l3_add_vlan_mc()
1690 static void qeth_l3_add_multicast_ipv4(struct qeth_card *card) in qeth_l3_add_multicast_ipv4() argument
1694 QETH_CARD_TEXT(card, 4, "chkmcv4"); in qeth_l3_add_multicast_ipv4()
1696 in4_dev = __in_dev_get_rcu(card->dev); in qeth_l3_add_multicast_ipv4()
1699 qeth_l3_add_mc(card, in4_dev); in qeth_l3_add_multicast_ipv4()
1700 qeth_l3_add_vlan_mc(card); in qeth_l3_add_multicast_ipv4()
1706 static void qeth_l3_add_mc6(struct qeth_card *card, struct inet6_dev *in6_dev) in qeth_l3_add_mc6() argument
1712 QETH_CARD_TEXT(card, 4, "addmc6"); in qeth_l3_add_mc6()
1722 if (!qeth_l3_add_ip(card, ipm)) in qeth_l3_add_mc6()
1728 static void qeth_l3_add_vlan_mc6(struct qeth_card *card) in qeth_l3_add_vlan_mc6() argument
1733 QETH_CARD_TEXT(card, 4, "admc6vl"); in qeth_l3_add_vlan_mc6()
1734 if (!qeth_is_supported(card, IPA_FULL_VLAN)) in qeth_l3_add_vlan_mc6()
1737 for_each_set_bit(vid, card->active_vlans, VLAN_N_VID) { in qeth_l3_add_vlan_mc6()
1740 netdev = __vlan_find_dev_deep_rcu(card->dev, htons(ETH_P_8021Q), in qeth_l3_add_vlan_mc6()
1749 qeth_l3_add_mc6(card, in_dev); in qeth_l3_add_vlan_mc6()
1755 static void qeth_l3_add_multicast_ipv6(struct qeth_card *card) in qeth_l3_add_multicast_ipv6() argument
1759 QETH_CARD_TEXT(card, 4, "chkmcv6"); in qeth_l3_add_multicast_ipv6()
1760 if (!qeth_is_supported(card, IPA_IPV6)) in qeth_l3_add_multicast_ipv6()
1762 in6_dev = in6_dev_get(card->dev); in qeth_l3_add_multicast_ipv6()
1767 qeth_l3_add_mc6(card, in6_dev); in qeth_l3_add_multicast_ipv6()
1768 qeth_l3_add_vlan_mc6(card); in qeth_l3_add_multicast_ipv6()
1775 static void qeth_l3_free_vlan_addresses4(struct qeth_card *card, in qeth_l3_free_vlan_addresses4() argument
1783 QETH_CARD_TEXT(card, 4, "frvaddr4"); in qeth_l3_free_vlan_addresses4()
1785 netdev = __vlan_find_dev_deep_rcu(card->dev, htons(ETH_P_8021Q), vid); in qeth_l3_free_vlan_addresses4()
1797 if (!qeth_l3_delete_ip(card, addr)) in qeth_l3_free_vlan_addresses4()
1804 static void qeth_l3_free_vlan_addresses6(struct qeth_card *card, in qeth_l3_free_vlan_addresses6() argument
1813 QETH_CARD_TEXT(card, 4, "frvaddr6"); in qeth_l3_free_vlan_addresses6()
1815 netdev = __vlan_find_dev_deep_rcu(card->dev, htons(ETH_P_8021Q), vid); in qeth_l3_free_vlan_addresses6()
1828 if (!qeth_l3_delete_ip(card, addr)) in qeth_l3_free_vlan_addresses6()
1836 static void qeth_l3_free_vlan_addresses(struct qeth_card *card, in qeth_l3_free_vlan_addresses() argument
1840 qeth_l3_free_vlan_addresses4(card, vid); in qeth_l3_free_vlan_addresses()
1841 qeth_l3_free_vlan_addresses6(card, vid); in qeth_l3_free_vlan_addresses()
1848 struct qeth_card *card = dev->ml_priv; in qeth_l3_vlan_rx_add_vid() local
1850 set_bit(vid, card->active_vlans); in qeth_l3_vlan_rx_add_vid()
1857 struct qeth_card *card = dev->ml_priv; in qeth_l3_vlan_rx_kill_vid() local
1860 QETH_CARD_TEXT_(card, 4, "kid:%d", vid); in qeth_l3_vlan_rx_kill_vid()
1861 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { in qeth_l3_vlan_rx_kill_vid()
1862 QETH_CARD_TEXT(card, 3, "kidREC"); in qeth_l3_vlan_rx_kill_vid()
1865 spin_lock_irqsave(&card->vlanlock, flags); in qeth_l3_vlan_rx_kill_vid()
1867 qeth_l3_free_vlan_addresses(card, vid); in qeth_l3_vlan_rx_kill_vid()
1868 clear_bit(vid, card->active_vlans); in qeth_l3_vlan_rx_kill_vid()
1869 spin_unlock_irqrestore(&card->vlanlock, flags); in qeth_l3_vlan_rx_kill_vid()
1870 qeth_l3_set_multicast_list(card->dev); in qeth_l3_vlan_rx_kill_vid()
1874 static inline int qeth_l3_rebuild_skb(struct qeth_card *card, in qeth_l3_rebuild_skb() argument
1893 tg_addr, card->dev, 0); in qeth_l3_rebuild_skb()
1901 memcpy(tg_addr, card->dev->broadcast, in qeth_l3_rebuild_skb()
1902 card->dev->addr_len); in qeth_l3_rebuild_skb()
1904 card->stats.multicast++; in qeth_l3_rebuild_skb()
1908 memcpy(tg_addr, card->dev->broadcast, in qeth_l3_rebuild_skb()
1909 card->dev->addr_len); in qeth_l3_rebuild_skb()
1910 card->stats.multicast++; in qeth_l3_rebuild_skb()
1917 if (card->options.sniffer) in qeth_l3_rebuild_skb()
1921 memcpy(tg_addr, card->dev->dev_addr, in qeth_l3_rebuild_skb()
1922 card->dev->addr_len); in qeth_l3_rebuild_skb()
1925 card->dev->header_ops->create(skb, card->dev, prot, in qeth_l3_rebuild_skb()
1927 card->dev->addr_len); in qeth_l3_rebuild_skb()
1929 card->dev->header_ops->create(skb, card->dev, prot, in qeth_l3_rebuild_skb()
1930 tg_addr, "FAKELL", card->dev->addr_len); in qeth_l3_rebuild_skb()
1933 skb->protocol = eth_type_trans(skb, card->dev); in qeth_l3_rebuild_skb()
1942 if (card->dev->features & NETIF_F_RXCSUM) { in qeth_l3_rebuild_skb()
1957 static int qeth_l3_process_inbound_buffer(struct qeth_card *card, in qeth_l3_process_inbound_buffer() argument
1971 skb = qeth_core_get_next_skb(card, in qeth_l3_process_inbound_buffer()
1972 &card->qdio.in_q->bufs[card->rx.b_index], in qeth_l3_process_inbound_buffer()
1973 &card->rx.b_element, &card->rx.e_offset, &hdr); in qeth_l3_process_inbound_buffer()
1978 skb->dev = card->dev; in qeth_l3_process_inbound_buffer()
1982 if ((card->info.type == QETH_CARD_TYPE_IQD) && in qeth_l3_process_inbound_buffer()
1987 skb->dev = card->dev; in qeth_l3_process_inbound_buffer()
1989 card->dev->header_ops->create(skb, card->dev, 0, in qeth_l3_process_inbound_buffer()
1990 card->dev->dev_addr, "FAKELL", in qeth_l3_process_inbound_buffer()
1991 card->dev->addr_len); in qeth_l3_process_inbound_buffer()
1994 is_vlan = qeth_l3_rebuild_skb(card, skb, hdr, in qeth_l3_process_inbound_buffer()
1997 if (is_vlan && !card->options.sniffer) in qeth_l3_process_inbound_buffer()
2000 napi_gro_receive(&card->napi, skb); in qeth_l3_process_inbound_buffer()
2011 QETH_CARD_TEXT(card, 3, "inbunkno"); in qeth_l3_process_inbound_buffer()
2017 card->stats.rx_packets++; in qeth_l3_process_inbound_buffer()
2018 card->stats.rx_bytes += len; in qeth_l3_process_inbound_buffer()
2025 struct qeth_card *card = container_of(napi, struct qeth_card, napi); in qeth_l3_poll() local
2031 if (card->options.performance_stats) { in qeth_l3_poll()
2032 card->perf_stats.inbound_cnt++; in qeth_l3_poll()
2033 card->perf_stats.inbound_start_time = qeth_get_micros(); in qeth_l3_poll()
2037 if (!card->rx.b_count) { in qeth_l3_poll()
2038 card->rx.qdio_err = 0; in qeth_l3_poll()
2039 card->rx.b_count = qdio_get_next_buffers( in qeth_l3_poll()
2040 card->data.ccwdev, 0, &card->rx.b_index, in qeth_l3_poll()
2041 &card->rx.qdio_err); in qeth_l3_poll()
2042 if (card->rx.b_count <= 0) { in qeth_l3_poll()
2043 card->rx.b_count = 0; in qeth_l3_poll()
2046 card->rx.b_element = in qeth_l3_poll()
2047 &card->qdio.in_q->bufs[card->rx.b_index] in qeth_l3_poll()
2049 card->rx.e_offset = 0; in qeth_l3_poll()
2052 while (card->rx.b_count) { in qeth_l3_poll()
2053 buffer = &card->qdio.in_q->bufs[card->rx.b_index]; in qeth_l3_poll()
2054 if (!(card->rx.qdio_err && in qeth_l3_poll()
2055 qeth_check_qdio_errors(card, buffer->buffer, in qeth_l3_poll()
2056 card->rx.qdio_err, "qinerr"))) in qeth_l3_poll()
2058 card, new_budget, &done); in qeth_l3_poll()
2063 if (card->options.performance_stats) in qeth_l3_poll()
2064 card->perf_stats.bufs_rec++; in qeth_l3_poll()
2065 qeth_put_buffer_pool_entry(card, in qeth_l3_poll()
2067 qeth_queue_input_buffer(card, card->rx.b_index); in qeth_l3_poll()
2068 card->rx.b_count--; in qeth_l3_poll()
2069 if (card->rx.b_count) { in qeth_l3_poll()
2070 card->rx.b_index = in qeth_l3_poll()
2071 (card->rx.b_index + 1) % in qeth_l3_poll()
2073 card->rx.b_element = in qeth_l3_poll()
2074 &card->qdio.in_q in qeth_l3_poll()
2075 ->bufs[card->rx.b_index] in qeth_l3_poll()
2077 card->rx.e_offset = 0; in qeth_l3_poll()
2089 if (qdio_start_irq(card->data.ccwdev, 0)) in qeth_l3_poll()
2090 napi_schedule(&card->napi); in qeth_l3_poll()
2092 if (card->options.performance_stats) in qeth_l3_poll()
2093 card->perf_stats.inbound_time += qeth_get_micros() - in qeth_l3_poll()
2094 card->perf_stats.inbound_start_time; in qeth_l3_poll()
2099 struct qeth_card *card) in qeth_l3_verify_vlan_dev() argument
2104 for_each_set_bit(vid, card->active_vlans, VLAN_N_VID) { in qeth_l3_verify_vlan_dev()
2108 netdev = __vlan_find_dev_deep_rcu(card->dev, htons(ETH_P_8021Q), in qeth_l3_verify_vlan_dev()
2117 if (rc && !(vlan_dev_real_dev(dev)->ml_priv == (void *)card)) in qeth_l3_verify_vlan_dev()
2125 struct qeth_card *card; in qeth_l3_verify_dev() local
2130 list_for_each_entry(card, &qeth_core_card_list.list, list) { in qeth_l3_verify_dev()
2131 if (card->dev == dev) { in qeth_l3_verify_dev()
2135 rc = qeth_l3_verify_vlan_dev(dev, card); in qeth_l3_verify_dev()
2146 struct qeth_card *card = NULL; in qeth_l3_get_card_from_dev() local
2151 card = dev->ml_priv; in qeth_l3_get_card_from_dev()
2153 card = vlan_dev_real_dev(dev)->ml_priv; in qeth_l3_get_card_from_dev()
2154 if (card && card->options.layer2) in qeth_l3_get_card_from_dev()
2155 card = NULL; in qeth_l3_get_card_from_dev()
2156 if (card) in qeth_l3_get_card_from_dev()
2157 QETH_CARD_TEXT_(card, 4, "%d", rc); in qeth_l3_get_card_from_dev()
2158 return card ; in qeth_l3_get_card_from_dev()
2161 static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode) in qeth_l3_stop_card() argument
2166 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); in qeth_l3_stop_card()
2168 qeth_set_allowed_threads(card, 0, 1); in qeth_l3_stop_card()
2169 if (card->options.sniffer && in qeth_l3_stop_card()
2170 (card->info.promisc_mode == SET_PROMISC_MODE_ON)) in qeth_l3_stop_card()
2171 qeth_diags_trace(card, QETH_DIAGS_CMD_TRACE_DISABLE); in qeth_l3_stop_card()
2172 if (card->read.state == CH_STATE_UP && in qeth_l3_stop_card()
2173 card->write.state == CH_STATE_UP && in qeth_l3_stop_card()
2174 (card->state == CARD_STATE_UP)) { in qeth_l3_stop_card()
2176 qeth_l3_stop(card->dev); in qeth_l3_stop_card()
2179 dev_close(card->dev); in qeth_l3_stop_card()
2182 card->state = CARD_STATE_SOFTSETUP; in qeth_l3_stop_card()
2184 if (card->state == CARD_STATE_SOFTSETUP) { in qeth_l3_stop_card()
2185 qeth_l3_clear_ip_list(card, 1); in qeth_l3_stop_card()
2186 qeth_clear_ipacmd_list(card); in qeth_l3_stop_card()
2187 card->state = CARD_STATE_HARDSETUP; in qeth_l3_stop_card()
2189 if (card->state == CARD_STATE_HARDSETUP) { in qeth_l3_stop_card()
2190 qeth_qdio_clear_card(card, 0); in qeth_l3_stop_card()
2191 qeth_clear_qdio_buffers(card); in qeth_l3_stop_card()
2192 qeth_clear_working_pool_list(card); in qeth_l3_stop_card()
2193 card->state = CARD_STATE_DOWN; in qeth_l3_stop_card()
2195 if (card->state == CARD_STATE_DOWN) { in qeth_l3_stop_card()
2196 qeth_clear_cmd_buffers(&card->read); in qeth_l3_stop_card()
2197 qeth_clear_cmd_buffers(&card->write); in qeth_l3_stop_card()
2207 qeth_l3_handle_promisc_mode(struct qeth_card *card) in qeth_l3_handle_promisc_mode() argument
2209 struct net_device *dev = card->dev; in qeth_l3_handle_promisc_mode()
2212 (card->info.promisc_mode == SET_PROMISC_MODE_ON)) || in qeth_l3_handle_promisc_mode()
2214 (card->info.promisc_mode == SET_PROMISC_MODE_OFF))) in qeth_l3_handle_promisc_mode()
2217 if (card->info.guestlan) { /* Guestlan trace */ in qeth_l3_handle_promisc_mode()
2218 if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE)) in qeth_l3_handle_promisc_mode()
2219 qeth_setadp_promisc_mode(card); in qeth_l3_handle_promisc_mode()
2220 } else if (card->options.sniffer && /* HiperSockets trace */ in qeth_l3_handle_promisc_mode()
2221 qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) { in qeth_l3_handle_promisc_mode()
2223 QETH_CARD_TEXT(card, 3, "+promisc"); in qeth_l3_handle_promisc_mode()
2224 qeth_diags_trace(card, QETH_DIAGS_CMD_TRACE_ENABLE); in qeth_l3_handle_promisc_mode()
2226 QETH_CARD_TEXT(card, 3, "-promisc"); in qeth_l3_handle_promisc_mode()
2227 qeth_diags_trace(card, QETH_DIAGS_CMD_TRACE_DISABLE); in qeth_l3_handle_promisc_mode()
2234 struct qeth_card *card = dev->ml_priv; in qeth_l3_set_multicast_list() local
2236 QETH_CARD_TEXT(card, 3, "setmulti"); in qeth_l3_set_multicast_list()
2237 if (qeth_threads_running(card, QETH_RECOVER_THREAD) && in qeth_l3_set_multicast_list()
2238 (card->state != CARD_STATE_UP)) in qeth_l3_set_multicast_list()
2240 if (!card->options.sniffer) { in qeth_l3_set_multicast_list()
2241 qeth_l3_delete_mc_addresses(card); in qeth_l3_set_multicast_list()
2242 qeth_l3_add_multicast_ipv4(card); in qeth_l3_set_multicast_list()
2244 qeth_l3_add_multicast_ipv6(card); in qeth_l3_set_multicast_list()
2246 qeth_l3_set_ip_addr_list(card); in qeth_l3_set_multicast_list()
2247 if (!qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE)) in qeth_l3_set_multicast_list()
2250 qeth_l3_handle_promisc_mode(card); in qeth_l3_set_multicast_list()
2276 static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries) in qeth_l3_arp_set_no_entries() argument
2281 QETH_CARD_TEXT(card, 3, "arpstnoe"); in qeth_l3_arp_set_no_entries()
2288 if (card->info.guestlan) in qeth_l3_arp_set_no_entries()
2290 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { in qeth_l3_arp_set_no_entries()
2293 rc = qeth_l3_send_simple_setassparms(card, IPA_ARP_PROCESSING, in qeth_l3_arp_set_no_entries()
2299 "%s: %s (0x%x/%d)\n", QETH_CARD_IFNAME(card), in qeth_l3_arp_set_no_entries()
2305 static __u32 get_arp_entry_size(struct qeth_card *card, in get_arp_entry_size() argument
2314 QETH_CARD_TEXT(card, 4, "arpev4"); in get_arp_entry_size()
2323 QETH_CARD_TEXT(card, 4, "arpev6"); in get_arp_entry_size()
2334 QETH_CARD_TEXT(card, 4, "arpinv"); in get_arp_entry_size()
2347 static int qeth_l3_arp_query_cb(struct qeth_card *card, in qeth_l3_arp_query_cb() argument
2359 QETH_CARD_TEXT(card, 3, "arpquecb"); in qeth_l3_arp_query_cb()
2363 QETH_CARD_TEXT_(card, 4, "%i", cmd->hdr.prot_version); in qeth_l3_arp_query_cb()
2365 QETH_CARD_TEXT(card, 4, "arpcberr"); in qeth_l3_arp_query_cb()
2366 QETH_CARD_TEXT_(card, 4, "%i", cmd->hdr.return_code); in qeth_l3_arp_query_cb()
2371 QETH_CARD_TEXT(card, 4, "setaperr"); in qeth_l3_arp_query_cb()
2372 QETH_CARD_TEXT_(card, 4, "%i", cmd->hdr.return_code); in qeth_l3_arp_query_cb()
2376 QETH_CARD_TEXT_(card, 4, "anoen%i", qdata->no_entries); in qeth_l3_arp_query_cb()
2389 QETH_CARD_TEXT(card, 4, "pmis"); in qeth_l3_arp_query_cb()
2390 QETH_CARD_TEXT_(card, 4, "%i", etype->ip); in qeth_l3_arp_query_cb()
2393 esize = get_arp_entry_size(card, qdata, etype, in qeth_l3_arp_query_cb()
2395 QETH_CARD_TEXT_(card, 5, "esz%i", esize); in qeth_l3_arp_query_cb()
2400 QETH_CARD_TEXT_(card, 4, "qaer3%i", -ENOMEM); in qeth_l3_arp_query_cb()
2416 QETH_CARD_TEXT_(card, 4, "nove%i", qinfo->no_entries); in qeth_l3_arp_query_cb()
2423 QETH_CARD_TEXT_(card, 4, "rc%i", 0); in qeth_l3_arp_query_cb()
2431 static int qeth_l3_send_ipa_arp_cmd(struct qeth_card *card, in qeth_l3_send_ipa_arp_cmd() argument
2437 QETH_CARD_TEXT(card, 4, "sendarp"); in qeth_l3_send_ipa_arp_cmd()
2441 &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH); in qeth_l3_send_ipa_arp_cmd()
2442 return qeth_send_control_data(card, IPA_PDU_HEADER_SIZE + len, iob, in qeth_l3_send_ipa_arp_cmd()
2446 static int qeth_l3_query_arp_cache_info(struct qeth_card *card, in qeth_l3_query_arp_cache_info() argument
2455 QETH_CARD_TEXT_(card, 3, "qarpipv%i", prot); in qeth_l3_query_arp_cache_info()
2457 iob = qeth_l3_get_setassparms_cmd(card, IPA_ARP_PROCESSING, in qeth_l3_query_arp_cache_info()
2467 rc = qeth_l3_send_ipa_arp_cmd(card, iob, in qeth_l3_query_arp_cache_info()
2474 "(0x%x/%d)\n", QETH_CARD_IFNAME(card), in qeth_l3_query_arp_cache_info()
2481 static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata) in qeth_l3_arp_query() argument
2486 QETH_CARD_TEXT(card, 3, "arpquery"); in qeth_l3_arp_query()
2488 if (!qeth_is_supported(card,/*IPA_QUERY_ARP_ADDR_INFO*/ in qeth_l3_arp_query()
2490 QETH_CARD_TEXT(card, 3, "arpqnsup"); in qeth_l3_arp_query()
2505 rc = qeth_l3_query_arp_cache_info(card, QETH_PROT_IPV4, &qinfo); in qeth_l3_arp_query()
2514 qeth_l3_query_arp_cache_info(card, QETH_PROT_IPV6, in qeth_l3_arp_query()
2519 QETH_CARD_TEXT(card, 4, "qactf"); in qeth_l3_arp_query()
2523 QETH_CARD_TEXT(card, 4, "qacts"); in qeth_l3_arp_query()
2531 static int qeth_l3_arp_add_entry(struct qeth_card *card, in qeth_l3_arp_add_entry() argument
2539 QETH_CARD_TEXT(card, 3, "arpadent"); in qeth_l3_arp_add_entry()
2546 if (card->info.guestlan) in qeth_l3_arp_add_entry()
2548 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { in qeth_l3_arp_add_entry()
2552 iob = qeth_l3_get_setassparms_cmd(card, IPA_ARP_PROCESSING, in qeth_l3_arp_add_entry()
2558 rc = qeth_l3_send_setassparms(card, iob, in qeth_l3_arp_add_entry()
2566 "on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card), in qeth_l3_arp_add_entry()
2572 static int qeth_l3_arp_remove_entry(struct qeth_card *card, in qeth_l3_arp_remove_entry() argument
2580 QETH_CARD_TEXT(card, 3, "arprment"); in qeth_l3_arp_remove_entry()
2587 if (card->info.guestlan) in qeth_l3_arp_remove_entry()
2589 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { in qeth_l3_arp_remove_entry()
2593 iob = qeth_l3_get_setassparms_cmd(card, IPA_ARP_PROCESSING, in qeth_l3_arp_remove_entry()
2599 rc = qeth_l3_send_setassparms(card, iob, in qeth_l3_arp_remove_entry()
2607 " on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card), in qeth_l3_arp_remove_entry()
2613 static int qeth_l3_arp_flush_cache(struct qeth_card *card) in qeth_l3_arp_flush_cache() argument
2618 QETH_CARD_TEXT(card, 3, "arpflush"); in qeth_l3_arp_flush_cache()
2625 if (card->info.guestlan || (card->info.type == QETH_CARD_TYPE_IQD)) in qeth_l3_arp_flush_cache()
2627 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { in qeth_l3_arp_flush_cache()
2630 rc = qeth_l3_send_simple_setassparms(card, IPA_ARP_PROCESSING, in qeth_l3_arp_flush_cache()
2635 "(0x%x/%d)\n", QETH_CARD_IFNAME(card), in qeth_l3_arp_flush_cache()
2643 struct qeth_card *card = dev->ml_priv; in qeth_l3_do_ioctl() local
2648 if (!card) in qeth_l3_do_ioctl()
2651 if (!qeth_card_hw_is_reachable(card)) in qeth_l3_do_ioctl()
2660 rc = qeth_l3_arp_set_no_entries(card, rq->ifr_ifru.ifru_ivalue); in qeth_l3_do_ioctl()
2667 rc = qeth_l3_arp_query(card, rq->ifr_ifru.ifru_data); in qeth_l3_do_ioctl()
2678 rc = qeth_l3_arp_add_entry(card, &arp_entry); in qeth_l3_do_ioctl()
2689 rc = qeth_l3_arp_remove_entry(card, &arp_entry); in qeth_l3_do_ioctl()
2696 rc = qeth_l3_arp_flush_cache(card); in qeth_l3_do_ioctl()
2699 rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data); in qeth_l3_do_ioctl()
2702 if ((card->info.type == QETH_CARD_TYPE_OSD || in qeth_l3_do_ioctl()
2703 card->info.type == QETH_CARD_TYPE_OSX) && in qeth_l3_do_ioctl()
2704 !card->info.guestlan) in qeth_l3_do_ioctl()
2722 rc = qeth_query_oat_command(card, rq->ifr_ifru.ifru_data); in qeth_l3_do_ioctl()
2728 QETH_CARD_TEXT_(card, 2, "ioce%d", rc); in qeth_l3_do_ioctl()
2732 int inline qeth_l3_get_cast_type(struct qeth_card *card, struct sk_buff *skb) in qeth_l3_get_cast_type() argument
2770 switch (card->info.link_type) { in qeth_l3_get_cast_type()
2787 static void qeth_l3_fill_af_iucv_hdr(struct qeth_card *card, in qeth_l3_fill_af_iucv_hdr() argument
2794 card->dev->header_ops->create(skb, card->dev, 0, in qeth_l3_fill_af_iucv_hdr()
2795 card->dev->dev_addr, card->dev->dev_addr, in qeth_l3_fill_af_iucv_hdr()
2796 card->dev->addr_len); in qeth_l3_fill_af_iucv_hdr()
2811 static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, in qeth_l3_fill_header() argument
2825 if ((ipv == 4) || (card->info.type == QETH_CARD_TYPE_IQD)) in qeth_l3_fill_header()
2856 if (card->info.type == QETH_CARD_TYPE_IQD) in qeth_l3_fill_header()
2874 static inline void qeth_l3_hdr_csum(struct qeth_card *card, in qeth_l3_hdr_csum() argument
2887 if (card->options.performance_stats) in qeth_l3_hdr_csum()
2888 card->perf_stats.tx_csum++; in qeth_l3_hdr_csum()
2891 static void qeth_tso_fill_header(struct qeth_card *card, in qeth_tso_fill_header() argument
2946 struct qeth_card *card = dev->ml_priv; in qeth_l3_hard_start_xmit() local
2949 int cast_type = qeth_l3_get_cast_type(card, skb); in qeth_l3_hard_start_xmit()
2951 card->qdio.out_qs[card->qdio.do_prio_queueing in qeth_l3_hard_start_xmit()
2952 || (cast_type && card->info.is_multicast_different) ? in qeth_l3_hard_start_xmit()
2953 qeth_get_priority_queue(card, skb, ipv, cast_type) : in qeth_l3_hard_start_xmit()
2954 card->qdio.default_out_queue]; in qeth_l3_hard_start_xmit()
2960 if (((card->info.type == QETH_CARD_TYPE_IQD) && in qeth_l3_hard_start_xmit()
2961 (((card->options.cq != QETH_CQ_ENABLED) && !ipv) || in qeth_l3_hard_start_xmit()
2962 ((card->options.cq == QETH_CQ_ENABLED) && in qeth_l3_hard_start_xmit()
2964 card->options.sniffer) in qeth_l3_hard_start_xmit()
2967 if ((card->state != CARD_STATE_UP) || !card->lan_online) { in qeth_l3_hard_start_xmit()
2968 card->stats.tx_carrier_errors++; in qeth_l3_hard_start_xmit()
2973 (card->info.broadcast_capable == 0)) in qeth_l3_hard_start_xmit()
2976 if (card->options.performance_stats) { in qeth_l3_hard_start_xmit()
2977 card->perf_stats.outbound_cnt++; in qeth_l3_hard_start_xmit()
2978 card->perf_stats.outbound_start_time = qeth_get_micros(); in qeth_l3_hard_start_xmit()
2983 if ((card->info.type == QETH_CARD_TYPE_IQD) && (!large_send) && in qeth_l3_hard_start_xmit()
3002 if (card->info.type == QETH_CARD_TYPE_IQD) { in qeth_l3_hard_start_xmit()
3032 if (card->options.performance_stats) in qeth_l3_hard_start_xmit()
3033 card->perf_stats.tx_lin++; in qeth_l3_hard_start_xmit()
3041 qeth_l3_fill_header(card, hdr, new_skb, ipv, cast_type); in qeth_l3_hard_start_xmit()
3042 qeth_tso_fill_header(card, hdr, new_skb); in qeth_l3_hard_start_xmit()
3048 qeth_l3_fill_header(card, hdr, new_skb, ipv, in qeth_l3_hard_start_xmit()
3052 qeth_l3_fill_af_iucv_hdr(card, hdr, new_skb); in qeth_l3_hard_start_xmit()
3054 qeth_l3_fill_header(card, hdr, new_skb, ipv, in qeth_l3_hard_start_xmit()
3061 qeth_l3_hdr_csum(card, hdr, new_skb); in qeth_l3_hard_start_xmit()
3064 elems = qeth_get_elements_no(card, new_skb, elements_needed); in qeth_l3_hard_start_xmit()
3073 if (card->info.type != QETH_CARD_TYPE_IQD) { in qeth_l3_hard_start_xmit()
3084 rc = qeth_do_send_packet(card, queue, new_skb, hdr, in qeth_l3_hard_start_xmit()
3087 rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr, in qeth_l3_hard_start_xmit()
3091 card->stats.tx_packets++; in qeth_l3_hard_start_xmit()
3092 card->stats.tx_bytes += tx_bytes; in qeth_l3_hard_start_xmit()
3095 if (card->options.performance_stats) { in qeth_l3_hard_start_xmit()
3097 card->perf_stats.large_send_bytes += tx_bytes; in qeth_l3_hard_start_xmit()
3098 card->perf_stats.large_send_cnt++; in qeth_l3_hard_start_xmit()
3101 card->perf_stats.sg_skbs_sent++; in qeth_l3_hard_start_xmit()
3103 card->perf_stats.sg_frags_sent += nr_frags + 1; in qeth_l3_hard_start_xmit()
3120 if (card->options.performance_stats) in qeth_l3_hard_start_xmit()
3121 card->perf_stats.outbound_time += qeth_get_micros() - in qeth_l3_hard_start_xmit()
3122 card->perf_stats.outbound_start_time; in qeth_l3_hard_start_xmit()
3126 card->stats.tx_dropped++; in qeth_l3_hard_start_xmit()
3127 card->stats.tx_errors++; in qeth_l3_hard_start_xmit()
3137 struct qeth_card *card = dev->ml_priv; in __qeth_l3_open() local
3140 QETH_CARD_TEXT(card, 4, "qethopen"); in __qeth_l3_open()
3141 if (card->state == CARD_STATE_UP) in __qeth_l3_open()
3143 if (card->state != CARD_STATE_SOFTSETUP) in __qeth_l3_open()
3145 card->data.state = CH_STATE_UP; in __qeth_l3_open()
3146 card->state = CARD_STATE_UP; in __qeth_l3_open()
3149 if (qdio_stop_irq(card->data.ccwdev, 0) >= 0) { in __qeth_l3_open()
3150 napi_enable(&card->napi); in __qeth_l3_open()
3151 napi_schedule(&card->napi); in __qeth_l3_open()
3159 struct qeth_card *card = dev->ml_priv; in qeth_l3_open() local
3161 QETH_CARD_TEXT(card, 5, "qethope_"); in qeth_l3_open()
3162 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { in qeth_l3_open()
3163 QETH_CARD_TEXT(card, 3, "openREC"); in qeth_l3_open()
3171 struct qeth_card *card = dev->ml_priv; in qeth_l3_stop() local
3173 QETH_CARD_TEXT(card, 4, "qethstop"); in qeth_l3_stop()
3175 if (card->state == CARD_STATE_UP) { in qeth_l3_stop()
3176 card->state = CARD_STATE_SOFTSETUP; in qeth_l3_stop()
3177 napi_disable(&card->napi); in qeth_l3_stop()
3185 struct qeth_card *card = dev->ml_priv; in qeth_l3_fix_features() local
3187 if (!qeth_is_supported(card, IPA_OUTBOUND_CHECKSUM)) in qeth_l3_fix_features()
3189 if (!qeth_is_supported(card, IPA_OUTBOUND_TSO)) in qeth_l3_fix_features()
3191 if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM)) in qeth_l3_fix_features()
3200 struct qeth_card *card = dev->ml_priv; in qeth_l3_set_features() local
3207 if (card->state == CARD_STATE_DOWN || in qeth_l3_set_features()
3208 card->state == CARD_STATE_RECOVER) in qeth_l3_set_features()
3211 err = qeth_l3_set_rx_csum(card, features & NETIF_F_RXCSUM); in qeth_l3_set_features()
3284 static int qeth_l3_setup_netdev(struct qeth_card *card) in qeth_l3_setup_netdev() argument
3288 if (card->info.type == QETH_CARD_TYPE_OSD || in qeth_l3_setup_netdev()
3289 card->info.type == QETH_CARD_TYPE_OSX) { in qeth_l3_setup_netdev()
3290 if ((card->info.link_type == QETH_LINK_TYPE_LANE_TR) || in qeth_l3_setup_netdev()
3291 (card->info.link_type == QETH_LINK_TYPE_HSTR)) { in qeth_l3_setup_netdev()
3295 card->dev = alloc_etherdev(0); in qeth_l3_setup_netdev()
3296 if (!card->dev) in qeth_l3_setup_netdev()
3298 card->dev->netdev_ops = &qeth_l3_osa_netdev_ops; in qeth_l3_setup_netdev()
3301 qeth_l3_get_unique_id(card); in qeth_l3_setup_netdev()
3302 if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD)) in qeth_l3_setup_netdev()
3303 card->dev->dev_id = card->info.unique_id & in qeth_l3_setup_netdev()
3305 if (!card->info.guestlan) { in qeth_l3_setup_netdev()
3306 card->dev->hw_features = NETIF_F_SG | in qeth_l3_setup_netdev()
3309 card->dev->features = NETIF_F_RXCSUM; in qeth_l3_setup_netdev()
3312 } else if (card->info.type == QETH_CARD_TYPE_IQD) { in qeth_l3_setup_netdev()
3313 card->dev = alloc_netdev(0, "hsi%d", NET_NAME_UNKNOWN, in qeth_l3_setup_netdev()
3315 if (!card->dev) in qeth_l3_setup_netdev()
3317 card->dev->flags |= IFF_NOARP; in qeth_l3_setup_netdev()
3318 card->dev->netdev_ops = &qeth_l3_netdev_ops; in qeth_l3_setup_netdev()
3319 rc = qeth_l3_iqd_read_initial_mac(card); in qeth_l3_setup_netdev()
3322 if (card->options.hsuid[0]) in qeth_l3_setup_netdev()
3323 memcpy(card->dev->perm_addr, card->options.hsuid, 9); in qeth_l3_setup_netdev()
3327 card->dev->ml_priv = card; in qeth_l3_setup_netdev()
3328 card->dev->watchdog_timeo = QETH_TX_TIMEOUT; in qeth_l3_setup_netdev()
3329 card->dev->mtu = card->info.initial_mtu; in qeth_l3_setup_netdev()
3330 card->dev->ethtool_ops = &qeth_l3_ethtool_ops; in qeth_l3_setup_netdev()
3331 card->dev->features |= NETIF_F_HW_VLAN_CTAG_TX | in qeth_l3_setup_netdev()
3334 netif_keep_dst(card->dev); in qeth_l3_setup_netdev()
3335 card->dev->gso_max_size = 15 * PAGE_SIZE; in qeth_l3_setup_netdev()
3337 SET_NETDEV_DEV(card->dev, &card->gdev->dev); in qeth_l3_setup_netdev()
3338 netif_napi_add(card->dev, &card->napi, qeth_l3_poll, QETH_NAPI_WEIGHT); in qeth_l3_setup_netdev()
3339 return register_netdev(card->dev); in qeth_l3_setup_netdev()
3344 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l3_probe_device() local
3347 card->options.layer2 = 0; in qeth_l3_probe_device()
3348 card->info.hwtrap = 0; in qeth_l3_probe_device()
3354 struct qeth_card *card = dev_get_drvdata(&cgdev->dev); in qeth_l3_remove_device() local
3358 qeth_set_allowed_threads(card, 0, 1); in qeth_l3_remove_device()
3359 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); in qeth_l3_remove_device()
3364 if (card->dev) { in qeth_l3_remove_device()
3365 unregister_netdev(card->dev); in qeth_l3_remove_device()
3366 card->dev = NULL; in qeth_l3_remove_device()
3369 qeth_l3_clear_ip_list(card, 0); in qeth_l3_remove_device()
3370 qeth_l3_clear_ipato_list(card); in qeth_l3_remove_device()
3376 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in __qeth_l3_set_online() local
3380 mutex_lock(&card->discipline_mutex); in __qeth_l3_set_online()
3381 mutex_lock(&card->conf_mutex); in __qeth_l3_set_online()
3383 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); in __qeth_l3_set_online()
3385 recover_flag = card->state; in __qeth_l3_set_online()
3386 rc = qeth_core_hardsetup_card(card); in __qeth_l3_set_online()
3393 if (!card->dev && qeth_l3_setup_netdev(card)) { in __qeth_l3_set_online()
3398 if (qeth_is_diagass_supported(card, QETH_DIAGS_CMD_TRAP)) { in __qeth_l3_set_online()
3399 if (card->info.hwtrap && in __qeth_l3_set_online()
3400 qeth_hw_trap(card, QETH_DIAGS_TRAP_ARM)) in __qeth_l3_set_online()
3401 card->info.hwtrap = 0; in __qeth_l3_set_online()
3403 card->info.hwtrap = 0; in __qeth_l3_set_online()
3405 card->state = CARD_STATE_HARDSETUP; in __qeth_l3_set_online()
3406 memset(&card->rx, 0, sizeof(struct qeth_rx)); in __qeth_l3_set_online()
3407 qeth_print_status_message(card); in __qeth_l3_set_online()
3412 rc = qeth_send_startlan(card); in __qeth_l3_set_online()
3416 dev_warn(&card->gdev->dev, in __qeth_l3_set_online()
3418 card->lan_online = 0; in __qeth_l3_set_online()
3424 card->lan_online = 1; in __qeth_l3_set_online()
3427 rc = qeth_l3_setadapter_parms(card); in __qeth_l3_set_online()
3430 if (!card->options.sniffer) { in __qeth_l3_set_online()
3431 rc = qeth_l3_start_ipassists(card); in __qeth_l3_set_online()
3436 rc = qeth_l3_setrouting_v4(card); in __qeth_l3_set_online()
3439 rc = qeth_l3_setrouting_v6(card); in __qeth_l3_set_online()
3443 netif_tx_disable(card->dev); in __qeth_l3_set_online()
3445 rc = qeth_init_qdio_queues(card); in __qeth_l3_set_online()
3451 card->state = CARD_STATE_SOFTSETUP; in __qeth_l3_set_online()
3453 qeth_set_allowed_threads(card, 0xffffffff, 0); in __qeth_l3_set_online()
3454 qeth_l3_set_ip_addr_list(card); in __qeth_l3_set_online()
3455 if (card->lan_online) in __qeth_l3_set_online()
3456 netif_carrier_on(card->dev); in __qeth_l3_set_online()
3458 netif_carrier_off(card->dev); in __qeth_l3_set_online()
3462 __qeth_l3_open(card->dev); in __qeth_l3_set_online()
3464 dev_open(card->dev); in __qeth_l3_set_online()
3465 qeth_l3_set_multicast_list(card->dev); in __qeth_l3_set_online()
3468 qeth_trace_features(card); in __qeth_l3_set_online()
3471 mutex_unlock(&card->conf_mutex); in __qeth_l3_set_online()
3472 mutex_unlock(&card->discipline_mutex); in __qeth_l3_set_online()
3475 qeth_l3_stop_card(card, 0); in __qeth_l3_set_online()
3476 ccw_device_set_offline(CARD_DDEV(card)); in __qeth_l3_set_online()
3477 ccw_device_set_offline(CARD_WDEV(card)); in __qeth_l3_set_online()
3478 ccw_device_set_offline(CARD_RDEV(card)); in __qeth_l3_set_online()
3479 qdio_free(CARD_DDEV(card)); in __qeth_l3_set_online()
3481 card->state = CARD_STATE_RECOVER; in __qeth_l3_set_online()
3483 card->state = CARD_STATE_DOWN; in __qeth_l3_set_online()
3484 mutex_unlock(&card->conf_mutex); in __qeth_l3_set_online()
3485 mutex_unlock(&card->discipline_mutex); in __qeth_l3_set_online()
3497 struct qeth_card *card = dev_get_drvdata(&cgdev->dev); in __qeth_l3_set_offline() local
3501 mutex_lock(&card->discipline_mutex); in __qeth_l3_set_offline()
3502 mutex_lock(&card->conf_mutex); in __qeth_l3_set_offline()
3504 QETH_DBF_HEX(SETUP, 3, &card, sizeof(void *)); in __qeth_l3_set_offline()
3506 if (card->dev && netif_carrier_ok(card->dev)) in __qeth_l3_set_offline()
3507 netif_carrier_off(card->dev); in __qeth_l3_set_offline()
3508 recover_flag = card->state; in __qeth_l3_set_offline()
3509 if ((!recovery_mode && card->info.hwtrap) || card->info.hwtrap == 2) { in __qeth_l3_set_offline()
3510 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); in __qeth_l3_set_offline()
3511 card->info.hwtrap = 1; in __qeth_l3_set_offline()
3513 qeth_l3_stop_card(card, recovery_mode); in __qeth_l3_set_offline()
3514 if ((card->options.cq == QETH_CQ_ENABLED) && card->dev) { in __qeth_l3_set_offline()
3516 call_netdevice_notifiers(NETDEV_REBOOT, card->dev); in __qeth_l3_set_offline()
3519 rc = ccw_device_set_offline(CARD_DDEV(card)); in __qeth_l3_set_offline()
3520 rc2 = ccw_device_set_offline(CARD_WDEV(card)); in __qeth_l3_set_offline()
3521 rc3 = ccw_device_set_offline(CARD_RDEV(card)); in __qeth_l3_set_offline()
3526 qdio_free(CARD_DDEV(card)); in __qeth_l3_set_offline()
3528 card->state = CARD_STATE_RECOVER; in __qeth_l3_set_offline()
3531 mutex_unlock(&card->conf_mutex); in __qeth_l3_set_offline()
3532 mutex_unlock(&card->discipline_mutex); in __qeth_l3_set_offline()
3543 struct qeth_card *card; in qeth_l3_recover() local
3546 card = (struct qeth_card *) ptr; in qeth_l3_recover()
3547 QETH_CARD_TEXT(card, 2, "recover1"); in qeth_l3_recover()
3548 QETH_CARD_HEX(card, 2, &card, sizeof(void *)); in qeth_l3_recover()
3549 if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD)) in qeth_l3_recover()
3551 QETH_CARD_TEXT(card, 2, "recover2"); in qeth_l3_recover()
3552 dev_warn(&card->gdev->dev, in qeth_l3_recover()
3554 qeth_set_recovery_task(card); in qeth_l3_recover()
3555 __qeth_l3_set_offline(card->gdev, 1); in qeth_l3_recover()
3556 rc = __qeth_l3_set_online(card->gdev, 1); in qeth_l3_recover()
3558 dev_info(&card->gdev->dev, in qeth_l3_recover()
3561 qeth_close_dev(card); in qeth_l3_recover()
3562 dev_warn(&card->gdev->dev, "The qeth device driver " in qeth_l3_recover()
3565 qeth_clear_recovery_task(card); in qeth_l3_recover()
3566 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); in qeth_l3_recover()
3567 qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD); in qeth_l3_recover()
3573 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l3_shutdown() local
3574 qeth_set_allowed_threads(card, 0, 1); in qeth_l3_shutdown()
3575 if ((gdev->state == CCWGROUP_ONLINE) && card->info.hwtrap) in qeth_l3_shutdown()
3576 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); in qeth_l3_shutdown()
3577 qeth_qdio_clear_card(card, 0); in qeth_l3_shutdown()
3578 qeth_clear_qdio_buffers(card); in qeth_l3_shutdown()
3579 qdio_free(CARD_DDEV(card)); in qeth_l3_shutdown()
3584 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l3_pm_suspend() local
3586 if (card->dev) in qeth_l3_pm_suspend()
3587 netif_device_detach(card->dev); in qeth_l3_pm_suspend()
3588 qeth_set_allowed_threads(card, 0, 1); in qeth_l3_pm_suspend()
3589 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); in qeth_l3_pm_suspend()
3592 if (card->state == CARD_STATE_UP) { in qeth_l3_pm_suspend()
3593 if (card->info.hwtrap) in qeth_l3_pm_suspend()
3594 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); in qeth_l3_pm_suspend()
3595 __qeth_l3_set_offline(card->gdev, 1); in qeth_l3_pm_suspend()
3597 __qeth_l3_set_offline(card->gdev, 0); in qeth_l3_pm_suspend()
3603 struct qeth_card *card = dev_get_drvdata(&gdev->dev); in qeth_l3_pm_resume() local
3609 if (card->state == CARD_STATE_RECOVER) { in qeth_l3_pm_resume()
3610 rc = __qeth_l3_set_online(card->gdev, 1); in qeth_l3_pm_resume()
3613 dev_close(card->dev); in qeth_l3_pm_resume()
3617 rc = __qeth_l3_set_online(card->gdev, 0); in qeth_l3_pm_resume()
3619 qeth_set_allowed_threads(card, 0xffffffff, 0); in qeth_l3_pm_resume()
3620 if (card->dev) in qeth_l3_pm_resume()
3621 netif_device_attach(card->dev); in qeth_l3_pm_resume()
3623 dev_warn(&card->gdev->dev, "The qeth device driver " in qeth_l3_pm_resume()
3629 static int qeth_l3_control_event(struct qeth_card *card, in qeth_l3_control_event() argument
3658 struct qeth_card *card; in qeth_l3_ip_event() local
3663 card = qeth_l3_get_card_from_dev(dev); in qeth_l3_ip_event()
3664 if (!card) in qeth_l3_ip_event()
3666 QETH_CARD_TEXT(card, 3, "ipevent"); in qeth_l3_ip_event()
3678 if (!qeth_l3_add_ip(card, addr)) in qeth_l3_ip_event()
3682 if (!qeth_l3_delete_ip(card, addr)) in qeth_l3_ip_event()
3688 qeth_l3_set_ip_addr_list(card); in qeth_l3_ip_event()
3708 struct qeth_card *card; in qeth_l3_ip6_event() local
3710 card = qeth_l3_get_card_from_dev(dev); in qeth_l3_ip6_event()
3711 if (!card) in qeth_l3_ip6_event()
3713 QETH_CARD_TEXT(card, 3, "ip6event"); in qeth_l3_ip6_event()
3714 if (!qeth_is_supported(card, IPA_IPV6)) in qeth_l3_ip6_event()
3727 if (!qeth_l3_add_ip(card, addr)) in qeth_l3_ip6_event()
3731 if (!qeth_l3_delete_ip(card, addr)) in qeth_l3_ip6_event()
3737 qeth_l3_set_ip_addr_list(card); in qeth_l3_ip6_event()