]> Git Repo - J-linux.git/commitdiff
Merge tag 's390-5.12-1' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
authorLinus Torvalds <[email protected]>
Sun, 21 Feb 2021 21:40:06 +0000 (13:40 -0800)
committerLinus Torvalds <[email protected]>
Sun, 21 Feb 2021 21:40:06 +0000 (13:40 -0800)
Pull s390 updates from Vasily Gorbik:

 - Convert to using the generic entry infrastructure.

 - Add vdso time namespace support.

 - Switch s390 and alpha to 64-bit ino_t. As discussed at

     https://lore.kernel.org/linux-mm/YCV7QiyoweJwvN+m@osiris/

 - Get rid of expensive stck (store clock) usages where possible.
   Utilize cpu alternatives to patch stckf when supported.

 - Make tod_clock usage less error prone by converting it to a union and
   rework code which is using it.

 - Machine check handler fixes and cleanups.

 - Drop couple of minor inline asm optimizations to fix clang build.

 - Default configs changes notably to make libvirt happy.

 - Various changes to rework and improve qdio code.

 - Other small various fixes and improvements all over the code.

* tag 's390-5.12-1' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (68 commits)
  s390/qdio: remove 'merge_pending' mechanism
  s390/qdio: improve handling of PENDING buffers for QEBSM devices
  s390/qdio: rework q->qdio_error indication
  s390/qdio: inline qdio_kick_handler()
  s390/time: remove get_tod_clock_ext()
  s390/crypto: use store_tod_clock_ext()
  s390/hypfs: use store_tod_clock_ext()
  s390/debug: use union tod_clock
  s390/kvm: use union tod_clock
  s390/vdso: use union tod_clock
  s390/time: convert tod_clock_base to union
  s390/time: introduce new store_tod_clock_ext()
  s390/time: rename store_tod_clock_ext() and use union tod_clock
  s390/time: introduce union tod_clock
  s390,alpha: switch to 64-bit ino_t
  s390: split cleanup_sie
  s390: use r13 in cleanup_sie as temp register
  s390: fix kernel asce loading when sie is interrupted
  s390: add stack for machine check handler
  s390: use WRITE_ONCE when re-allocating async stack
  ...

1  2 
arch/Kconfig
arch/alpha/Kconfig
arch/s390/Kconfig
arch/s390/configs/debug_defconfig
arch/s390/configs/defconfig
drivers/s390/net/qeth_core_main.c

diff --combined arch/Kconfig
index 4790a5f23d9fd15caf1fff15fba45df539234697,383c98e86a70c0c8372a9f86fa00fb7a5696830c..baf67e7f059a889f931ae1887b8b114b4facc414
@@@ -33,6 -33,38 +33,6 @@@ config HOTPLUG_SM
  config GENERIC_ENTRY
         bool
  
 -config OPROFILE
 -      tristate "OProfile system profiling"
 -      depends on PROFILING
 -      depends on HAVE_OPROFILE
 -      select RING_BUFFER
 -      select RING_BUFFER_ALLOW_SWAP
 -      help
 -        OProfile is a profiling system capable of profiling the
 -        whole system, include the kernel, kernel modules, libraries,
 -        and applications.
 -
 -        If unsure, say N.
 -
 -config OPROFILE_EVENT_MULTIPLEX
 -      bool "OProfile multiplexing support (EXPERIMENTAL)"
 -      default n
 -      depends on OPROFILE && X86
 -      help
 -        The number of hardware counters is limited. The multiplexing
 -        feature enables OProfile to gather more events than counters
 -        are provided by the hardware. This is realized by switching
 -        between events at a user specified time interval.
 -
 -        If unsure, say N.
 -
 -config HAVE_OPROFILE
 -      bool
 -
 -config OPROFILE_NMI_TIMER
 -      def_bool y
 -      depends on PERF_EVENTS && HAVE_PERF_EVENTS_NMI && !PPC64
 -
  config KPROBES
        bool "Kprobes"
        depends on MODULES
