1. 28 3月, 2017 15 次提交
    • T
      ALSA: firewire-motu: enable to read transaction cache via hwdep interface · 5aaab1bf
      Takashi Sakamoto 提交于
      MOTU FireWire series can transfer messages to registered address. These
      messages are transferred for the status of internal clock synchronization
      just after starting streams.
      
      When the synchronization is stable, it's 0x01ffffff. Else, it's 0x05ffffff.
      
      This commit adds a functionality for user space applications to receive
      content of the message.
      Signed-off-by: NTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      5aaab1bf
    • T
      ALSA: firewire-motu: add hwdep interface · 71c37977
      Takashi Sakamoto 提交于
      This commit adds hwdep interface so as the other sound drivers for units
      on IEEE 1394 bus have.
      
      This interface is designed for mixer/control applications. By using this
      interface, an application can get information about firewire node, can
      lock/unlock kernel streaming and can get notification at starting/stopping
      kernel streaming.
      Signed-off-by: NTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      71c37977
    • T
      ALSA: firewire-motu: add MIDI functionality · 9e796e7d
      Takashi Sakamoto 提交于
      In MOTU FireWire series, MIDI messages are multiplexed to isochronous
      packets as well as PCM frames, while the way is different from the one
      in IEC 61883-6.
      
      MIDI messages are put into a certain position in message chunks. One data
      block can includes one byte of the MIDI messages. When data block includes
      a MIDI byte, the block has a flag in a certain position of the message
      chunk. These positions are unique depending on protocols.
      
      Once a data block includes a MIDI byte, some following data blocks includes
      no MIDI bytes. Next MIDI byte appears on a data block corresponding to
      next cycle of physical MIDI bus. This seems to avoid buffer overflow caused
      by bandwidth differences between IEEE 1394 bus and physical MIDI bus.
      
      This commit adds MIDI functionality to transfer/receive MIDI messages.
      Signed-off-by: NTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      9e796e7d
    • T
      ALSA: firewire-motu: add PCM functionality · dd49b2d1
      Takashi Sakamoto 提交于
      This commit adds PCM functionality to transmit/receive PCM samples.
      
      When one of PCM substreams are running or external clock source is
      selected, current sampling rate is used. Else, the sampling rate is
      changed according to requests from a userspace application.
      
      Available number of samples in a frame of PCM substream is determined at
      open(2) to corresponding PCM character device. Later, packet streaming
      starts by ioctl(2) with SNDRV_PCM_IOCTL_PREPARE. In theory, between them,
      applications can change state of the unit by any write transaction to
      change the number. In this case, this driver may fail packet streaming due
      to wrong data format.
      Signed-off-by: NTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      dd49b2d1
    • T
      ALSA: firewire-motu: add proc node to show current statuc of clock and packet formats · 4638ec6e
      Takashi Sakamoto 提交于
      This commit adds a proc node for debugging purpose.
      Signed-off-by: NTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      4638ec6e
    • T
      ALSA: firewire-motu: add stream management functionality · 9b2bb4f2
      Takashi Sakamoto 提交于
      This commit adds a functionality to manage packet streaming for MOTU
      FireWire series.
      
      The streaming is not controlled by CMP, thus against IEC 61883-1. Write
      transaction to certain addresses start/stop packet streaming.
      
      Transactions to 0x'ffff'f000'0b00 results in isochronous channel number for
      both directions and starting/stopping transmission of packets. The
      isochronous channel number is represented in 6 bit field, thus units can
      identify the channels up to 64, as IEEE 1394 bus specification described.
      
      Transactions to 0x'ffff'f000'0b10 results in packet format for both
      directions and transmission speed. When each of data block includes fixed
      part of data chunks only, corresponding flags stand.
      
      When bus reset occurs, the units continue to transmit packets with
      non-contiguous data block counter. This causes discontinuity detection in
      packet streaming engine and ALSA PCM applications receives EPIPE from any
      I/O operation. In this case, typical applications manage to recover
      corresponding PCM substream. This behaviour is kicked much earlier than
      callback of bus reset handler by Linux FireWire subsystem, therefore
      status of packet streaming is not changed in the handler.
      Signed-off-by: NTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      9b2bb4f2
    • T
      ALSA: firewire-motu: handle transactions specific for MOTU FireWire models · 2e76701b
      Takashi Sakamoto 提交于
      All models of MOTU FireWire series can be controlled by write transaction
      to addresses in a range from 0x'ffff'f0000'0b00 to 0x'ffff'f000'0cff.
      
      The models support asynchronous notification. This notification has 32 bit
      field data, and is transferred when status of clock changes. Meaning of
      the value is not enough clear yet.
      
      Drivers can register its address to receive the notification. Write
      transaction to 0x'ffff'f000'0b04 registers higher 16 bits of the address.
      Write transaction to 0x'ffff'f0000'0b08 registers the rest of bits. The
      address includes node ID, thus it should be registered every time of bus
      reset.
      Signed-off-by: NTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      2e76701b
    • T
      ALSA: firewire-motu: add MOTU specific protocol layer · 4641c939
      Takashi Sakamoto 提交于
      MOTU FireWire series uses blocking transmission for AMDTP packet streaming.
      They transmit/receive 8,000 packets per second, to handle the same number
      of data blocks as current sampling transmission frequency. Thus,
      IEC 61883-1/6 packet streaming engine of ALSA firewire stack is available
      for them.
      
      However, the sequence of packet and data blocks includes some quirks.
      Below sample is a sequence of CIP headers of packets received by 828mk2,
      at 44.1kHz of sampling transmission frequency.
      
      quads CIP1        CIP2
      488   0x020F04E8  0x8222FFFF
        8   0x020F04F8  0x8222FFFF
      488   0x020F0400  0x8222FFFF
      488   0x020F0408  0x8222FFFF
        8   0x020F04E8  0x8222FFFF
      488   0x020F04F0  0x8222FFFF
      488   0x020F04F8  0x8222FFFF
      
      The SID (source node ID), DBS (data block size), SPH (source packet header),
      FMT (format ID), FDF (format dependent field) and SYT (time stamp) fields
      are in IEC 61883-1. Especially, FMT is 0x02, FDF is 0x22 and SYT is 0xffff
      to define MOTU specific protocol. In an aspect of dbc field, the value
      represents accumulated number of data blocks included the packet. This
      is against IEC 61883-1, because according to the specification this value
      should be the number of data blocks already transferred.
      
      In ALSA IEC 61883-1/6 engine, this quirk is already supported by
      CIP_DBC_IS_END_EVENT flag, because Echo Audio Fireworks has.
      
      Each data block includes SPH as its first quadlet field, to represent its
      presentation time stamp. Actual value of SPH is compliant to IEC 61883-1;
      lower 25 bits of 32 bits width consists of 13 bits cycle count and 12 bits
      cycle offset.
      
      The rest of each data block consists of 24 bit chunks. All of PCM samples,
      MIDI messages, status and control messages are transferred by the chunks.
      This is similar to '24-bit * 4 Audio Pack' in IEC 61883-6. The position of
      each kind of data depends on generations of each model. The number of
      whole chunks in a data block is a multiple of 4, to consists of
      quadlet-aligned packets.
      
      This commit adds data block processing layer specific for the MOTU
      protocol. The remarkable point is the way to generate SPH header. Time
      stamps for each data blocks are generated by below calculation:
      
       * Using pre-computed table for the number of ticks per event
        *  44,1kHz: (557 + 123/441)
        *  48.0kHz: (512 +   0/441)
        *  88.2kHz: (278 + 282/441)
        *  96.0kHz: (256 +   0/441)
        * 176.4kHz: (139 + 141/441)
        * 192.0kHz: (128 +   0/441)
       * Accumulate the ticks and set the value to SPH for every events.
       * This way makes sense only for blocking transmission because this mode
         transfers fixed number or none of events.
      
      This calculation assumes that each data block has a PCM frame which is
      sampled according to event timing clock. Current packet streaming layer
      has the same assumption.
      
      Although this sequence works fine for MOTU FireWire series at sampling
      transmission frequency based on 48.0kHz, it is not enough at the frequency
      based on 44.1kHz. The units generate choppy noise every few seconds.
      Signed-off-by: NTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      4641c939
    • T
      ALSA: firewire-lib: enable CIP_DBC_IS_END_EVENT for both directions of stream · 9dae017b
      Takashi Sakamoto 提交于
      Commit c8bdf49b("ALSA: fireworks/firewire-lib: Add a quirk for the
      meaning of dbc") adds CIP_DBC_IS_END_EVENT flag just for tx packets.
      However, MOTU FireWire series has this quirk for rx packets.
      
      This commit allows both directions with the flag.
      Signed-off-by: NTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      9dae017b
    • T
      ALSA: firewire-lib: add support for source packet header field in CIP header · 9863874f
      Takashi Sakamoto 提交于
      In IEC 61883-1, CIP headers can have a SPH field. When a packet has 1 in
      SPH field of its CIP header, the packet has a source packet headers. A
      source packet header consists of 32 bit field (= 1 quadlet) and it
      transfers time stamp, which is the same value as the lower 25 bits of the
      IEEE 1394 CYCLE_TIMER register and the rest is zero.
      
      This commit just supports source packet header field because IEC 61883-1
      includes ambiguity the position of this header and its count. Each
      protocol layer is allowed to have actual implementation according its
      requirements.
      Signed-off-by: NTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      9863874f
    • T
      ALSA: firewire-lib: record cycle count for the first packet · a04513f8
      Takashi Sakamoto 提交于
      Currently, packet streaming layer passes generated SYT value to data block
      processing layer. However, this is not enough in a case that the data block
      processing layer generates time stamps by its own ways.
      
      For out-packet stream, the packet streaming layer guarantees 8,000 times
      calls of data block processing layers per sec. Therefore, when cycle count
      of the first packet is recorded, data block processing layers can calculate
      own time stamps with the recorded value.
      
      For the reason, this commit allows packet streaming layer to record the
      first cycle count. Each data block processing layer can read the count by
      accessing a member of structure for packet streaming layer.
      Signed-off-by: NTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      a04513f8
    • T
      ALSA: firewire-motu: add an abstraction layer for three types of protocols · 59f6482c
      Takashi Sakamoto 提交于
      In an aspect of used protocols to communicate, models of MOTU FireWire
      units are categorized to three generations.
      
      This commit adds an abstraction layer of the protocols for features
      related to packet streaming functionality. This layer includes 5
      operations.
      
      When configuring packet streaming functionality with sampling rate and
      sampling transmission frequency, .get_clock_rate and .set_clock_rate are
      called with proper arguments. MOTU FireWire series supports up to 192.0kHz.
      
      When checking current source of sampling clock (not clock for packetization
      layer), .get_clock_source is used. Enumeration is added to represent the
      sources supported by this series. This operation can be used to expose
      available sampling rate to user space applications when the unit is
      configured to use any input signal as source of clock instead of crystal
      clock.
      
      In the protocols, the path between packet processing layer and digital
      signal processing layer can be controlled. This looks a functionality to
      'mute' the unit. For this feature, .switch_fetching_mode is added. This
      can be used to suppress noises every time packet streaming starts/stops.
      
      In a point of the size of data blocks at a certain sampling transmission
      frequency, the most units accept several modes. This is due to usage of
      optical interfaces. The size differs depending on which modes are
      configured to the interfaces; None, S/PDIF and ADAT. Additionally, format
      of packet is different depending on protocols. To cache current size of
      data blocks and its format, .cache_packet_formats is added. This is used
      by PCM functionality, packet streaming functionality and data block
      processing layer.
      Signed-off-by: NTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      59f6482c
    • T
      ALSA: firewire-motu: add a structure for model-dependent parameters. · 5e03c33e
      Takashi Sakamoto 提交于
      MOTU FireWire series doesn't tell drivers their capabilities, thus
      the drivers should have and apply model-dependent parameters to detected
      models.
      
      This commit adds a structure to represent such parameters. Capabilities
      are represented by enumeration except for the number of analog line
      in/out. Identification name also be in the structure because the units has
      no registers for this purpose.
      Signed-off-by: NTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      5e03c33e
    • T
      ALSA: firewire-motu: postpone sound card registration · 8865a31e
      Takashi Sakamoto 提交于
      Just after appearing on IEEE 1394 bus, this unit generates several bus
      resets. This is due to loading firmware from on-board flash memory and
      initialize hardware. It's better to postpone sound card registration.
      
      This commit applies this idea.
      Signed-off-by: NTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      8865a31e
    • T
      ALSA: firewire-motu: add skeleton for Mark of the unicorn (MOTU) FireWire series · 6c3cef48
      Takashi Sakamoto 提交于
      This commit adds an new driver for MOTU FireWire series. In this commit,
      this driver just creates/removes card instance according to bus event.
      More functionalities will be added in following commits.
      Signed-off-by: NTakashi Sakamoto <o-takashi@sakamocchi.jp>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      6c3cef48
  2. 24 3月, 2017 1 次提交
    • A
      ALSA: au88x0: avoid theoretical uninitialized access · 13f99ebd
      Arnd Bergmann 提交于
      The latest gcc-7.0.1 snapshot points out that we if nr_ch is zero, we never
      initialize some variables:
      
      sound/pci/au88x0/au88x0_core.c: In function 'vortex_adb_allocroute':
      sound/pci/au88x0/au88x0_core.c:2304:68: error: 'mix[0]' may be used uninitialized in this function [-Werror=maybe-uninitialized]
      sound/pci/au88x0/au88x0_core.c:2305:58: error: 'src[0]' may be used uninitialized in this function [-Werror=maybe-uninitialized]
      
      I assume this can never happen in practice, but adding a check here doesn't
      hurt either and avoids the warning. The code has been unchanged since
      the start of git history.
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      13f99ebd
  3. 20 3月, 2017 12 次提交
    • M
      ALSA: hda/ca0132: Remove double parentheses · a16fbb85
      Matthias Kaehlcke 提交于
      The extra pairs of parantheses are not needed and causes clang to
      generate warnings like this:
      
      sound/pci/hda/patch_ca0132.c:1171:14: error: equality comparison with extraneous parentheses [-Werror,-Wparentheses-equality]
              if ((buffer == NULL))
                   ~~~~~~~^~~~~~~
      sound/pci/hda/patch_ca0132.c:1171:14: note: remove extraneous parentheses around the comparison to silence this warning
              if ((buffer == NULL))
                  ~       ^      ~
      sound/pci/hda/patch_ca0132.c:1171:14: note: use '=' to turn this equality comparison into an assignment
              if ((buffer == NULL))
      Signed-off-by: NMatthias Kaehlcke <mka@chromium.org>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      a16fbb85
    • N
      ALSA: es1688: Use strcpy() instead of sprintf() · cd7d1eab
      Nicolas Iooss 提交于
      There is no point in using sprintf() without a format string when
      strcpy() can perform the same operation.
      Signed-off-by: NNicolas Iooss <nicolas.iooss_linux@m4x.org>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      cd7d1eab
    • T
      Merge branch 'topic/for-4.12' into for-next · ebe2aa91
      Takashi Iwai 提交于
      ebe2aa91
    • J
      ALSA: hda - add support for docking station for HP 840 G3 · cc3a47a2
      Jaroslav Kysela 提交于
      This tested patch adds missing initialization for Line-In/Out PINs for
      the docking station for HP 840 G3.
      Signed-off-by: NJaroslav Kysela <perex@perex.cz>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      cc3a47a2
    • J
      ALSA: hda - add support for docking station for HP 820 G2 · 04d5466a
      Jaroslav Kysela 提交于
      This tested patch adds missing initialization for Line-In/Out PINs for
      the docking station for HP 820 G2.
      Signed-off-by: NJaroslav Kysela <perex@perex.cz>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      04d5466a
    • T
      ALSA: ctxfi: Fix the incorrect check of dma_set_mask() call · f363a066
      Takashi Iwai 提交于
      In the commit [15c75b09: ALSA: ctxfi: Fallback DMA mask to 32bit],
      I forgot to put "!" at dam_set_mask() call check in cthw20k1.c (while
      cthw20k2.c is OK).  This patch fixes that obvious bug.
      
      (As a side note: although the original commit was completely wrong,
       it's still working for most of machines, as it sets to 32bit DMA mask
       in the end.  So the bug severity is low.)
      
      Fixes: 15c75b09 ("ALSA: ctxfi: Fallback DMA mask to 32bit")
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      f363a066
    • L
      Linux 4.11-rc3 · 97da3854
      Linus Torvalds 提交于
      97da3854
    • L
      mm/swap: don't BUG_ON() due to uninitialized swap slot cache · 452b94b8
      Linus Torvalds 提交于
      This BUG_ON() triggered for me once at shutdown, and I don't see a
      reason for the check.  The code correctly checks whether the swap slot
      cache is usable or not, so an uninitialized swap slot cache is not
      actually problematic afaik.
      
      I've temporarily just switched the BUG_ON() to a WARN_ON_ONCE(), since
      I'm not sure why that seemingly pointless check was there.  I suspect
      the real fix is to just remove it entirely, but for now we'll warn about
      it but not bring the machine down.
      
      Cc: "Huang, Ying" <ying.huang@intel.com>
      Cc: Tim Chen <tim.c.chen@linux.intel.com>
      Cc: Michal Hocko <mhocko@suse.com>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      452b94b8
    • L
      Merge tag 'powerpc-4.11-5' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux · a07a6e41
      Linus Torvalds 提交于
      Pull more powerpc fixes from Michael Ellerman:
       "A couple of minor powerpc fixes for 4.11:
      
         - wire up statx() syscall
      
         - don't print a warning on memory hotplug when HPT resizing isn't
           available
      
        Thanks to: David Gibson, Chandan Rajendra"
      
      * tag 'powerpc-4.11-5' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
        powerpc/pseries: Don't give a warning when HPT resizing isn't available
        powerpc: Wire up statx() syscall
      a07a6e41
    • L
      Merge branch 'parisc-4.11-2' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux · 4571bc5a
      Linus Torvalds 提交于
      Pull parisc fixes from Helge Deller:
      
       - Mikulas Patocka added support for R_PARISC_SECREL32 relocations in
         modules with CONFIG_MODVERSIONS.
      
       - Dave Anglin optimized the cache flushing for vmap ranges.
      
       - Arvind Yadav provided a fix for a potential NULL pointer dereference
         in the parisc perf code (and some code cleanups).
      
       - I wired up the new statx system call, fixed some compiler warnings
         with the access_ok() macro and fixed shutdown code to really halt a
         system at shutdown instead of crashing & rebooting.
      
      * 'parisc-4.11-2' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux:
        parisc: Fix system shutdown halt
        parisc: perf: Fix potential NULL pointer dereference
        parisc: Avoid compiler warnings with access_ok()
        parisc: Wire up statx system call
        parisc: Optimize flush_kernel_vmap_range and invalidate_kernel_vmap_range
        parisc: support R_PARISC_SECREL32 relocation in modules
      4571bc5a
    • L
      Merge git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending · 8aa34172
      Linus Torvalds 提交于
      Pull SCSI target fixes from Nicholas Bellinger:
       "The bulk of the changes are in qla2xxx target driver code to address
        various issues found during Cavium/QLogic's internal testing (stable
        CC's included), along with a few other stability and smaller
        miscellaneous improvements.
      
        There are also a couple of different patch sets from Mike Christie,
        which have been a result of his work to use target-core ALUA logic
        together with tcm-user backend driver.
      
        Finally, a patch to address some long standing issues with
        pass-through SCSI export of TYPE_TAPE + TYPE_MEDIUM_CHANGER devices,
        which will make folks using physical (or virtual) magnetic tape happy"
      
      * git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: (28 commits)
        qla2xxx: Update driver version to 9.00.00.00-k
        qla2xxx: Fix delayed response to command for loop mode/direct connect.
        qla2xxx: Change scsi host lookup method.
        qla2xxx: Add DebugFS node to display Port Database
        qla2xxx: Use IOCB interface to submit non-critical MBX.
        qla2xxx: Add async new target notification
        qla2xxx: Export DIF stats via debugfs
        qla2xxx: Improve T10-DIF/PI handling in driver.
        qla2xxx: Allow relogin to proceed if remote login did not finish
        qla2xxx: Fix sess_lock & hardware_lock lock order problem.
        qla2xxx: Fix inadequate lock protection for ABTS.
        qla2xxx: Fix request queue corruption.
        qla2xxx: Fix memory leak for abts processing
        qla2xxx: Allow vref count to timeout on vport delete.
        tcmu: Convert cmd_time_out into backend device attribute
        tcmu: make cmd timeout configurable
        tcmu: add helper to check if dev was configured
        target: fix race during implicit transition work flushes
        target: allow userspace to set state to transitioning
        target: fix ALUA transition timeout handling
        ...
      8aa34172
    • L
      Merge branch 'libnvdimm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm · 1b8df619
      Linus Torvalds 提交于
      Pull device-dax fixes from Dan Williams:
       "The device-dax driver was not being careful to handle falling back to
        smaller fault-granularity sizes.
      
        The driver already fails fault attempts that are smaller than the
        device's alignment, but it also needs to handle the cases where a
        larger page mapping could be established. For simplicity of the
        immediate fix the implementation just signals VM_FAULT_FALLBACK until
        fault-size == device-alignment.
      
        One fix is for -stable to address pmd-to-pte fallback from the
        original implementation, another fix is for the new (introduced in
        4.11-rc1) pud-to-pmd regression, and a typo fix comes along for the
        ride.
      
        These have received a build success notification from the kbuild
        robot"
      
      * 'libnvdimm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm:
        device-dax: fix debug output typo
        device-dax: fix pud fault fallback handling
        device-dax: fix pmd/pte fault fallback handling
      1b8df619
  4. 19 3月, 2017 12 次提交