Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 's390-qeth-next'

Julian Wiedmann says:

====================
s390/qeth: updates 2020-01-25

please apply the following patch series for qeth to your net-next tree.

This brings a number of cleanups for the init/teardown code paths.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+180 -273
+16 -9
drivers/s390/net/qeth_core.h
··· 558 558 */ 559 559 enum qeth_card_states { 560 560 CARD_STATE_DOWN, 561 - CARD_STATE_HARDSETUP, 562 561 CARD_STATE_SOFTSETUP, 563 562 }; 564 563 ··· 607 608 long timeout; 608 609 unsigned char *data; 609 610 void (*finalize)(struct qeth_card *card, struct qeth_cmd_buffer *iob); 611 + bool (*match)(struct qeth_cmd_buffer *iob, 612 + struct qeth_cmd_buffer *reply); 610 613 void (*callback)(struct qeth_card *card, struct qeth_cmd_buffer *iob, 611 614 unsigned int data_length); 612 615 int rc; ··· 617 616 static inline void qeth_get_cmd(struct qeth_cmd_buffer *iob) 618 617 { 619 618 refcount_inc(&iob->ref_count); 619 + } 620 + 621 + static inline struct qeth_ipa_cmd *__ipa_reply(struct qeth_cmd_buffer *iob) 622 + { 623 + if (!IS_IPA(iob->data)) 624 + return NULL; 625 + 626 + return (struct qeth_ipa_cmd *) PDU_ENCAPSULATION(iob->data); 620 627 } 621 628 622 629 static inline struct qeth_ipa_cmd *__ipa_cmd(struct qeth_cmd_buffer *iob) ··· 736 727 737 728 struct qeth_discipline { 738 729 const struct device_type *devtype; 739 - int (*recover)(void *ptr); 740 730 int (*setup) (struct ccwgroup_device *); 741 731 void (*remove) (struct ccwgroup_device *); 742 - int (*set_online) (struct ccwgroup_device *); 743 - int (*set_offline) (struct ccwgroup_device *); 732 + int (*set_online)(struct qeth_card *card); 733 + void (*set_offline)(struct qeth_card *card); 744 734 int (*do_ioctl)(struct net_device *dev, struct ifreq *rq, int cmd); 745 735 int (*control_event_handler)(struct qeth_card *card, 746 736 struct qeth_ipa_cmd *cmd); ··· 995 987 struct qeth_card *qeth_get_card_by_busid(char *bus_id); 996 988 void qeth_set_allowed_threads(struct qeth_card *, unsigned long , int); 997 989 int qeth_threads_running(struct qeth_card *, unsigned long); 998 - int qeth_do_run_thread(struct qeth_card *, unsigned long); 999 - void qeth_clear_thread_start_bit(struct qeth_card *, unsigned long); 1000 - void qeth_clear_thread_running_bit(struct qeth_card *, unsigned long); 1001 990 int qeth_core_hardsetup_card(struct qeth_card *card, bool *carrier_ok); 1002 991 int qeth_stop_channel(struct qeth_channel *channel); 992 + int qeth_set_offline(struct qeth_card *card, bool resetting); 1003 993 1004 994 void qeth_print_status_message(struct qeth_card *); 1005 - int qeth_init_qdio_queues(struct qeth_card *); 1006 995 int qeth_send_ipa_cmd(struct qeth_card *, struct qeth_cmd_buffer *, 1007 996 int (*reply_cb) 1008 997 (struct qeth_card *, struct qeth_reply *, unsigned long), ··· 1032 1027 int qeth_setadpparms_change_macaddr(struct qeth_card *); 1033 1028 void qeth_tx_timeout(struct net_device *, unsigned int txqueue); 1034 1029 void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, 1035 - u16 cmd_length); 1030 + u16 cmd_length, 1031 + bool (*match)(struct qeth_cmd_buffer *iob, 1032 + struct qeth_cmd_buffer *reply)); 1036 1033 int qeth_query_switch_attributes(struct qeth_card *card, 1037 1034 struct qeth_switch_info *sw_info); 1038 1035 int qeth_query_card_info(struct qeth_card *card,
+127 -29
drivers/s390/net/qeth_core_main.c
··· 247 247 { 248 248 QETH_CARD_TEXT(card, 2, "realcbp"); 249 249 250 - if (card->state != CARD_STATE_DOWN) 251 - return -EPERM; 252 - 253 250 /* TODO: steel/add buffers from/to a running card's buffer pool (?) */ 254 251 qeth_clear_working_pool_list(card); 255 252 qeth_free_buffer_pool(card); ··· 745 748 goto out; 746 749 } 747 750 748 - if (IS_IPA(iob->data)) { 749 - cmd = (struct qeth_ipa_cmd *) PDU_ENCAPSULATION(iob->data); 751 + cmd = __ipa_reply(iob); 752 + if (cmd) { 750 753 cmd = qeth_check_ipa_data(card, cmd); 751 754 if (!cmd) 752 755 goto out; ··· 755 758 card->osn_info.assist_cb(card->dev, cmd); 756 759 goto out; 757 760 } 758 - } else { 759 - /* non-IPA commands should only flow during initialization */ 760 - if (card->state != CARD_STATE_DOWN) 761 - goto out; 762 761 } 763 762 764 763 /* match against pending cmd requests */ 765 764 spin_lock_irqsave(&card->lock, flags); 766 765 list_for_each_entry(tmp, &card->cmd_waiter_list, list) { 767 - if (!IS_IPA(tmp->data) || 768 - __ipa_cmd(tmp)->hdr.seqno == cmd->hdr.seqno) { 766 + if (tmp->match && tmp->match(tmp, iob)) { 769 767 request = tmp; 770 768 /* take the object outside the lock */ 771 769 qeth_get_cmd(request); ··· 815 823 return 0; 816 824 } 817 825 818 - void qeth_clear_thread_start_bit(struct qeth_card *card, unsigned long thread) 826 + static void qeth_clear_thread_start_bit(struct qeth_card *card, 827 + unsigned long thread) 819 828 { 820 829 unsigned long flags; 821 830 ··· 825 832 spin_unlock_irqrestore(&card->thread_mask_lock, flags); 826 833 wake_up(&card->wait_q); 827 834 } 828 - EXPORT_SYMBOL_GPL(qeth_clear_thread_start_bit); 829 835 830 - void qeth_clear_thread_running_bit(struct qeth_card *card, unsigned long thread) 836 + static void qeth_clear_thread_running_bit(struct qeth_card *card, 837 + unsigned long thread) 831 838 { 832 839 unsigned long flags; 833 840 ··· 836 843 spin_unlock_irqrestore(&card->thread_mask_lock, flags); 837 844 wake_up_all(&card->wait_q); 838 845 } 839 - EXPORT_SYMBOL_GPL(qeth_clear_thread_running_bit); 840 846 841 847 static int __qeth_do_run_thread(struct qeth_card *card, unsigned long thread) 842 848 { ··· 856 864 return rc; 857 865 } 858 866 859 - int qeth_do_run_thread(struct qeth_card *card, unsigned long thread) 867 + static int qeth_do_run_thread(struct qeth_card *card, unsigned long thread) 860 868 { 861 869 int rc = 0; 862 870 ··· 864 872 (rc = __qeth_do_run_thread(card, thread)) >= 0); 865 873 return rc; 866 874 } 867 - EXPORT_SYMBOL_GPL(qeth_do_run_thread); 868 875 869 876 void qeth_schedule_recovery(struct qeth_card *card) 870 877 { ··· 871 880 if (qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD) == 0) 872 881 schedule_work(&card->kernel_thread_starter); 873 882 } 874 - EXPORT_SYMBOL_GPL(qeth_schedule_recovery); 875 883 876 884 static int qeth_get_problem(struct qeth_card *card, struct ccw_device *cdev, 877 885 struct irb *irb) ··· 1277 1287 return rc; 1278 1288 } 1279 1289 1290 + static int qeth_do_reset(void *data); 1280 1291 static void qeth_start_kernel_thread(struct work_struct *work) 1281 1292 { 1282 1293 struct task_struct *ts; ··· 1289 1298 card->write.state != CH_STATE_UP) 1290 1299 return; 1291 1300 if (qeth_do_start_thread(card, QETH_RECOVER_THREAD)) { 1292 - ts = kthread_run(card->discipline->recover, (void *)card, 1293 - "qeth_recover"); 1301 + ts = kthread_run(qeth_do_reset, card, "qeth_recover"); 1294 1302 if (IS_ERR(ts)) { 1295 1303 qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); 1296 1304 qeth_clear_thread_running_bit(card, ··· 1680 1690 iob->callback = qeth_release_buffer_cb; 1681 1691 } 1682 1692 1693 + static bool qeth_mpc_match_reply(struct qeth_cmd_buffer *iob, 1694 + struct qeth_cmd_buffer *reply) 1695 + { 1696 + /* MPC cmds are issued strictly in sequence. */ 1697 + return !IS_IPA(reply->data); 1698 + } 1699 + 1683 1700 static struct qeth_cmd_buffer *qeth_mpc_alloc_cmd(struct qeth_card *card, 1684 1701 void *data, 1685 1702 unsigned int data_length) ··· 1701 1704 qeth_setup_ccw(__ccw_from_cmd(iob), CCW_CMD_WRITE, 0, data_length, 1702 1705 iob->data); 1703 1706 iob->finalize = qeth_mpc_finalize_cmd; 1707 + iob->match = qeth_mpc_match_reply; 1704 1708 return iob; 1705 1709 } 1706 1710 ··· 2663 2665 return card->ssqd.mmwc ? card->ssqd.mmwc : 1; 2664 2666 } 2665 2667 2666 - int qeth_init_qdio_queues(struct qeth_card *card) 2668 + static int qeth_init_qdio_queues(struct qeth_card *card) 2667 2669 { 2668 2670 unsigned int i; 2669 2671 int rc; ··· 2711 2713 } 2712 2714 return 0; 2713 2715 } 2714 - EXPORT_SYMBOL_GPL(qeth_init_qdio_queues); 2715 2716 2716 2717 static void qeth_ipa_finalize_cmd(struct qeth_card *card, 2717 2718 struct qeth_cmd_buffer *iob) ··· 2722 2725 } 2723 2726 2724 2727 void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, 2725 - u16 cmd_length) 2728 + u16 cmd_length, 2729 + bool (*match)(struct qeth_cmd_buffer *iob, 2730 + struct qeth_cmd_buffer *reply)) 2726 2731 { 2727 2732 u8 prot_type = qeth_mpc_select_prot_type(card); 2728 2733 u16 total_length = iob->length; ··· 2732 2733 qeth_setup_ccw(__ccw_from_cmd(iob), CCW_CMD_WRITE, 0, total_length, 2733 2734 iob->data); 2734 2735 iob->finalize = qeth_ipa_finalize_cmd; 2736 + iob->match = match; 2735 2737 2736 2738 memcpy(iob->data, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE); 2737 2739 memcpy(QETH_IPA_PDU_LEN_TOTAL(iob->data), &total_length, 2); ··· 2744 2744 memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &cmd_length, 2); 2745 2745 } 2746 2746 EXPORT_SYMBOL_GPL(qeth_prepare_ipa_cmd); 2747 + 2748 + static bool qeth_ipa_match_reply(struct qeth_cmd_buffer *iob, 2749 + struct qeth_cmd_buffer *reply) 2750 + { 2751 + struct qeth_ipa_cmd *ipa_reply = __ipa_reply(reply); 2752 + 2753 + return ipa_reply && (__ipa_cmd(iob)->hdr.seqno == ipa_reply->hdr.seqno); 2754 + } 2747 2755 2748 2756 struct qeth_cmd_buffer *qeth_ipa_alloc_cmd(struct qeth_card *card, 2749 2757 enum qeth_ipa_cmds cmd_code, ··· 2768 2760 if (!iob) 2769 2761 return NULL; 2770 2762 2771 - qeth_prepare_ipa_cmd(card, iob, data_length); 2763 + qeth_prepare_ipa_cmd(card, iob, data_length, qeth_ipa_match_reply); 2772 2764 2773 2765 hdr = &__ipa_cmd(iob)->hdr; 2774 2766 hdr->command = cmd_code; ··· 3104 3096 } 3105 3097 return qeth_send_ipa_cmd(card, iob, qeth_hw_trap_cb, NULL); 3106 3098 } 3107 - EXPORT_SYMBOL_GPL(qeth_hw_trap); 3108 3099 3109 3100 static int qeth_check_qdio_errors(struct qeth_card *card, 3110 3101 struct qdio_buffer *buf, ··· 5033 5026 if (rc) 5034 5027 goto out; 5035 5028 5029 + rc = qeth_init_qdio_queues(card); 5030 + if (rc) { 5031 + QETH_CARD_TEXT_(card, 2, "9err%d", rc); 5032 + goto out; 5033 + } 5034 + 5036 5035 return 0; 5037 5036 out: 5038 5037 dev_warn(&card->gdev->dev, "The qeth device driver failed to recover " ··· 5048 5035 return rc; 5049 5036 } 5050 5037 EXPORT_SYMBOL_GPL(qeth_core_hardsetup_card); 5038 + 5039 + static int qeth_set_online(struct qeth_card *card) 5040 + { 5041 + int rc; 5042 + 5043 + mutex_lock(&card->discipline_mutex); 5044 + mutex_lock(&card->conf_mutex); 5045 + QETH_CARD_TEXT(card, 2, "setonlin"); 5046 + 5047 + rc = card->discipline->set_online(card); 5048 + 5049 + mutex_unlock(&card->conf_mutex); 5050 + mutex_unlock(&card->discipline_mutex); 5051 + 5052 + return rc; 5053 + } 5054 + 5055 + int qeth_set_offline(struct qeth_card *card, bool resetting) 5056 + { 5057 + int rc, rc2, rc3; 5058 + 5059 + mutex_lock(&card->discipline_mutex); 5060 + mutex_lock(&card->conf_mutex); 5061 + QETH_CARD_TEXT(card, 3, "setoffl"); 5062 + 5063 + if ((!resetting && card->info.hwtrap) || card->info.hwtrap == 2) { 5064 + qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); 5065 + card->info.hwtrap = 1; 5066 + } 5067 + 5068 + rtnl_lock(); 5069 + card->info.open_when_online = card->dev->flags & IFF_UP; 5070 + dev_close(card->dev); 5071 + netif_device_detach(card->dev); 5072 + netif_carrier_off(card->dev); 5073 + rtnl_unlock(); 5074 + 5075 + card->discipline->set_offline(card); 5076 + 5077 + rc = qeth_stop_channel(&card->data); 5078 + rc2 = qeth_stop_channel(&card->write); 5079 + rc3 = qeth_stop_channel(&card->read); 5080 + if (!rc) 5081 + rc = (rc2) ? rc2 : rc3; 5082 + if (rc) 5083 + QETH_CARD_TEXT_(card, 2, "1err%d", rc); 5084 + qdio_free(CARD_DDEV(card)); 5085 + 5086 + /* let user_space know that device is offline */ 5087 + kobject_uevent(&card->gdev->dev.kobj, KOBJ_CHANGE); 5088 + 5089 + mutex_unlock(&card->conf_mutex); 5090 + mutex_unlock(&card->discipline_mutex); 5091 + return 0; 5092 + } 5093 + EXPORT_SYMBOL_GPL(qeth_set_offline); 5094 + 5095 + static int qeth_do_reset(void *data) 5096 + { 5097 + struct qeth_card *card = data; 5098 + int rc; 5099 + 5100 + QETH_CARD_TEXT(card, 2, "recover1"); 5101 + if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD)) 5102 + return 0; 5103 + QETH_CARD_TEXT(card, 2, "recover2"); 5104 + dev_warn(&card->gdev->dev, 5105 + "A recovery process has been started for the device\n"); 5106 + 5107 + qeth_set_offline(card, true); 5108 + rc = qeth_set_online(card); 5109 + if (!rc) { 5110 + dev_info(&card->gdev->dev, 5111 + "Device successfully recovered!\n"); 5112 + } else { 5113 + ccwgroup_set_offline(card->gdev); 5114 + dev_warn(&card->gdev->dev, 5115 + "The qeth device driver failed to recover an error on the device\n"); 5116 + } 5117 + qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); 5118 + qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD); 5119 + return 0; 5120 + } 5051 5121 5052 5122 #if IS_ENABLED(CONFIG_QETH_L3) 5053 5123 static void qeth_l3_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, ··· 6068 5972 goto err; 6069 5973 } 6070 5974 } 6071 - rc = card->discipline->set_online(gdev); 5975 + 5976 + rc = qeth_set_online(card); 6072 5977 err: 6073 5978 return rc; 6074 5979 } ··· 6077 5980 static int qeth_core_set_offline(struct ccwgroup_device *gdev) 6078 5981 { 6079 5982 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 6080 - return card->discipline->set_offline(gdev); 5983 + 5984 + return qeth_set_offline(card, false); 6081 5985 } 6082 5986 6083 5987 static void qeth_core_shutdown(struct ccwgroup_device *gdev) ··· 6101 6003 if (gdev->state == CCWGROUP_OFFLINE) 6102 6004 return 0; 6103 6005 6104 - card->discipline->set_offline(gdev); 6006 + qeth_set_offline(card, false); 6105 6007 return 0; 6106 6008 } 6107 6009 ··· 6110 6012 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 6111 6013 int rc; 6112 6014 6113 - rc = card->discipline->set_online(gdev); 6015 + rc = qeth_set_online(card); 6114 6016 6115 6017 qeth_set_allowed_threads(card, 0xffffffff, 0); 6116 6018 if (rc)
-2
drivers/s390/net/qeth_core_sys.c
··· 24 24 switch (card->state) { 25 25 case CARD_STATE_DOWN: 26 26 return sprintf(buf, "DOWN\n"); 27 - case CARD_STATE_HARDSETUP: 28 - return sprintf(buf, "HARDSETUP\n"); 29 27 case CARD_STATE_SOFTSETUP: 30 28 if (card->dev->flags & IFF_UP) 31 29 return sprintf(buf, "UP (LAN %s)\n",
-1
drivers/s390/net/qeth_l2.h
··· 13 13 14 14 int qeth_l2_create_device_attributes(struct device *); 15 15 void qeth_l2_remove_device_attributes(struct device *); 16 - void qeth_l2_setup_bridgeport_attrs(struct qeth_card *card); 17 16 int qeth_bridgeport_query_ports(struct qeth_card *card, 18 17 enum qeth_sbp_roles *role, 19 18 enum qeth_sbp_states *state);
+29 -97
drivers/s390/net/qeth_l2_main.c
··· 24 24 #include "qeth_core.h" 25 25 #include "qeth_l2.h" 26 26 27 - static int qeth_l2_set_offline(struct ccwgroup_device *); 28 27 static void qeth_bridgeport_query_support(struct qeth_card *card); 29 28 static void qeth_bridge_state_change(struct qeth_card *card, 30 29 struct qeth_ipa_cmd *cmd); ··· 283 284 284 285 if (card->state == CARD_STATE_SOFTSETUP) { 285 286 qeth_clear_ipacmd_list(card); 286 - card->state = CARD_STATE_HARDSETUP; 287 - } 288 - if (card->state == CARD_STATE_HARDSETUP) { 289 287 qeth_drain_output_queues(card); 290 - qeth_clear_working_pool_list(card); 291 288 card->state = CARD_STATE_DOWN; 292 289 } 293 290 294 291 qeth_qdio_clear_card(card, 0); 292 + qeth_clear_working_pool_list(card); 295 293 flush_workqueue(card->event_wq); 296 294 card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; 297 295 card->info.promisc_mode = 0; ··· 606 610 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); 607 611 608 612 if (cgdev->state == CCWGROUP_ONLINE) 609 - qeth_l2_set_offline(cgdev); 613 + qeth_set_offline(card, false); 610 614 611 615 cancel_work_sync(&card->close_dev_work); 612 616 if (qeth_netdev_is_registered(card->dev)) ··· 724 728 sizeof(card->options.vnicc.sup_chars)); 725 729 } 726 730 727 - static int qeth_l2_set_online(struct ccwgroup_device *gdev) 731 + static void qeth_l2_setup_bridgeport_attrs(struct qeth_card *card) 728 732 { 729 - struct qeth_card *card = dev_get_drvdata(&gdev->dev); 733 + if (!card->options.sbp.reflect_promisc && 734 + card->options.sbp.role != QETH_SBP_ROLE_NONE) { 735 + /* Conditional to avoid spurious error messages */ 736 + qeth_bridgeport_setrole(card, card->options.sbp.role); 737 + /* Let the callback function refresh the stored role value. */ 738 + qeth_bridgeport_query_ports(card, &card->options.sbp.role, 739 + NULL); 740 + } 741 + if (card->options.sbp.hostnotification) { 742 + if (qeth_bridgeport_an_set(card, 1)) 743 + card->options.sbp.hostnotification = 0; 744 + } else { 745 + qeth_bridgeport_an_set(card, 0); 746 + } 747 + } 748 + 749 + static int qeth_l2_set_online(struct qeth_card *card) 750 + { 751 + struct ccwgroup_device *gdev = card->gdev; 730 752 struct net_device *dev = card->dev; 731 753 int rc = 0; 732 754 bool carrier_ok; 733 - 734 - mutex_lock(&card->discipline_mutex); 735 - mutex_lock(&card->conf_mutex); 736 - QETH_CARD_TEXT(card, 2, "setonlin"); 737 755 738 756 rc = qeth_core_hardsetup_card(card, &carrier_ok); 739 757 if (rc) { ··· 758 748 759 749 mutex_lock(&card->sbp_lock); 760 750 qeth_bridgeport_query_support(card); 761 - if (card->options.sbp.supported_funcs) 751 + if (card->options.sbp.supported_funcs) { 752 + qeth_l2_setup_bridgeport_attrs(card); 762 753 dev_info(&card->gdev->dev, 763 - "The device represents a Bridge Capable Port\n"); 754 + "The device represents a Bridge Capable Port\n"); 755 + } 764 756 mutex_unlock(&card->sbp_lock); 765 757 766 758 qeth_l2_register_dev_addr(card); ··· 773 761 qeth_trace_features(card); 774 762 qeth_l2_trace_features(card); 775 763 776 - qeth_l2_setup_bridgeport_attrs(card); 777 - 778 - card->state = CARD_STATE_HARDSETUP; 779 764 qeth_print_status_message(card); 780 765 781 766 /* softsetup */ 782 767 QETH_CARD_TEXT(card, 2, "softsetp"); 783 768 784 - rc = qeth_init_qdio_queues(card); 785 - if (rc) { 786 - QETH_CARD_TEXT_(card, 2, "6err%d", rc); 787 - rc = -ENODEV; 788 - goto out_remove; 789 - } 790 769 card->state = CARD_STATE_SOFTSETUP; 791 770 792 771 qeth_set_allowed_threads(card, 0xffffffff, 0); ··· 804 801 } 805 802 /* let user_space know that device is online */ 806 803 kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE); 807 - mutex_unlock(&card->conf_mutex); 808 - mutex_unlock(&card->discipline_mutex); 809 804 return 0; 810 805 811 806 out_remove: ··· 812 811 qeth_stop_channel(&card->write); 813 812 qeth_stop_channel(&card->read); 814 813 qdio_free(CARD_DDEV(card)); 815 - 816 - mutex_unlock(&card->conf_mutex); 817 - mutex_unlock(&card->discipline_mutex); 818 814 return rc; 819 815 } 820 816 821 - static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev, 822 - int recovery_mode) 817 + static void qeth_l2_set_offline(struct qeth_card *card) 823 818 { 824 - struct qeth_card *card = dev_get_drvdata(&cgdev->dev); 825 - int rc = 0, rc2 = 0, rc3 = 0; 826 - 827 - mutex_lock(&card->discipline_mutex); 828 - mutex_lock(&card->conf_mutex); 829 - QETH_CARD_TEXT(card, 3, "setoffl"); 830 - 831 - if ((!recovery_mode && card->info.hwtrap) || card->info.hwtrap == 2) { 832 - qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); 833 - card->info.hwtrap = 1; 834 - } 835 - 836 - rtnl_lock(); 837 - card->info.open_when_online = card->dev->flags & IFF_UP; 838 - dev_close(card->dev); 839 - netif_device_detach(card->dev); 840 - netif_carrier_off(card->dev); 841 - rtnl_unlock(); 842 - 843 819 qeth_l2_stop_card(card); 844 - rc = qeth_stop_channel(&card->data); 845 - rc2 = qeth_stop_channel(&card->write); 846 - rc3 = qeth_stop_channel(&card->read); 847 - if (!rc) 848 - rc = (rc2) ? rc2 : rc3; 849 - if (rc) 850 - QETH_CARD_TEXT_(card, 2, "1err%d", rc); 851 - qdio_free(CARD_DDEV(card)); 852 - 853 - /* let user_space know that device is offline */ 854 - kobject_uevent(&cgdev->dev.kobj, KOBJ_CHANGE); 855 - mutex_unlock(&card->conf_mutex); 856 - mutex_unlock(&card->discipline_mutex); 857 - return 0; 858 - } 859 - 860 - static int qeth_l2_set_offline(struct ccwgroup_device *cgdev) 861 - { 862 - return __qeth_l2_set_offline(cgdev, 0); 863 - } 864 - 865 - static int qeth_l2_recover(void *ptr) 866 - { 867 - struct qeth_card *card; 868 - int rc = 0; 869 - 870 - card = (struct qeth_card *) ptr; 871 - QETH_CARD_TEXT(card, 2, "recover1"); 872 - if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD)) 873 - return 0; 874 - QETH_CARD_TEXT(card, 2, "recover2"); 875 - dev_warn(&card->gdev->dev, 876 - "A recovery process has been started for the device\n"); 877 - __qeth_l2_set_offline(card->gdev, 1); 878 - rc = qeth_l2_set_online(card->gdev); 879 - if (!rc) 880 - dev_info(&card->gdev->dev, 881 - "Device successfully recovered!\n"); 882 - else { 883 - ccwgroup_set_offline(card->gdev); 884 - dev_warn(&card->gdev->dev, "The qeth device driver " 885 - "failed to recover an error on the device\n"); 886 - } 887 - qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); 888 - qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD); 889 - return 0; 890 820 } 891 821 892 822 static int __init qeth_l2_init(void) ··· 854 922 855 923 struct qeth_discipline qeth_l2_discipline = { 856 924 .devtype = &qeth_l2_devtype, 857 - .recover = qeth_l2_recover, 858 925 .setup = qeth_l2_probe_device, 859 926 .remove = qeth_l2_remove_device, 860 927 .set_online = qeth_l2_set_online, ··· 892 961 if (!iob) 893 962 return -ENOMEM; 894 963 895 - qeth_prepare_ipa_cmd(card, iob, (u16) data_len); 964 + qeth_prepare_ipa_cmd(card, iob, (u16) data_len, NULL); 965 + 896 966 memcpy(__ipa_cmd(iob), data, data_len); 897 967 iob->callback = qeth_osn_assist_cb; 898 968 return qeth_send_ipa_cmd(card, iob, NULL, NULL);
-34
drivers/s390/net/qeth_l2_sys.c
··· 246 246 .attrs = qeth_l2_bridgeport_attrs, 247 247 }; 248 248 249 - /** 250 - * qeth_l2_setup_bridgeport_attrs() - set/restore attrs when turning online. 251 - * @card: qeth_card structure pointer 252 - * 253 - * Note: this function is called with conf_mutex held by the caller 254 - */ 255 - void qeth_l2_setup_bridgeport_attrs(struct qeth_card *card) 256 - { 257 - int rc; 258 - 259 - if (!card) 260 - return; 261 - if (!card->options.sbp.supported_funcs) 262 - return; 263 - 264 - mutex_lock(&card->sbp_lock); 265 - if (!card->options.sbp.reflect_promisc && 266 - card->options.sbp.role != QETH_SBP_ROLE_NONE) { 267 - /* Conditional to avoid spurious error messages */ 268 - qeth_bridgeport_setrole(card, card->options.sbp.role); 269 - /* Let the callback function refresh the stored role value. */ 270 - qeth_bridgeport_query_ports(card, 271 - &card->options.sbp.role, NULL); 272 - } 273 - if (card->options.sbp.hostnotification) { 274 - rc = qeth_bridgeport_an_set(card, 1); 275 - if (rc) 276 - card->options.sbp.hostnotification = 0; 277 - } else { 278 - qeth_bridgeport_an_set(card, 0); 279 - } 280 - mutex_unlock(&card->sbp_lock); 281 - } 282 - 283 249 /* VNIC CHARS support */ 284 250 285 251 /* convert sysfs attr name to VNIC characteristic */
+8 -101
drivers/s390/net/qeth_l3_main.c
··· 37 37 38 38 #include "qeth_l3.h" 39 39 40 - 41 - static int qeth_l3_set_offline(struct ccwgroup_device *); 42 40 static int qeth_l3_register_addr_entry(struct qeth_card *, 43 41 struct qeth_ipaddr *); 44 42 static int qeth_l3_deregister_addr_entry(struct qeth_card *, ··· 901 903 return rc; 902 904 } 903 905 904 - static int qeth_l3_start_ipassists(struct qeth_card *card) 906 + static void qeth_l3_start_ipassists(struct qeth_card *card) 905 907 { 906 908 QETH_CARD_TEXT(card, 3, "strtipas"); 907 909 ··· 911 913 qeth_l3_start_ipa_multicast(card); /* go on*/ 912 914 qeth_l3_start_ipa_ipv6(card); /* go on*/ 913 915 qeth_l3_start_ipa_broadcast(card); /* go on*/ 914 - return 0; 915 916 } 916 917 917 918 static int qeth_l3_iqd_read_initial_mac_cb(struct qeth_card *card, ··· 1177 1180 if (card->state == CARD_STATE_SOFTSETUP) { 1178 1181 qeth_l3_clear_ip_htable(card, 1); 1179 1182 qeth_clear_ipacmd_list(card); 1180 - card->state = CARD_STATE_HARDSETUP; 1181 - } 1182 - if (card->state == CARD_STATE_HARDSETUP) { 1183 1183 qeth_drain_output_queues(card); 1184 - qeth_clear_working_pool_list(card); 1185 1184 card->state = CARD_STATE_DOWN; 1186 1185 } 1187 1186 1188 1187 qeth_qdio_clear_card(card, 0); 1188 + qeth_clear_working_pool_list(card); 1189 1189 flush_workqueue(card->event_wq); 1190 1190 card->info.promisc_mode = 0; 1191 1191 } ··· 2038 2044 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); 2039 2045 2040 2046 if (cgdev->state == CCWGROUP_ONLINE) 2041 - qeth_l3_set_offline(cgdev); 2047 + qeth_set_offline(card, false); 2042 2048 2043 2049 cancel_work_sync(&card->close_dev_work); 2044 2050 if (qeth_netdev_is_registered(card->dev)) ··· 2050 2056 qeth_l3_clear_ipato_list(card); 2051 2057 } 2052 2058 2053 - static int qeth_l3_set_online(struct ccwgroup_device *gdev) 2059 + static int qeth_l3_set_online(struct qeth_card *card) 2054 2060 { 2055 - struct qeth_card *card = dev_get_drvdata(&gdev->dev); 2061 + struct ccwgroup_device *gdev = card->gdev; 2056 2062 struct net_device *dev = card->dev; 2057 2063 int rc = 0; 2058 2064 bool carrier_ok; 2059 - 2060 - mutex_lock(&card->discipline_mutex); 2061 - mutex_lock(&card->conf_mutex); 2062 - QETH_CARD_TEXT(card, 2, "setonlin"); 2063 2065 2064 2066 rc = qeth_core_hardsetup_card(card, &carrier_ok); 2065 2067 if (rc) { ··· 2064 2074 goto out_remove; 2065 2075 } 2066 2076 2067 - card->state = CARD_STATE_HARDSETUP; 2068 2077 qeth_print_status_message(card); 2069 2078 2070 2079 /* softsetup */ ··· 2073 2084 if (rc) 2074 2085 QETH_CARD_TEXT_(card, 2, "2err%04x", rc); 2075 2086 if (!card->options.sniffer) { 2076 - rc = qeth_l3_start_ipassists(card); 2077 - if (rc) { 2078 - QETH_CARD_TEXT_(card, 2, "3err%d", rc); 2079 - goto out_remove; 2080 - } 2087 + qeth_l3_start_ipassists(card); 2088 + 2081 2089 rc = qeth_l3_setrouting_v4(card); 2082 2090 if (rc) 2083 2091 QETH_CARD_TEXT_(card, 2, "4err%04x", rc); ··· 2083 2097 QETH_CARD_TEXT_(card, 2, "5err%04x", rc); 2084 2098 } 2085 2099 2086 - rc = qeth_init_qdio_queues(card); 2087 - if (rc) { 2088 - QETH_CARD_TEXT_(card, 2, "6err%d", rc); 2089 - rc = -ENODEV; 2090 - goto out_remove; 2091 - } 2092 2100 card->state = CARD_STATE_SOFTSETUP; 2093 2101 2094 2102 qeth_set_allowed_threads(card, 0xffffffff, 0); ··· 2111 2131 qeth_trace_features(card); 2112 2132 /* let user_space know that device is online */ 2113 2133 kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE); 2114 - mutex_unlock(&card->conf_mutex); 2115 - mutex_unlock(&card->discipline_mutex); 2116 2134 return 0; 2117 2135 out_remove: 2118 2136 qeth_l3_stop_card(card); ··· 2118 2140 qeth_stop_channel(&card->write); 2119 2141 qeth_stop_channel(&card->read); 2120 2142 qdio_free(CARD_DDEV(card)); 2121 - 2122 - mutex_unlock(&card->conf_mutex); 2123 - mutex_unlock(&card->discipline_mutex); 2124 2143 return rc; 2125 2144 } 2126 2145 2127 - static int __qeth_l3_set_offline(struct ccwgroup_device *cgdev, 2128 - int recovery_mode) 2146 + static void qeth_l3_set_offline(struct qeth_card *card) 2129 2147 { 2130 - struct qeth_card *card = dev_get_drvdata(&cgdev->dev); 2131 - int rc = 0, rc2 = 0, rc3 = 0; 2132 - 2133 - mutex_lock(&card->discipline_mutex); 2134 - mutex_lock(&card->conf_mutex); 2135 - QETH_CARD_TEXT(card, 3, "setoffl"); 2136 - 2137 - if ((!recovery_mode && card->info.hwtrap) || card->info.hwtrap == 2) { 2138 - qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); 2139 - card->info.hwtrap = 1; 2140 - } 2141 - 2142 - rtnl_lock(); 2143 - card->info.open_when_online = card->dev->flags & IFF_UP; 2144 - dev_close(card->dev); 2145 - netif_device_detach(card->dev); 2146 - netif_carrier_off(card->dev); 2147 - rtnl_unlock(); 2148 - 2149 2148 qeth_l3_stop_card(card); 2150 - rc = qeth_stop_channel(&card->data); 2151 - rc2 = qeth_stop_channel(&card->write); 2152 - rc3 = qeth_stop_channel(&card->read); 2153 - if (!rc) 2154 - rc = (rc2) ? rc2 : rc3; 2155 - if (rc) 2156 - QETH_CARD_TEXT_(card, 2, "1err%d", rc); 2157 - qdio_free(CARD_DDEV(card)); 2158 - 2159 - /* let user_space know that device is offline */ 2160 - kobject_uevent(&cgdev->dev.kobj, KOBJ_CHANGE); 2161 - mutex_unlock(&card->conf_mutex); 2162 - mutex_unlock(&card->discipline_mutex); 2163 - return 0; 2164 - } 2165 - 2166 - static int qeth_l3_set_offline(struct ccwgroup_device *cgdev) 2167 - { 2168 - return __qeth_l3_set_offline(cgdev, 0); 2169 - } 2170 - 2171 - static int qeth_l3_recover(void *ptr) 2172 - { 2173 - struct qeth_card *card; 2174 - int rc = 0; 2175 - 2176 - card = (struct qeth_card *) ptr; 2177 - QETH_CARD_TEXT(card, 2, "recover1"); 2178 - QETH_CARD_HEX(card, 2, &card, sizeof(void *)); 2179 - if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD)) 2180 - return 0; 2181 - QETH_CARD_TEXT(card, 2, "recover2"); 2182 - dev_warn(&card->gdev->dev, 2183 - "A recovery process has been started for the device\n"); 2184 - __qeth_l3_set_offline(card->gdev, 1); 2185 - rc = qeth_l3_set_online(card->gdev); 2186 - if (!rc) 2187 - dev_info(&card->gdev->dev, 2188 - "Device successfully recovered!\n"); 2189 - else { 2190 - ccwgroup_set_offline(card->gdev); 2191 - dev_warn(&card->gdev->dev, "The qeth device driver " 2192 - "failed to recover an error on the device\n"); 2193 - } 2194 - qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD); 2195 - qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD); 2196 - return 0; 2197 2149 } 2198 2150 2199 2151 /* Returns zero if the command is successfully "consumed" */ ··· 2135 2227 2136 2228 struct qeth_discipline qeth_l3_discipline = { 2137 2229 .devtype = &qeth_l3_devtype, 2138 - .recover = qeth_l3_recover, 2139 2230 .setup = qeth_l3_probe_device, 2140 2231 .remove = qeth_l3_remove_device, 2141 2232 .set_online = qeth_l3_set_online,