@@@ -295,6 -327,10 +295,10 @@@ config ARCH_32BIT_OFF_
          still support 32-bit off_t. This option is enabled for all such
          architectures explicitly.
  
+ # Selected by 64 bit architectures which have a 32 bit f_tinode in struct ustat
+ config ARCH_32BIT_USTAT_F_TINODE
+       bool
  config HAVE_ASM_MODVERSIONS
        bool
        help
@@@ -1058,15 -1094,6 +1062,15 @@@ config HAVE_STATIC_CALL_INLIN
        bool
        depends on HAVE_STATIC_CALL
  
 +config HAVE_PREEMPT_DYNAMIC
 +      bool
 +      depends on HAVE_STATIC_CALL
 +      depends on GENERIC_ENTRY
 +      help
 +         Select this if the architecture support boot time preempt setting
 +         on top of static calls. It is strongly advised to support inline
 +         static call to avoid any overhead.
 +
  config ARCH_WANT_LD_ORPHAN_WARN
        bool
        help
@@@ -1088,9 -1115,6 +1092,9 @@@ config ARCH_SPLIT_ARG6
           If a 32-bit architecture requires 64-bit arguments to be split into
           pairs of 32-bit arguments, select this option.
  
 +config ARCH_HAS_ELFCORE_COMPAT
 +      bool
 +
  source "kernel/gcov/Kconfig"
  
  source "scripts/gcc-plugins/Kconfig"
diff --combined arch/alpha/Kconfig
index a401c1481a113721d25e73fb9ab9d5bdb7cfc975,96ce6565890eea6c34ae81a734106ad2aac3219f..5998106faa600b2c2c1142caf31062154a42b9e7
@@@ -2,6 -2,7 +2,7 @@@
  config ALPHA
        bool
        default y
+       select ARCH_32BIT_USTAT_F_TINODE
        select ARCH_MIGHT_HAVE_PC_PARPORT
        select ARCH_MIGHT_HAVE_PC_SERIO
        select ARCH_NO_PREEMPT
@@@ -14,6 -15,7 +15,6 @@@
        select HAVE_AOUT
        select HAVE_ASM_MODVERSIONS
        select HAVE_IDE
 -      select HAVE_OPROFILE
        select HAVE_PCSPKR_PLATFORM
        select HAVE_PERF_EVENTS
        select NEED_DMA_MAP_STATE
diff --combined arch/s390/Kconfig
index 41d6498dcbaab5e40d15008037a2161ea5672516,b68e6952866d7090a1d64e7e41abec3e2cac61de..e8f7216f6c63d598fd0d1a07664366e9ee888861
@@@ -58,6 -58,7 +58,7 @@@ config S39
        # Note: keep this list sorted alphabetically
        #
        imply IMA_SECURE_AND_OR_TRUSTED_BOOT
+       select ARCH_32BIT_USTAT_F_TINODE
        select ARCH_BINFMT_ELF_STATE
        select ARCH_HAS_DEBUG_VM_PGTABLE
        select ARCH_HAS_DEBUG_WX
        select GENERIC_ALLOCATOR
        select GENERIC_CPU_AUTOPROBE
        select GENERIC_CPU_VULNERABILITIES
+       select GENERIC_ENTRY
        select GENERIC_FIND_FIRST_BIT
        select GENERIC_GETTIMEOFDAY
        select GENERIC_PTDUMP
        select GENERIC_SMP_IDLE_THREAD
        select GENERIC_TIME_VSYSCALL
+       select GENERIC_VDSO_TIME_NS
        select HAVE_ALIGNED_STRUCT_PAGE if SLUB
        select HAVE_ARCH_AUDITSYSCALL
        select HAVE_ARCH_JUMP_LABEL
        select HAVE_MOD_ARCH_SPECIFIC
        select HAVE_NMI
        select HAVE_NOP_MCOUNT
 -      select HAVE_OPROFILE
        select HAVE_PCI
        select HAVE_PERF_EVENTS
        select HAVE_PERF_REGS
@@@ -425,6 -429,7 +428,6 @@@ config 64BI
  config COMPAT
        def_bool y
        prompt "Kernel support for 31 bit emulation"
 -      select COMPAT_BINFMT_ELF if BINFMT_ELF
        select ARCH_WANT_OLD_COMPAT_IPC
        select COMPAT_OLD_SIGACTION
        select HAVE_UID16
index 8b94347705e53cbc347d0178ea72a8d87594a166,2ae38ef35d52e00a723daa152a68de72c1d84437..6896b4213c49cf589a431ce8b65adb58e433e5e3
@@@ -40,6 -40,7 +40,7 @@@ CONFIG_USERFAULTFD=
  # CONFIG_COMPAT_BRK is not set
  CONFIG_PROFILING=y
  CONFIG_LIVEPATCH=y
+ CONFIG_MARCH_ZEC12=y
  CONFIG_TUNE_ZEC12=y
  CONFIG_NR_CPUS=512
  CONFIG_NUMA=y
@@@ -57,6 -58,7 +58,6 @@@ CONFIG_CMM=
  CONFIG_APPLDATA_BASE=y
  CONFIG_KVM=m
  CONFIG_S390_UNWIND_SELFTEST=y
 -CONFIG_OPROFILE=m
  CONFIG_KPROBES=y
  CONFIG_JUMP_LABEL=y
  CONFIG_STATIC_KEYS_SELFTEST=y
@@@ -176,13 -178,17 +177,17 @@@ CONFIG_NF_CONNTRACK_TFTP=
  CONFIG_NF_CT_NETLINK=m
  CONFIG_NF_CT_NETLINK_TIMEOUT=m
  CONFIG_NF_TABLES=m
+ CONFIG_NF_TABLES_INET=y
  CONFIG_NFT_CT=m
  CONFIG_NFT_COUNTER=m
  CONFIG_NFT_LOG=m
  CONFIG_NFT_LIMIT=m
  CONFIG_NFT_NAT=m
+ CONFIG_NFT_OBJREF=m
+ CONFIG_NFT_REJECT=m
  CONFIG_NFT_COMPAT=m
  CONFIG_NFT_HASH=m
+ CONFIG_NFT_FIB_INET=m
  CONFIG_NETFILTER_XT_SET=m
  CONFIG_NETFILTER_XT_TARGET_AUDIT=m
  CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
@@@ -274,6 -280,7 +279,7 @@@ CONFIG_IP_VS_NQ=
  CONFIG_IP_VS_FTP=m
  CONFIG_IP_VS_PE_SIP=m
  CONFIG_NF_TABLES_IPV4=y
+ CONFIG_NFT_FIB_IPV4=m
  CONFIG_NF_TABLES_ARP=y
  CONFIG_IP_NF_IPTABLES=m
  CONFIG_IP_NF_MATCH_AH=m
@@@ -294,6 -301,7 +300,7 @@@ CONFIG_IP_NF_ARPTABLES=
  CONFIG_IP_NF_ARPFILTER=m
  CONFIG_IP_NF_ARP_MANGLE=m
  CONFIG_NF_TABLES_IPV6=y
+ CONFIG_NFT_FIB_IPV6=m
  CONFIG_IP6_NF_IPTABLES=m
  CONFIG_IP6_NF_MATCH_AH=m
  CONFIG_IP6_NF_MATCH_EUI64=m
@@@ -629,7 -637,6 +636,6 @@@ CONFIG_NTFS_RW=
  CONFIG_PROC_KCORE=y
  CONFIG_TMPFS=y
  CONFIG_TMPFS_POSIX_ACL=y
- CONFIG_TMPFS_INODE64=y
  CONFIG_HUGETLBFS=y
  CONFIG_CONFIGFS_FS=m
  CONFIG_ECRYPT_FS=m
@@@ -791,6 -798,8 +797,8 @@@ CONFIG_DEBUG_OBJECTS_RCU_HEAD=
  CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y
  CONFIG_SLUB_DEBUG_ON=y
  CONFIG_SLUB_STATS=y
+ CONFIG_DEBUG_KMEMLEAK=y
+ CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y
  CONFIG_DEBUG_STACK_USAGE=y
  CONFIG_DEBUG_VM=y
  CONFIG_DEBUG_VM_VMACACHE=y
@@@ -831,7 -840,6 +839,6 @@@ CONFIG_BPF_KPROBE_OVERRIDE=
  CONFIG_HIST_TRIGGERS=y
  CONFIG_FTRACE_STARTUP_TEST=y
  # CONFIG_EVENT_TRACE_STARTUP_TEST is not set
- CONFIG_DEBUG_USER_ASCE=y
  CONFIG_NOTIFIER_ERROR_INJECTION=m
  CONFIG_NETDEV_NOTIFIER_ERROR_INJECT=m
  CONFIG_FAULT_INJECTION=y
@@@ -855,3 -863,4 +862,4 @@@ CONFIG_PERCPU_TEST=
  CONFIG_ATOMIC64_SELFTEST=y
  CONFIG_TEST_BITOPS=m
  CONFIG_TEST_BPF=m
+ CONFIG_DEBUG_ENTRY=y
index 9db1232e09f45154e9e65c573bfb9cb9413d4cd6,057ad15bdc6386021048bb2fba114ce44d57d9a8..ef4df9d60d6af4d52ef544ac48d2902933eab855
@@@ -38,6 -38,7 +38,7 @@@ CONFIG_USERFAULTFD=
  # CONFIG_COMPAT_BRK is not set
  CONFIG_PROFILING=y
  CONFIG_LIVEPATCH=y
+ CONFIG_MARCH_ZEC12=y
  CONFIG_TUNE_ZEC12=y
  CONFIG_NR_CPUS=512
  CONFIG_NUMA=y
@@@ -55,6 -56,7 +56,6 @@@ CONFIG_CMM=
  CONFIG_APPLDATA_BASE=y
  CONFIG_KVM=m
  CONFIG_S390_UNWIND_SELFTEST=m
 -CONFIG_OPROFILE=m
  CONFIG_KPROBES=y
  CONFIG_JUMP_LABEL=y
  # CONFIG_GCC_PLUGINS is not set
@@@ -167,13 -169,17 +168,17 @@@ CONFIG_NF_CONNTRACK_TFTP=
  CONFIG_NF_CT_NETLINK=m
  CONFIG_NF_CT_NETLINK_TIMEOUT=m
  CONFIG_NF_TABLES=m
+ CONFIG_NF_TABLES_INET=y
  CONFIG_NFT_CT=m
  CONFIG_NFT_COUNTER=m
  CONFIG_NFT_LOG=m
  CONFIG_NFT_LIMIT=m
  CONFIG_NFT_NAT=m
+ CONFIG_NFT_OBJREF=m
+ CONFIG_NFT_REJECT=m
  CONFIG_NFT_COMPAT=m
  CONFIG_NFT_HASH=m
+ CONFIG_NFT_FIB_INET=m
  CONFIG_NETFILTER_XT_SET=m
  CONFIG_NETFILTER_XT_TARGET_AUDIT=m
  CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
@@@ -265,6 -271,7 +270,7 @@@ CONFIG_IP_VS_NQ=
  CONFIG_IP_VS_FTP=m
  CONFIG_IP_VS_PE_SIP=m
  CONFIG_NF_TABLES_IPV4=y
+ CONFIG_NFT_FIB_IPV4=m
  CONFIG_NF_TABLES_ARP=y
  CONFIG_IP_NF_IPTABLES=m
  CONFIG_IP_NF_MATCH_AH=m
@@@ -285,6 -292,7 +291,7 @@@ CONFIG_IP_NF_ARPTABLES=
  CONFIG_IP_NF_ARPFILTER=m
  CONFIG_IP_NF_ARP_MANGLE=m
  CONFIG_NF_TABLES_IPV6=y
+ CONFIG_NFT_FIB_IPV6=m
  CONFIG_IP6_NF_IPTABLES=m
  CONFIG_IP6_NF_MATCH_AH=m
  CONFIG_IP6_NF_MATCH_EUI64=m
@@@ -617,7 -625,6 +624,6 @@@ CONFIG_NTFS_RW=
  CONFIG_PROC_KCORE=y
  CONFIG_TMPFS=y
  CONFIG_TMPFS_POSIX_ACL=y
- CONFIG_TMPFS_INODE64=y
  CONFIG_HUGETLBFS=y
  CONFIG_CONFIGFS_FS=m
  CONFIG_ECRYPT_FS=m
@@@ -779,7 -786,6 +785,6 @@@ CONFIG_FTRACE_SYSCALLS=
  CONFIG_BLK_DEV_IO_TRACE=y
  CONFIG_BPF_KPROBE_OVERRIDE=y
  CONFIG_HIST_TRIGGERS=y
- CONFIG_DEBUG_USER_ASCE=y
  CONFIG_LKDTM=m
  CONFIG_PERCPU_TEST=m
  CONFIG_ATOMIC64_SELFTEST=y
index 89b223885b0c51ae43816da6995f6e560d1866ef,068e2d9b1eb8d17066873d06959e14acac386e9d..b71b8902d1c49a66fae6072f84336d3afbbdaeaf
@@@ -825,8 -825,7 +825,8 @@@ static bool qeth_next_hop_is_local_v4(s
                return false;
  
        rcu_read_lock();
 -      next_hop = qeth_next_hop_v4_rcu(skb, qeth_dst_check_rcu(skb, 4));
 +      next_hop = qeth_next_hop_v4_rcu(skb,
 +                                      qeth_dst_check_rcu(skb, htons(ETH_P_IP)));
        key = ipv4_addr_hash(next_hop);
  
        hash_for_each_possible_rcu(card->local_addrs4, tmp, hnode, key) {
@@@ -852,8 -851,7 +852,8 @@@ static bool qeth_next_hop_is_local_v6(s
                return false;
  
        rcu_read_lock();
 -      next_hop = qeth_next_hop_v6_rcu(skb, qeth_dst_check_rcu(skb, 6));
 +      next_hop = qeth_next_hop_v6_rcu(skb,
 +                                      qeth_dst_check_rcu(skb, htons(ETH_P_IPV6)));
        key = ipv6_addr_hash(next_hop);
  
        hash_for_each_possible_rcu(card->local_addrs6, tmp, hnode, key) {
@@@ -1409,12 -1407,10 +1409,12 @@@ static void qeth_notify_skbs(struct qet
        struct sk_buff *skb;
  
        skb_queue_walk(&buf->skb_list, skb) {
 +              struct sock *sk = skb->sk;
 +
                QETH_CARD_TEXT_(q->card, 5, "skbn%d", notification);
                QETH_CARD_TEXT_(q->card, 5, "%lx", (long) skb);
 -              if (skb->sk && skb->sk->sk_family == PF_IUCV)
 -                      iucv_sk(skb->sk)->sk_txnotify(skb, notification);
 +              if (sk && sk->sk_family == PF_IUCV)
 +                      iucv_sk(sk)->sk_txnotify(sk, notification);
        }
  }
  
@@@ -3694,27 -3690,24 +3694,27 @@@ static void qeth_flush_buffers(struct q
        rc = do_QDIO(CARD_DDEV(queue->card), qdio_flags,
                     queue->queue_no, index, count);
  
 -      /* Fake the TX completion interrupt: */
 -      if (IS_IQD(card)) {
 -              unsigned int frames = READ_ONCE(queue->max_coalesced_frames);
 -              unsigned int usecs = READ_ONCE(queue->coalesce_usecs);
 -
 -              if (frames && queue->coalesced_frames >= frames) {
 -                      napi_schedule(&queue->napi);
 -                      queue->coalesced_frames = 0;
 -                      QETH_TXQ_STAT_INC(queue, coal_frames);
 -              } else if (usecs) {
 -                      qeth_tx_arm_timer(queue, usecs);
 +      switch (rc) {
 +      case 0:
 +      case -ENOBUFS:
 +              /* ignore temporary SIGA errors without busy condition */
 +
 +              /* Fake the TX completion interrupt: */
 +              if (IS_IQD(card)) {
 +                      unsigned int frames = READ_ONCE(queue->max_coalesced_frames);
 +                      unsigned int usecs = READ_ONCE(queue->coalesce_usecs);
 +
 +                      if (frames && queue->coalesced_frames >= frames) {
 +                              napi_schedule(&queue->napi);
 +                              queue->coalesced_frames = 0;
 +                              QETH_TXQ_STAT_INC(queue, coal_frames);
 +                      } else if (usecs) {
 +                              qeth_tx_arm_timer(queue, usecs);
 +                      }
                }
 -      }
  
 -      if (rc) {
 -              /* ignore temporary SIGA errors without busy condition */
 -              if (rc == -ENOBUFS)
 -                      return;
 +              break;
 +      default:
                QETH_CARD_TEXT(queue->card, 2, "flushbuf");
                QETH_CARD_TEXT_(queue->card, 2, " q%d", queue->queue_no);
                QETH_CARD_TEXT_(queue->card, 2, " idx%d", index);
                /* this must not happen under normal circumstances. if it
                 * happens something is really wrong -> recover */
                qeth_schedule_recovery(queue->card);
 -              return;
        }
  }
  
@@@ -3902,11 -3896,11 +3902,11 @@@ int qeth_get_priority_queue(struct qeth
        switch (card->qdio.do_prio_queueing) {
        case QETH_PRIO_Q_ING_TOS:
        case QETH_PRIO_Q_ING_PREC:
 -              switch (qeth_get_ip_version(skb)) {
 -              case 4:
 +              switch (vlan_get_protocol(skb)) {
 +              case htons(ETH_P_IP):
                        tos = ipv4_get_dsfield(ip_hdr(skb));
                        break;
 -              case 6:
 +              case htons(ETH_P_IPV6):
                        tos = ipv6_get_dsfield(ipv6_hdr(skb));
                        break;
                default:
@@@ -4371,10 -4365,10 +4371,10 @@@ static void qeth_fill_tso_ext(struct qe
  }
  
  int qeth_xmit(struct qeth_card *card, struct sk_buff *skb,
 -            struct qeth_qdio_out_q *queue, int ipv,
 +            struct qeth_qdio_out_q *queue, __be16 proto,
              void (*fill_header)(struct qeth_qdio_out_q *queue,
                                  struct qeth_hdr *hdr, struct sk_buff *skb,
 -                                int ipv, unsigned int data_len))
 +                                __be16 proto, unsigned int data_len))
  {
        unsigned int proto_len, hw_hdr_len;
        unsigned int frame_len = skb->len;
                data_offset = push_len + proto_len;
        }
        memset(hdr, 0, hw_hdr_len);
 -      fill_header(queue, hdr, skb, ipv, frame_len);
 +      fill_header(queue, hdr, skb, proto, frame_len);
        if (is_tso)
                qeth_fill_tso_ext((struct qeth_hdr_tso *) hdr,
                                  frame_len - proto_len, skb, proto_len);
@@@ -6074,14 -6068,15 +6074,15 @@@ int qeth_poll(struct napi_struct *napi
  EXPORT_SYMBOL_GPL(qeth_poll);
  
  static void qeth_iqd_tx_complete(struct qeth_qdio_out_q *queue,
-                                unsigned int bidx, bool error, int budget)
+                                unsigned int bidx, unsigned int qdio_error,
+                                int budget)
  {
        struct qeth_qdio_out_buffer *buffer = queue->bufs[bidx];
        u8 sflags = buffer->buffer->element[15].sflags;
        struct qeth_card *card = queue->card;
+       bool error = !!qdio_error;
  
-       if (queue->bufstates && (queue->bufstates[bidx].flags &
-                                QDIO_OUTBUF_STATE_FLAG_PENDING)) {
+       if (qdio_error == QDIO_ERROR_SLSB_PENDING) {
                WARN_ON_ONCE(card->options.cq != QETH_CQ_ENABLED);
  
                QETH_CARD_TEXT_(card, 5, "pel%u", bidx);
@@@ -6355,11 -6350,9 +6356,11 @@@ static int qeth_register_dbf_views(void
  
  static DEFINE_MUTEX(qeth_mod_mutex);  /* for synchronized module loading */
  
 -int qeth_core_load_discipline(struct qeth_card *card,
 -              enum qeth_discipline_id discipline)
 +int qeth_setup_discipline(struct qeth_card *card,
 +                        enum qeth_discipline_id discipline)
  {
 +      int rc;
 +
        mutex_lock(&qeth_mod_mutex);
        switch (discipline) {
        case QETH_DISCIPLINE_LAYER3:
                return -EINVAL;
        }
  
 +      rc = card->discipline->setup(card->gdev);
 +      if (rc) {
 +              if (discipline == QETH_DISCIPLINE_LAYER2)
 +                      symbol_put(qeth_l2_discipline);
 +              else
 +                      symbol_put(qeth_l3_discipline);
 +              card->discipline = NULL;
 +
 +              return rc;
 +      }
 +
        card->options.layer = discipline;
        return 0;
  }
  
 -void qeth_core_free_discipline(struct qeth_card *card)
 +void qeth_remove_discipline(struct qeth_card *card)
  {
 +      card->discipline->remove(card->gdev);
 +
        if (IS_LAYER2(card))
                symbol_put(qeth_l2_discipline);
        else
@@@ -6607,18 -6587,23 +6608,18 @@@ static int qeth_core_probe_device(struc
        default:
                card->info.layer_enforced = true;
                /* It's so early that we don't need the discipline_mutex yet. */
 -              rc = qeth_core_load_discipline(card, enforced_disc);
 +              rc = qeth_setup_discipline(card, enforced_disc);
                if (rc)
 -                      goto err_load;
 +                      goto err_setup_disc;
  
                gdev->dev.type = IS_OSN(card) ? &qeth_osn_devtype :
                                                card->discipline->devtype;
 -              rc = card->discipline->setup(card->gdev);
 -              if (rc)
 -                      goto err_disc;
                break;
        }
  
        return 0;
  
 -err_disc:
 -      qeth_core_free_discipline(card);
 -err_load:
 +err_setup_disc:
  err_chp_desc:
        free_netdev(card->dev);
  err_card:
@@@ -6635,8 -6620,10 +6636,8 @@@ static void qeth_core_remove_device(str
        QETH_CARD_TEXT(card, 2, "removedv");
  
        mutex_lock(&card->discipline_mutex);
 -      if (card->discipline) {
 -              card->discipline->remove(gdev);
 -              qeth_core_free_discipline(card);
 -      }
 +      if (card->discipline)
 +              qeth_remove_discipline(card);
        mutex_unlock(&card->discipline_mutex);
  
        qeth_free_qdio_queues(card);
@@@ -6656,9 -6643,14 +6657,9 @@@ static int qeth_core_set_online(struct 
        if (!card->discipline) {
                def_discipline = IS_IQD(card) ? QETH_DISCIPLINE_LAYER3 :
                                                QETH_DISCIPLINE_LAYER2;
 -              rc = qeth_core_load_discipline(card, def_discipline);
 +              rc = qeth_setup_discipline(card, def_discipline);
                if (rc)
                        goto err;
 -              rc = card->discipline->setup(card->gdev);
 -              if (rc) {
 -                      qeth_core_free_discipline(card);
 -                      goto err;
 -              }
        }
  
        rc = qeth_set_online(card, card->discipline);
This page took 0.092535 seconds and 4 git commands to generate.