[kernel] r22934 - in dists/wheezy/linux/debian: . patches patches/bugfix/all patches/bugfix/x86 patches/features/all patches/features/all/bql patches/features/all/drm patches/features/all/line6 patches/features/x86/hyperv
Ben Hutchings
benh at moszumanska.debian.org
Sat Aug 8 17:48:05 UTC 2015
Author: benh
Date: Sat Aug 8 17:48:04 2015
New Revision: 22934
Log:
Update to 3.2.70
drm, agp: Update to 3.4.108
Revert "ACPICA: Utilities: split IO address types from data type models."
to avoid ABI change on i386
Deleted:
dists/wheezy/linux/debian/patches/bugfix/all/aslr-fix-stack-randomization-on-64-bit-systems.patch
dists/wheezy/linux/debian/patches/bugfix/all/fs-take-i_mutex-during-prepare_binprm-for-set-ug-id-.patch
dists/wheezy/linux/debian/patches/bugfix/all/ib-core-prevent-integer-overflow-in-ib_umem_get.patch
dists/wheezy/linux/debian/patches/bugfix/all/ipv4-missing-sk_nulls_node_init-in-ping_unhash.patch
dists/wheezy/linux/debian/patches/bugfix/all/ipv6-don-t-reduce-hop-limit-for-an-interface.patch
dists/wheezy/linux/debian/patches/bugfix/all/net-llc-use-correct-size-for-sysctl-timeout-entries.patch
dists/wheezy/linux/debian/patches/bugfix/all/net-rds-use-correct-size-for-max-unacked-packets-and.patch
dists/wheezy/linux/debian/patches/bugfix/all/netfilter-nf_conntrack-reserve-two-bytes-for-nf_ct_e.patch
dists/wheezy/linux/debian/patches/bugfix/all/nfsv4-minor-cleanups-for-nfs4_handle_exception-and-n.patch
dists/wheezy/linux/debian/patches/bugfix/all/pipe-iovec-fix-memory-corruption-when-retrying-atomi.patch
dists/wheezy/linux/debian/patches/bugfix/all/sctp-fix-asconf-list-handling.patch
dists/wheezy/linux/debian/patches/bugfix/all/sg_start_req-make-sure-that-there-s-not-too-many-ele.patch
dists/wheezy/linux/debian/patches/bugfix/all/udf-check-length-of-extended-attributes-and-allocati.patch
dists/wheezy/linux/debian/patches/bugfix/all/udf-remove-repeated-loads-blocksize.patch
dists/wheezy/linux/debian/patches/bugfix/all/udp-fix-behavior-of-wrong-checksums.patch
dists/wheezy/linux/debian/patches/bugfix/all/vfs-read-file_handle-only-once-in-handle_to_path.patch
dists/wheezy/linux/debian/patches/bugfix/all/xen-pciback-limit-guest-control-of-command-register.patch
dists/wheezy/linux/debian/patches/bugfix/x86/crypto-aesni-fix-memory-usage-in-GCM-decryption.patch
dists/wheezy/linux/debian/patches/bugfix/x86/x86-asm-entry-64-remove-a-bogus-ret_from_fork-optimi.patch
dists/wheezy/linux/debian/patches/bugfix/x86/x86-bpf_jit-fix-compilation-of-large-bpf-programs.patch
dists/wheezy/linux/debian/patches/features/all/line6/0028-staging-line6-pcm.c-Removed-trailing-whitespace.patch
Modified:
dists/wheezy/linux/debian/changelog
dists/wheezy/linux/debian/patches/features/all/bql/tg3-support-for-byte-queue-limits.patch
dists/wheezy/linux/debian/patches/features/all/debugfs-add-mode-uid-and-gid-options.patch
dists/wheezy/linux/debian/patches/features/all/drm/drm-3.4.patch
dists/wheezy/linux/debian/patches/features/all/line6/0010-staging-line6-Remove-obsolete-code.patch
dists/wheezy/linux/debian/patches/features/all/line6/0017-staging-line6-fixed-ALSA-PCM-interaction.patch
dists/wheezy/linux/debian/patches/features/all/line6/0020-staging-line6-separate-handling-of-buffer-allocation.patch
dists/wheezy/linux/debian/patches/features/x86/hyperv/0055-Staging-hv-storvsc-Get-rid-of-the-on_io_completion-i.patch
dists/wheezy/linux/debian/patches/features/x86/hyperv/0067-Staging-hv-storvsc-Move-the-storage-driver-out-of-th.patch
dists/wheezy/linux/debian/patches/features/x86/hyperv/0077-hv-remove-the-second-argument-of-k-un-map_atomic.patch
dists/wheezy/linux/debian/patches/series
Modified: dists/wheezy/linux/debian/changelog
==============================================================================
--- dists/wheezy/linux/debian/changelog Fri Aug 7 18:47:01 2015 (r22933)
+++ dists/wheezy/linux/debian/changelog Sat Aug 8 17:48:04 2015 (r22934)
@@ -1,3 +1,355 @@
+linux (3.2.70-1) UNRELEASED; urgency=medium
+
+ * New upstream stable update:
+ http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-3.2.69
+ - PCI: Generate uppercase hex for modalias var in uevent
+ - usb: core: buffer: smallest buffer should start at ARCH_DMA_MINALIGN
+ - TPM: Add new TPMs to the tail of the list to prevent inadvertent change of
+ dev
+ - Bluetooth: ath3k: Add support of AR3012 bluetooth 13d3:3423 device
+ - [s390*] KVM: base hrtimer on a monotonic clock
+ - PCI: Fix infinite loop with ROM image of size 0
+ - [x86] staging: comedi: comedi_compat32.c: fix COMEDI_CMD copy back
+ - nfs: don't call blocking operations while !TASK_RUNNING
+ - cdc-acm: add sanity checks
+ - USB: fix use-after-free bug in usb_hcd_unlink_urb()
+ - tty: Prevent untrappable signals from malicious program
+ - xen/manage: Fix USB interaction issues when resuming
+ - rtnetlink: ifla_vf_policy: fix misuses of NLA_BINARY
+ - ALSA: off by one bug in snd_riptide_joystick_probe()
+ - fsnotify: fix handling of renames in audit
+ - NFSv4.1: Fix a kfree() of uninitialised pointers in decode_cb_sequence_args
+ - cpufreq: speedstep-smi: enable interrupts when waiting
+ - mm/hugetlb: fix getting refcount 0 page in hugetlb_fault()
+ - mm/hugetlb: add migration/hwpoisoned entry check in
+ hugetlb_change_protection
+ - mm/hugetlb: add migration entry check in __unmap_hugepage_range
+ - mm/mmap.c: fix arithmetic overflow in __vm_enough_memory()
+ - mm/nommu.c: fix arithmetic overflow in __vm_enough_memory()
+ - iscsi-target: Drop problematic active_ts_list usage
+ - mm/memory.c: actually remap enough memory
+ - drm/radeon/dp: Set EDP_CONFIGURATION_SET for bridge chips if necessary
+ - ALSA: hdspm - Constrain periods to 2 on older cards
+ - jffs2: fix handling of corrupted summary length
+ - dm mirror: do not degrade the mirror on discard error
+ - dm io: reject unsupported DISCARD requests with EOPNOTSUPP
+ - ipv6: fix ipv6_cow_metrics for non DST_HOST case
+ - fixed invalid assignment of 64bit mask to host dma_boundary for scatter
+ gather segment boundary limit.
+ - sg: fix read() error reporting
+ - netfilter: xt_socket: fix a stack corruption bug
+ - IB/qib: Do not write EEPROM
+ - dm: fix a race condition in dm_get_md
+ - dm snapshot: fix a possible invalid memory access on unload
+ - sched/autogroup: Fix failure to set cpu.rt_runtime_us
+ - libceph: fix double __remove_osd() problem
+ - kdb: fix incorrect counts in KDB summary command output
+ - ipv4: ip_check_defrag should correctly check return value of skb_copy_bits
+ - debugfs: leave freeing a symlink body until inode eviction
+ - autofs4: check dev ioctl size before allocating
+ - autofs4 copy_dev_ioctl(): keep the value of ->size we'd used for allocation
+ - xfs: ensure truncate forces zeroed blocks to disk
+ - gpio: tps65912: fix wrong container_of arguments
+ - ALSA: pcm: Don't leave PREPARED state after draining
+ - [x86] KVM: emulate: fix CMPXCHG8B on 32-bit hosts
+ - net: compat: Ignore MSG_CMSG_COMPAT in compat_sys_{send, recv}msg
+ - xhci: Allocate correct amount of scratchpad buffers
+ - USB: usbfs: don't leak kernel data in siginfo
+ - USB: ftdi_sio: add PIDs for Actisense USB devices
+ - USB: serial: fix potential use-after-free after failed probe
+ - USB: serial: fix tty-device error handling at probe
+ - mac80211: Send EAPOL frames at lowest rate
+ - USB: serial: cp210x: Adding Seletek device id's
+ - nilfs2: fix potential memory overrun on inode
+ - NFSv4: Don't call put_rpccred() under the rcu_read_lock()
+ - usb: ftdi_sio: Add jtag quirk support for Cyber Cortex AV boards
+ - eCryptfs: don't pass fs-specific ioctl commands through
+ - drm/radeon: do a posting read in r100_set_irq
+ - drm/radeon: do a posting read in rs600_set_irq
+ - drm/radeon: do a posting read in r600_set_irq
+ - drm/radeon: do a posting read in evergreen_set_irq
+ - drm/radeon: fix DRM_IOCTL_RADEON_CS oops
+ - ACPI / video: Load the module even if ACPI is disabled
+ - [armhf/omap] ASoC: omap-pcm: Correct dma mask
+ - xhci: fix reporting of 0-sized URBs in control endpoint
+ - xhci: Workaround for PME stuck issues in Intel xhci
+ - Change email address for 8250_pci
+ - tty: fix up atime/mtime mess, take four
+ - console: Fix console name size mismatch
+ - net: irda: fix wait_until_sent poll timeout
+ - TTY: fix tty_wait_until_sent on 64-bit machines
+ - sunrpc: fix braino in ->poll()
+ - gadgetfs: use-after-free in ->aio_read()
+ - gadgetfs: Fix leak on error in aio_read()
+ - ipvs: add missing ip_vs_pe_put in sync code
+ - spi: dw: revisit FIFO size detection again
+ - fuse: notify: don't move pages
+ - fuse: set stolen page uptodate
+ - dm: hold suspend_lock while suspending device during device deletion
+ - dm io: deal with wandering queue limits when handling REQ_DISCARD and
+ REQ_WRITE_SAME
+ - mac80211: drop unencrypted frames in mesh fwding
+ - mac80211: set only VO as a U-APSD enabled AC
+ - mac80211: disable u-APSD queues by default
+ - virtio_console: avoid config access from irq
+ - bnx2x: Force fundamental reset for EEH recovery
+ - libsas: Fix Kernel Crash in smp_execute_task
+ - Input: synaptics - query min dimensions for fw v8.1
+ - Input: synaptics - fix middle button on Lenovo 2015 products
+ - Input: synaptics - handle spurious release of trackstick buttons
+ - can: add missing initialisations in CAN related skbuffs
+ - vt6655: RFbSetPower fix missing rate RATE_12M
+ - ftrace: Fix en(dis)able graph caller when en(dis)abling record via sysctl
+ - ftrace: Fix ftrace enable ordering of sysctl ftrace_enabled
+ - [x86] asm/entry/32: Fix user_mode() misuses
+ - [x86] drm/vmwgfx: Reorder device takedown somewhat
+ - ALSA: control: Add sanity checks for user ctl id name string
+ - ALSA: snd-usb: add quirks for Roland UA-22
+ - nilfs2: fix deadlock of segment constructor during recovery
+ - nl80211: ignore HT/VHT capabilities without QoS/WMM
+ - pagemap: do not leak physical addresses to non-privileged userspace
+ - IB/mlx4: Saturate RoCE port PMA counters in case of overflow
+ - tcm_fc: missing curly braces in ft_invl_hw_context()
+ - target/pscsi: Fix NULL pointer dereference in get_device_type
+ - writeback: add missing INITIAL_JIFFIES init in global_update_bandwidth()
+ - nbd: fix possible memory leak
+ - iio: core: Fix double free.
+ - USB: ftdi_sio: Added custom PID for Synapse Wireless product
+ - USB: serial: keyspan_pda: fix Entrega company name spelling
+ - USB: keyspan_pda: add new device id
+ - net: ethernet: pcnet32: Setup the SRAM and NOUFLO on Am79C97{3, 5}
+ - net: compat: Update get_compat_msghdr() to match copy_msghdr_from_user()
+ behaviour
+ - cifs: fix use-after-free bug in find_writable_file
+ - perf: Fix irq_work 'tail' recursion
+ - sched: Fix RLIMIT_RTTIME when PI-boosting to RT
+ - writeback: fix possible underflow in write bandwidth calculation
+ - usb: xhci: handle Config Error Change (CEC) in xhci driver
+ - usb: xhci: apply XHCI_AVOID_BEI quirk to all Intel xHCI controllers
+ - net: use for_each_netdev_safe() in rtnl_group_changelink()
+ - USB: ftdi_sio: Use jtag quirk for SNAP Connect E10
+ - selinux: fix sel_write_enforce broken return value
+ - mm: fix anon_vma->degree underflow in anon_vma endless growing prevention
+ - hfsplus: fix B-tree corruption after insertion at position 0
+ - ALSA: hda - Add one more node in the EAPD supporting candidate list
+ - radeon: Do not directly dereference pointers to BIOS area.
+ - [x86] reboot: Remove VersaLogic Menlow reboot quirk
+ - [x86] ACPI: fix Dell M6600 ACPI reboot regression via DMI
+ - [x86] reboot: Remove quirk entry for SBC FITPC
+ - [x86] reboot: Add quirk to make Dell C6100 use reboot=pci automatically
+ - [x86] reboot: Fix apparent cut-n-paste mistake in Dell reboot workaround
+ - [x86] reboot: Remove the duplicate C6100 entry in the reboot quirks list
+ - [x86] reboot: Add reboot quirk for Dell Latitude E5410
+ - [x86] reboot: Add reboot quirk for Certec BPC600
+ - [x86] reboot: Add ASRock Q1900DC-ITX mainboard reboot quirk
+ - mac80211: fix RX A-MPDU session reorder timer deletion
+ - xen-netfront: transmit fully GSO-sized packets
+ - be2iscsi: Fix kernel panic when device initialization fails
+ - Defer processing of REQ_PREEMPT requests for blocked devices
+ - ocfs2: _really_ sync the right range
+ - ALSA: usb - Creative USB X-Fi Pro SB1095 volume knob support
+ - net:socket: set msg_namelen to 0 if msg_name is passed as NULL in msghdr
+ struct from userland.
+ - jfs: fix readdir regression
+ - ip: zero sockaddr returned on error queue
+ - net: rps: fix cpu unplug
+ - ipv6: stop sending PTB packets for MTU < 1280
+ - netxen: fix netxen_nic_poll() logic
+ - ping: Fix race in free in receive path
+ - ppp: deflate: never return len larger than output buffer
+ - rtnetlink: call ->dellink on failure when ->newlink exists
+ - gen_stats.c: Duplicate xstats buffer for later use
+ - ipv4: ip_check_defrag should not assume that skb_network_offset is zero
+ - ematch: Fix auto-loading of ematch modules.
+ - net: reject creation of netdev names with colons
+ - macvtap: limit head length of skb allocated
+ - macvtap: make sure neighbour code can push ethernet header
+ - usb: plusb: Add support for National Instruments host-to-host cable
+ - udp: only allow UFO for packets from SOCK_DGRAM sockets
+ - net: ping: Return EAFNOSUPPORT when appropriate.
+ - net: avoid to hang up on sending due to sysctl configuration overflow.
+ - net: sysctl_net_core: check SNDBUF and RCVBUF for min length
+ - rds: avoid potential stack overflow
+ - caif: fix MSG_OOB test in caif_seqpkt_recvmsg()
+ - rxrpc: bogus MSG_PEEK test in rxrpc_recvmsg()
+ - tcp: make connect() mem charging friendly
+ - 8139cp,8139too,r8169,tg3,ixgb,benet,gianfar: Call dev_kfree_skb_any
+ instead of kfree_skb
+ - ip_forward: Drop frames with attached skb->sk
+ - tcp: avoid looping in tcp_send_fin()
+ - net: make skb_gso_segment error handling more robust
+ - spi: spidev: fix possible arithmetic overflow for multi-transfer message
+ - IB/core: Avoid leakage from kernel to user space
+ - ipvs: rerouting to local clients is not needed anymore
+ - ipvs: uninitialized data with IP_VS_IPV6
+ - Revert "KVM: s390: flush CPU on load control"
+ http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-3.2.70
+ - Bluetooth: ath3k: Add support Atheros AR5B195 combo Mini PCIe card
+ - [x86] Drivers: hv: vmbus: Fix a bug in the error path in vmbus_open()
+ - e1000: add dummy allocator to fix race condition between mtu change and
+ netpoll
+ - [s390*] KVM: Zero out current VMDB of STSI before including level3 data.
+ - usb: musb: core: fix TX/RX endpoint order
+ - [x86] compal-laptop: Check return value of power_supply_register
+ - pinctrl: fix example .get_group_pins implementation signature
+ - drm/radeon: fix doublescan modes (v2)
+ - lib: memzero_explicit: use barrier instead of OPTIMIZER_HIDE_VAR
+ - cdc-wdm: fix endianness bug in debug statements
+ - UBI: account for bitflips in both the VID header and data
+ - UBI: fix out of bounds write
+ - UBI: initialize LEB number variable
+ - UBI: fix check for "too many bytes"
+ - [x86] Drivers: hv: vmbus: Don't wait after requesting offers
+ - Btrfs: fix log tree corruption when fs mounted with -o discard
+ - btrfs: don't accept bare namespace as a valid xattr
+ - ARM: 8320/1: fix integer overflow in ELF_ET_DYN_BASE
+ - rtlwifi: rtl8192cu: Add new USB ID
+ - [mips*] Hibernate: flush TLB entries earlier
+ - ext4: make fsync to sync parent dir in no-journal for real this time
+ - jhash: Update jhash_[321]words functions to use correct initval
+ - Input: elantech - fix absolute mode setting on some ASUS laptops
+ - RDS: Documentation: Document AF_RDS, PF_RDS and SOL_RDS correctly.
+ - selinux/nlmsg: add XFRM_MSG_GETSPDINFO
+ - selinux/nlmsg: add XFRM_MSG_[NEW|GET]SADINFO
+ - [x86] iommu: Fix header comments regarding standard and _FINISH macros
+ - scsi: storvsc: Fix a bug in copy_from_bounce_buffer()
+ - ALSA: emu10k1: don't deadlock in proc-functions
+ - [powerpc] Fix missing L2 cache size in /sys/devices/system/cpu
+ - selinux/nlmsg: add XFRM_MSG_REPORT
+ - selinux/nlmsg: add XFRM_MSG_MIGRATE
+ - selinux/nlmsg: add XFRM_MSG_MAPPING
+ - [s390*] hibernate: fix save and restore of kernel text section
+ - Btrfs: fix inode eviction infinite loop after cloning into it
+ - [powerpc] perf: Cap 64bit userspace backtraces to PERF_MAX_STACK_DEPTH
+ - fs/binfmt_elf.c: fix bug in loading of PIE binaries
+ - IB/core: disallow registering 0-sized memory region
+ - IB/core: don't disallow registering region starting at 0x0
+ - IB/mlx4: Fix WQE LSO segment calculation
+ - megaraid_sas: use raw_smp_processor_id()
+ - ptrace: fix race between ptrace_resume() and wait_task_stopped()
+ - memstick: mspro_block: add missing curly braces
+ - [x86] KVM: VMX: Preserve host CR4.MCE value while in guest mode.
+ - writeback: use |1 instead of +1 to protect against div by zero
+ - libata: Add helper to determine when PHY events should be ignored
+ - libata: Ignore spurious PHY event on LPM policy change
+ - ALSA: emu10k1: Fix card shortname string buffer overflow
+ - ALSA: emux: Fix mutex deadlock at unloading
+ - 3w-sas,3w-xxxx,3w-9xxx: fix command completion race
+ - cdc-acm: prevent infinite loop when parsing CDC headers.
+ - rtlwifi: rtl8192cu: Fix kernel deadlock
+ - serial: xilinx: Use platform_get_irq to get irq description structure
+ - serial: of-serial: Remove device_type = "serial" registration
+ - ALSA: emux: Fix mutex deadlock in OSS emulation
+ - ALSA: emu10k1: Emu10k2 32 bit DMA mode
+ - USB: cp210x: add ID for KCF Technologies PRN device
+ - USB: pl2303: Remove support for Samsung I330
+ - xen-pciback: Add name prefix to global 'permissive' variable
+ - gpio: unregister gpiochip device before removing it
+ - gpio: sysfs: fix memory leaks and device hotplug
+ - [powerpc] pseries: Correct cpu affinity for dlpar added cpus
+ - ext4: move check under lock scope to close a race.
+ - mmc: core: add missing pm event in mmc_pm_notify to fix hib restore
+ - nfsd: fix the check for confirmed openowner in nfs4_preprocess_stateid_op
+ - nilfs2: fix sanity check of btree level in nilfs_btree_root_broken()
+ - ocfs2: dlm: fix race between purge and get lock resource
+ - ACPI / init: Fix the ordering of acpi_reserve_resources()
+ - md/raid5: don't record new size if resize_stripes fails.
+ - ipvs: fix memory leak in ip_vs_ctl.c
+ - xhci: fix isoc endpoint dequeue from advancing too far on transaction error
+ - xhci: Solve full event ring by increasing TRBS_PER_SEGMENT to 256
+ - xhci: gracefully handle xhci_irq dead device
+ - usb-storage: Add NO_WP_DETECT quirk for Lacie 059f:0651 devices
+ - ahci: un-staticize ahci_dev_classify
+ - ahci: avoton port-disable reset-quirk
+ - mac80211: move WEP tailroom size check
+ - [x86] KVM: MMU: fix CR4.SMEP=1, CR0.WP=0 with shadow pages
+ - Input: elantech - fix semi-mt protocol for v3 HW
+ - [powerpc] Align TOC to 256 bytes
+ - dmi_scan: refactor dmi_scan_machine(), {smbios,dmi}_present()
+ - firmware: dmi_scan: Fix ordering of product_uuid
+ - ext4: check for zero length extent explicitly
+ - jbd2: fix r_count overflows leading to buffer overflow in journal recovery
+ - ALSA: hda - Add Conexant codecs CX20721, CX20722, CX20723 and CX20724
+ - sd: Disable support for 256 byte/sector disks
+ - xen/events: don't bind non-percpu VIRQs with percpu chip
+ - USB: serial: ftdi_sio: Add support for a Motion Tracker Development Board
+ - [s390*] crypto: ghash - Fix incorrect ghash icv buffer handling.
+ - bridge: fix parsing of MLDv2 reports
+ - lguest: fix out-by-one error in address checking.
+ - fs/binfmt_elf.c:load_elf_binary(): return -EINVAL on zero-length mappings
+ - fs, omfs: add NULL terminator in the end up the token list
+ - d_walk() might skip too much
+ - ALSA: usb-audio: Fix invalid volume resolution for Logitech HD Webcam C525
+ - ALSA: usb-audio: Add mic volume fix quirk for Logitech Quickcam Fusion
+ - target/pscsi: Don't leak scsi_host if hba is VIRTUAL_HOST
+ - [amd64] Fix strnlen_user() to not touch memory after specified maximum
+ - Input: elantech - fix detection of touchpads where the revision matches a
+ known rate
+ - ALSA: usb-audio: add MAYA44 USB+ mixer control names
+ - ALSA: usb-audio: fix missing input volume controls in MAYA44 USB(+)
+ - USB: cp210x: add ID for HubZ dual ZigBee and Z-Wave dongle
+ - Input: elantech - fix for newer hardware versions (v7)
+ - Input: elantech - add support for newer (August 2013) devices
+ - Input: elantech - add support for newer elantech touchpads
+ - Input: elantech - support new ICs types for version 4
+ - Input: elantech - add new icbody type
+ - bridge: fix multicast router rlist endless loop
+ - ring-buffer-benchmark: Fix the wrong sched_priority of producer
+ - tracing: Have filter check for balanced ops
+ - ipvs: kernel oops - do_ip_vs_get_ctl
+ - of: Add of_property_match_string() to find index into a string list
+ - dt: Add empty of_property_match_string() function
+ - [powerpc] Make logical to real cpu mapping code endian safe
+ - [powerpc] Don't skip ePAPR spin-table CPUs (regression in 3.2.69)
+ - net: dp83640: fix broken calibration routine.
+ - unix/caif: sk_socket can disappear when state is unlocked
+ - xen: netback: read hotplug script once at start of day.
+ - bridge: fix br_stp_set_bridge_priority race conditions
+ - packet: read num_members once in packet_rcv_fanout()
+ - packet: avoid out of bounds read in round robin fanout
+ - neigh: do not modify unlinked entries
+ - sctp: Fix race between OOTB responce and route removal
+ - debugfs: Fix statfs() regression in 3.2.69
+ - net: socket: Fix the wrong returns for recvmsg and sendmsg
+ - [x86] config: Enable NEED_DMA_MAP_STATE by default when SWIOTLB is
+ selected (Closes: #786551)
+ - sb_edac: Fix erroneous bytes->gigabytes conversion
+ - [x86] reboot: Fix a warning message triggered by stop_other_cpus()
+ - __ptrace_may_access() should not deny sub-threads
+ - [powerpc,sparc] mm: Remove hack in mmap randomize layout
+ - softirq: reduce latencies
+ - Fix lockup related to stop_machine being stuck in __do_softirq.
+ - [mips*] Fix race condition in lazy cache flushing.
+ - [mips/octeon] Remove udelay() causing huge IRQ latency
+ - [mips*] Fix cpu_has_mips_r2_exec_hazard.
+ - [mips/octeon] Delete override of cpu_has_mips_r2_exec_hazard.
+ - UBI: fix soft lockup in ubi_check_volume()
+ - [hppa] Provide __ucmpdi2 to resolve undefined references in 32 bit builds.
+ - staging: line6: avoid __sync_fetch_and_{and,or}
+
+ [ Ben Hutchings ]
+ * drm, agp: Update to 3.4.108:
+ - [x86] drm/i915: Unlock panel even when LVDS is disabled
+ - drm/radeon: kernel panic in drm_calc_vbltimestamp_from_scanoutpos with
+ 3.18.0-rc6
+ - [x86] drm/vmwgfx: Don't use memory accounting for kernel-side fence objects
+ - [x86] drm/vmwgfx: Fix fence event code
+ - drm/radeon: check the right ring in radeon_evict_flags()
+ - [x86] drm/i915: Only fence tiled region of object.
+ - drm/radeon/dp: Set EDP_CONFIGURATION_SET for bridge chips if necessary
+ - drm/radeon: do a posting read in r100_set_irq
+ - drm/radeon: do a posting read in rs600_set_irq
+ - drm/radeon: do a posting read in r600_set_irq
+ - drm/radeon: do a posting read in evergreen_set_irq
+ - drm/radeon: do a posting read in si_set_irq
+ - drm/radeon: fix DRM_IOCTL_RADEON_CS oops
+ - [x86] drm/vmwgfx: Reorder device takedown somewhat
+ - radeon: Do not directly dereference pointers to BIOS area.
+ * Revert "ACPICA: Utilities: split IO address types from data type models."
+ to avoid ABI change on i386
+
+ -- Ben Hutchings <ben at decadent.org.uk> Fri, 07 Aug 2015 19:47:24 +0100
+
linux (3.2.68-1+deb7u3) wheezy-security; urgency=medium
* udp: fix behavior of wrong checksums (CVE-2015-5364, CVE-2015-5366)
Modified: dists/wheezy/linux/debian/patches/features/all/bql/tg3-support-for-byte-queue-limits.patch
==============================================================================
--- dists/wheezy/linux/debian/patches/features/all/bql/tg3-support-for-byte-queue-limits.patch Fri Aug 7 18:47:01 2015 (r22933)
+++ dists/wheezy/linux/debian/patches/features/all/bql/tg3-support-for-byte-queue-limits.patch Sat Aug 8 17:48:04 2015 (r22934)
@@ -9,15 +9,15 @@
Signed-off-by: Tom Herbert <therbert at google.com>
Acked-by: Eric Dumazet <eric.dumazet at gmail.com>
Signed-off-by: David S. Miller <davem at davemloft.net>
+[bwh: Adjust to apply after backported commit 497a27b9e1bc
+ 'tg3: Call dev_kfree_skby_any instead of dev_kfree_skb.']
---
drivers/net/ethernet/broadcom/tg3.c | 8 ++++++++
1 file changed, 8 insertions(+)
-diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
-index aa413d6..cf36312 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
-@@ -5302,6 +5302,7 @@ static void tg3_tx(struct tg3_napi *tnapi)
+@@ -5362,6 +5362,7 @@ static void tg3_tx(struct tg3_napi *tnap
u32 sw_idx = tnapi->tx_cons;
struct netdev_queue *txq;
int index = tnapi - tp->napi;
@@ -25,17 +25,17 @@
if (tg3_flag(tp, ENABLE_TSS))
index--;
-@@ -5352,6 +5353,9 @@ static void tg3_tx(struct tg3_napi *tnapi)
+@@ -5412,6 +5413,9 @@ static void tg3_tx(struct tg3_napi *tnap
sw_idx = NEXT_TX(sw_idx);
}
+ pkts_compl++;
+ bytes_compl += skb->len;
+
- dev_kfree_skb(skb);
+ dev_kfree_skb_any(skb);
if (unlikely(tx_bug)) {
-@@ -5360,6 +5364,8 @@ static void tg3_tx(struct tg3_napi *tnapi)
+@@ -5420,6 +5424,8 @@ static void tg3_tx(struct tg3_napi *tnap
}
}
@@ -44,7 +44,7 @@
tnapi->tx_cons = sw_idx;
/* Need to make the tx_cons update visible to tg3_start_xmit()
-@@ -6804,6 +6810,7 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
+@@ -6863,6 +6869,7 @@ static netdev_tx_t tg3_start_xmit(struct
}
skb_tx_timestamp(skb);
@@ -52,7 +52,7 @@
/* Packets are ready, update Tx producer idx local and on card. */
tw32_tx_mbox(tnapi->prodmbox, entry);
-@@ -7286,6 +7293,7 @@ static void tg3_free_rings(struct tg3 *tp)
+@@ -7344,6 +7351,7 @@ static void tg3_free_rings(struct tg3 *t
dev_kfree_skb_any(skb);
}
}
Modified: dists/wheezy/linux/debian/patches/features/all/debugfs-add-mode-uid-and-gid-options.patch
==============================================================================
--- dists/wheezy/linux/debian/patches/features/all/debugfs-add-mode-uid-and-gid-options.patch Fri Aug 7 18:47:01 2015 (r22933)
+++ dists/wheezy/linux/debian/patches/features/all/debugfs-add-mode-uid-and-gid-options.patch Sat Aug 8 17:48:04 2015 (r22934)
@@ -15,11 +15,11 @@
Signed-off-by: Greg Kroah-Hartman <gregkh at suse.de>
[bwh: Backported to 3.2: super_operations::show_options takes a
struct vfsmount *, not a struct dentry *]
----
- Documentation/filesystems/debugfs.txt | 5 +-
- fs/debugfs/inode.c | 149 ++++++++++++++++++++++++++++++++-
- 2 files changed, 152 insertions(+), 2 deletions(-)
+[bwh: Adjust to apply after backported commit 0db59e59299f
+ 'debugfs: leave freeing a symlink body until inode eviction' and
+ commit 20a5d5d4ed15 'debugfs: Fix statfs() regression in 3.2.69']
+---
--- a/Documentation/filesystems/debugfs.txt
+++ b/Documentation/filesystems/debugfs.txt
@@ -14,7 +14,10 @@ Debugfs is typically mounted with a comm
@@ -50,8 +50,8 @@
static struct vfsmount *debugfs_mount;
static int debugfs_mount_count;
static bool debugfs_registered;
-@@ -125,11 +129,154 @@ static inline int debugfs_positive(struc
- return dentry->d_inode && !d_unhashed(dentry);
+@@ -133,23 +137,155 @@ static void debugfs_evict_inode(struct i
+ kfree(inode->i_private);
}
+struct debugfs_mount_opts {
@@ -163,18 +163,19 @@
+ return 0;
+}
+
-+static const struct super_operations debugfs_super_operations = {
-+ .statfs = simple_statfs,
+ static const struct super_operations debugfs_super_operations = {
+ .evict_inode = debugfs_evict_inode,
+ .statfs = simple_statfs,
+ .remount_fs = debugfs_remount,
+ .show_options = debugfs_show_options,
-+};
-+
+ };
+
static int debug_fill_super(struct super_block *sb, void *data, int silent)
{
static struct tree_descr debug_files[] = {{""}};
+ struct debugfs_fs_info *fsi;
-+ int err;
-+
+ int err;
+
+ save_mount_options(sb, data);
+
+ fsi = kzalloc(sizeof(struct debugfs_fs_info), GFP_KERNEL);
@@ -188,17 +189,17 @@
+ if (err)
+ goto fail;
+
-+ err = simple_fill_super(sb, DEBUGFS_MAGIC, debug_files);
-+ if (err)
+ err = simple_fill_super(sb, DEBUGFS_MAGIC, debug_files);
+ if (err)
+- return err;
+ goto fail;
-+
-+ sb->s_op = &debugfs_super_operations;
-+
+
+ sb->s_op = &debugfs_super_operations;
+
+ debugfs_apply_options(sb);
+
-+ return 0;
-
-- return simple_fill_super(sb, DEBUGFS_MAGIC, debug_files);
+ return 0;
++
+fail:
+ kfree(fsi);
+ sb->s_fs_info = NULL;
Modified: dists/wheezy/linux/debian/patches/features/all/drm/drm-3.4.patch
==============================================================================
--- dists/wheezy/linux/debian/patches/features/all/drm/drm-3.4.patch Fri Aug 7 18:47:01 2015 (r22933)
+++ dists/wheezy/linux/debian/patches/features/all/drm/drm-3.4.patch Sat Aug 8 17:48:04 2015 (r22934)
@@ -44507,7 +44507,7 @@
#define __i915_read(x, y) \
u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg);
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
-index 315a49e..2ac4ded 100644
+index 315a49e..b1f1d10 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -58,6 +58,7 @@ static void i915_gem_free_object_tail(struct drm_i915_gem_object *obj);
@@ -45180,35 +45180,7 @@
if (ret)
return ret;
}
-@@ -2248,13 +2193,6 @@ static int sandybridge_write_fence_reg(struct drm_i915_gem_object *obj,
- int regnum = obj->fence_reg;
- uint64_t val;
-
-- /* Adjust fence size to match tiled area */
-- if (obj->tiling_mode != I915_TILING_NONE) {
-- uint32_t row_size = obj->stride *
-- (obj->tiling_mode == I915_TILING_Y ? 32 : 8);
-- size = (size / row_size) * row_size;
-- }
--
- val = (uint64_t)((obj->gtt_offset + size - 4096) &
- 0xfffff000) << 32;
- val |= obj->gtt_offset & 0xfffff000;
-@@ -2292,13 +2230,6 @@ static int i965_write_fence_reg(struct drm_i915_gem_object *obj,
- int regnum = obj->fence_reg;
- uint64_t val;
-
-- /* Adjust fence size to match tiled area */
-- if (obj->tiling_mode != I915_TILING_NONE) {
-- uint32_t row_size = obj->stride *
-- (obj->tiling_mode == I915_TILING_Y ? 32 : 8);
-- size = (size / row_size) * row_size;
-- }
--
- val = (uint64_t)((obj->gtt_offset + size - 4096) &
- 0xfffff000) << 32;
- val |= obj->gtt_offset & 0xfffff000;
-@@ -2448,7 +2379,8 @@ i915_gem_object_flush_fence(struct drm_i915_gem_object *obj,
+@@ -2448,7 +2393,8 @@ i915_gem_object_flush_fence(struct drm_i915_gem_object *obj,
if (!ring_passed_seqno(obj->last_fenced_ring,
obj->last_fenced_seqno)) {
ret = i915_wait_request(obj->last_fenced_ring,
@@ -45218,7 +45190,7 @@
if (ret)
return ret;
}
-@@ -2480,6 +2412,8 @@ i915_gem_object_put_fence(struct drm_i915_gem_object *obj)
+@@ -2480,6 +2426,8 @@ i915_gem_object_put_fence(struct drm_i915_gem_object *obj)
if (obj->fence_reg != I915_FENCE_REG_NONE) {
struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
@@ -45227,7 +45199,7 @@
i915_gem_clear_fence_reg(obj->base.dev,
&dev_priv->fence_regs[obj->fence_reg]);
-@@ -2504,7 +2438,7 @@ i915_find_fence_reg(struct drm_device *dev,
+@@ -2504,7 +2452,7 @@ i915_find_fence_reg(struct drm_device *dev,
if (!reg->obj)
return reg;
@@ -45236,7 +45208,7 @@
avail = reg;
}
-@@ -2514,7 +2448,7 @@ i915_find_fence_reg(struct drm_device *dev,
+@@ -2514,7 +2462,7 @@ i915_find_fence_reg(struct drm_device *dev,
/* None available, try to steal one or wait for a user to finish */
avail = first = NULL;
list_for_each_entry(reg, &dev_priv->mm.fence_list, lru_list) {
@@ -45245,7 +45217,7 @@
continue;
if (first == NULL)
-@@ -2594,7 +2528,8 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj,
+@@ -2594,7 +2542,8 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj,
if (!ring_passed_seqno(obj->last_fenced_ring,
reg->setup_seqno)) {
ret = i915_wait_request(obj->last_fenced_ring,
@@ -45255,7 +45227,7 @@
if (ret)
return ret;
}
-@@ -2613,7 +2548,7 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj,
+@@ -2613,7 +2562,7 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj,
reg = i915_find_fence_reg(dev, pipelined);
if (reg == NULL)
@@ -45264,7 +45236,7 @@
ret = i915_gem_object_flush_fence(obj, pipelined);
if (ret)
-@@ -2724,6 +2659,7 @@ i915_gem_clear_fence_reg(struct drm_device *dev,
+@@ -2724,6 +2673,7 @@ i915_gem_clear_fence_reg(struct drm_device *dev,
list_del_init(®->lru_list);
reg->obj = NULL;
reg->setup_seqno = 0;
@@ -45272,7 +45244,7 @@
}
/**
-@@ -3010,6 +2946,8 @@ i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write)
+@@ -3010,6 +2960,8 @@ i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write)
int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
enum i915_cache_level cache_level)
{
@@ -45281,7 +45253,7 @@
int ret;
if (obj->cache_level == cache_level)
-@@ -3038,6 +2976,9 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
+@@ -3038,6 +2990,9 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
}
i915_gem_gtt_rebind_object(obj, cache_level);
@@ -45291,7 +45263,7 @@
}
if (cache_level == I915_CACHE_NONE) {
-@@ -3376,8 +3317,8 @@ i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
+@@ -3376,8 +3331,8 @@ i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
if (ret == 0 && atomic_read(&dev_priv->mm.wedged))
ret = -EIO;
@@ -45302,7 +45274,7 @@
atomic_read(&dev_priv->mm.wedged), 3000)) {
ret = -EBUSY;
}
-@@ -3688,8 +3629,8 @@ struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev,
+@@ -3688,8 +3643,8 @@ struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev,
obj->base.write_domain = I915_GEM_DOMAIN_CPU;
obj->base.read_domains = I915_GEM_DOMAIN_CPU;
@@ -45313,7 +45285,7 @@
* cache) for about a 10% performance improvement
* compared to uncached. Graphics requests other than
* display scanout are coherent with the CPU in
-@@ -3779,7 +3720,7 @@ i915_gem_idle(struct drm_device *dev)
+@@ -3779,7 +3734,7 @@ i915_gem_idle(struct drm_device *dev)
return 0;
}
@@ -45322,7 +45294,7 @@
if (ret) {
mutex_unlock(&dev->struct_mutex);
return ret;
-@@ -3814,12 +3755,91 @@ i915_gem_idle(struct drm_device *dev)
+@@ -3814,12 +3769,91 @@ i915_gem_idle(struct drm_device *dev)
return 0;
}
@@ -45415,7 +45387,7 @@
ret = intel_init_render_ring_buffer(dev);
if (ret)
return ret;
-@@ -3838,6 +3858,8 @@ i915_gem_init_ringbuffer(struct drm_device *dev)
+@@ -3838,6 +3872,8 @@ i915_gem_init_ringbuffer(struct drm_device *dev)
dev_priv->next_seqno = 1;
@@ -45424,7 +45396,7 @@
return 0;
cleanup_bsd_ring:
-@@ -3875,7 +3897,7 @@ i915_gem_entervt_ioctl(struct drm_device *dev, void *data,
+@@ -3875,7 +3911,7 @@ i915_gem_entervt_ioctl(struct drm_device *dev, void *data,
mutex_lock(&dev->struct_mutex);
dev_priv->mm.suspended = 0;
@@ -45433,7 +45405,7 @@
if (ret != 0) {
mutex_unlock(&dev->struct_mutex);
return ret;
-@@ -4270,7 +4292,7 @@ rescan:
+@@ -4270,7 +4306,7 @@ rescan:
* This has a dramatic impact to reduce the number of
* OOM-killer events whilst running the GPU aggressively.
*/
@@ -45506,7 +45478,7 @@
return ret;
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
-index a0b69ae..e97ed61 100644
+index a0b69ae0..e97ed61 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -203,9 +203,9 @@ i915_gem_object_set_to_gpu_domain(struct drm_i915_gem_object *obj,
@@ -50092,7 +50064,7 @@
}
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
-index 4da8182..77190cc 100644
+index 4da8182..3febe29 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -187,6 +187,8 @@ centre_horizontally(struct drm_display_mode *mode,
@@ -50141,46 +50113,15 @@
/**
* intel_lvds_init - setup LVDS connectors on this device
* @dev: drm device
-@@ -914,17 +932,8 @@ bool intel_lvds_init(struct drm_device *dev)
- int pipe;
- u8 pin;
-
-- /*
-- * Unlock registers and just leave them unlocked. Do this before
-- * checking quirk lists to avoid bogus WARNINGs.
-- */
-- if (HAS_PCH_SPLIT(dev)) {
-- I915_WRITE(PCH_PP_CONTROL,
-- I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS);
-- } else {
-- I915_WRITE(PP_CONTROL,
-- I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
-- }
+@@ -925,6 +943,8 @@ bool intel_lvds_init(struct drm_device *dev)
+ I915_WRITE(PP_CONTROL,
+ I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
+ }
+ if (!intel_lvds_supported(dev))
+ return false;
/* Skip init on machines we know falsely report LVDS */
if (dmi_check_system(intel_no_lvds))
-@@ -1100,6 +1109,19 @@ out:
- pwm = I915_READ(BLC_PWM_PCH_CTL1);
- pwm |= PWM_PCH_ENABLE;
- I915_WRITE(BLC_PWM_PCH_CTL1, pwm);
-+ /*
-+ * Unlock registers and just
-+ * leave them unlocked
-+ */
-+ I915_WRITE(PCH_PP_CONTROL,
-+ I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS);
-+ } else {
-+ /*
-+ * Unlock registers and just
-+ * leave them unlocked
-+ */
-+ I915_WRITE(PP_CONTROL,
-+ I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
- }
- dev_priv->lid_notifier.notifier_call = intel_lid_notify;
- if (acpi_lid_notifier_register(&dev_priv->lid_notifier)) {
diff --git a/drivers/gpu/drm/i915/intel_modes.c b/drivers/gpu/drm/i915/intel_modes.c
index be2c6fe..9a2b270 100644
--- a/drivers/gpu/drm/i915/intel_modes.c
@@ -71826,7 +71767,7 @@
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
-index 927d170..d51c08d 100644
+index 76c4f2a..d51c08d 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -231,6 +231,22 @@ static void atombios_blank_crtc(struct drm_crtc *crtc, int state)
@@ -71870,7 +71811,31 @@
atombios_enable_crtc_memreq(crtc, ATOM_DISABLE);
atombios_enable_crtc(crtc, ATOM_DISABLE);
radeon_crtc->enabled = false;
-@@ -355,15 +371,12 @@ static void atombios_crtc_set_timing(struct drm_crtc *crtc,
+@@ -302,10 +318,8 @@ atombios_set_crtc_dtd_timing(struct drm_crtc *crtc,
+ misc |= ATOM_COMPOSITESYNC;
+ if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+ misc |= ATOM_INTERLACE;
+- if (mode->flags & DRM_MODE_FLAG_DBLCLK)
+- misc |= ATOM_DOUBLE_CLOCK_MODE;
+ if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
+- misc |= ATOM_H_REPLICATIONBY2 | ATOM_V_REPLICATIONBY2;
++ misc |= ATOM_DOUBLE_CLOCK_MODE;
+
+ args.susModeMiscInfo.usAccess = cpu_to_le16(misc);
+ args.ucCRTC = radeon_crtc->crtc_id;
+@@ -348,10 +362,8 @@ static void atombios_crtc_set_timing(struct drm_crtc *crtc,
+ misc |= ATOM_COMPOSITESYNC;
+ if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+ misc |= ATOM_INTERLACE;
+- if (mode->flags & DRM_MODE_FLAG_DBLCLK)
+- misc |= ATOM_DOUBLE_CLOCK_MODE;
+ if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
+- misc |= ATOM_H_REPLICATIONBY2 | ATOM_V_REPLICATIONBY2;
++ misc |= ATOM_DOUBLE_CLOCK_MODE;
+
+ args.susModeMiscInfo.usAccess = cpu_to_le16(misc);
+ args.ucCRTC = radeon_crtc->crtc_id;
+@@ -359,15 +371,12 @@ static void atombios_crtc_set_timing(struct drm_crtc *crtc,
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
}
@@ -71888,7 +71853,7 @@
case ATOM_PPLL1:
ss_cntl = RREG32(EVERGREEN_P1PLL_SS_CNTL);
ss_cntl &= ~EVERGREEN_PxPLL_SS_EN;
-@@ -379,7 +392,7 @@ static void atombios_disable_ss(struct drm_crtc *crtc)
+@@ -383,7 +392,7 @@ static void atombios_disable_ss(struct drm_crtc *crtc)
return;
}
} else if (ASIC_IS_AVIVO(rdev)) {
@@ -71897,7 +71862,7 @@
case ATOM_PPLL1:
ss_cntl = RREG32(AVIVO_P1PLL_INT_SS_CNTL);
ss_cntl &= ~1;
-@@ -406,16 +419,31 @@ union atom_enable_ss {
+@@ -410,16 +419,31 @@ union atom_enable_ss {
ENABLE_SPREAD_SPECTRUM_ON_PPLL_V3 v3;
};
@@ -71932,7 +71897,7 @@
memset(&args, 0, sizeof(args));
if (ASIC_IS_DCE5(rdev)) {
-@@ -441,7 +469,7 @@ static void atombios_crtc_program_ss(struct drm_crtc *crtc,
+@@ -445,7 +469,7 @@ static void atombios_crtc_program_ss(struct drm_crtc *crtc,
return;
}
args.v3.ucEnable = enable;
@@ -71941,7 +71906,7 @@
args.v3.ucEnable = ATOM_DISABLE;
} else if (ASIC_IS_DCE4(rdev)) {
args.v2.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage);
-@@ -479,7 +507,7 @@ static void atombios_crtc_program_ss(struct drm_crtc *crtc,
+@@ -483,7 +507,7 @@ static void atombios_crtc_program_ss(struct drm_crtc *crtc,
} else if (ASIC_IS_AVIVO(rdev)) {
if ((enable == ATOM_DISABLE) || (ss->percentage == 0) ||
(ss->type & ATOM_EXTERNAL_SS_MASK)) {
@@ -71950,7 +71915,7 @@
return;
}
args.lvds_ss_2.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage);
-@@ -491,7 +519,7 @@ static void atombios_crtc_program_ss(struct drm_crtc *crtc,
+@@ -495,7 +519,7 @@ static void atombios_crtc_program_ss(struct drm_crtc *crtc,
} else {
if ((enable == ATOM_DISABLE) || (ss->percentage == 0) ||
(ss->type & ATOM_EXTERNAL_SS_MASK)) {
@@ -71959,7 +71924,7 @@
return;
}
args.lvds_ss.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage);
-@@ -523,6 +551,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
+@@ -527,6 +551,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
int encoder_mode = 0;
u32 dp_clock = mode->clock;
int bpc = 8;
@@ -71967,7 +71932,7 @@
/* reset the pll flags */
pll->flags = 0;
-@@ -542,7 +571,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
+@@ -546,7 +571,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
if (rdev->family < CHIP_RV770)
pll->flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP;
/* use frac fb div on APUs */
@@ -71976,7 +71941,7 @@
pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV;
/* use frac fb div on RS780/RS880 */
if ((rdev->family == CHIP_RS780) || (rdev->family == CHIP_RS880))
-@@ -562,9 +591,10 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
+@@ -566,9 +591,10 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
if (encoder->crtc == crtc) {
radeon_encoder = to_radeon_encoder(encoder);
connector = radeon_get_connector_for_encoder(encoder);
@@ -71989,7 +71954,7 @@
if ((radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT | ATOM_DEVICE_DFP_SUPPORT)) ||
(radeon_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE)) {
if (connector) {
-@@ -660,7 +690,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
+@@ -664,7 +690,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
if (dig->coherent_mode)
args.v3.sInput.ucDispPllConfig |=
DISPPLL_CONFIG_COHERENT_MODE;
@@ -71998,7 +71963,7 @@
args.v3.sInput.ucDispPllConfig |=
DISPPLL_CONFIG_DUAL_LINK;
}
-@@ -710,11 +740,9 @@ union set_pixel_clock {
+@@ -714,11 +740,9 @@ union set_pixel_clock {
/* on DCE5, make sure the voltage is high enough to support the
* required disp clk.
*/
@@ -72011,7 +71976,7 @@
u8 frev, crev;
int index;
union set_pixel_clock args;
-@@ -742,7 +770,12 @@ static void atombios_crtc_set_dcpll(struct drm_crtc *crtc,
+@@ -746,7 +770,12 @@ static void atombios_crtc_set_dcpll(struct drm_crtc *crtc,
* SetPixelClock provides the dividers
*/
args.v6.ulDispEngClkFreq = cpu_to_le32(dispclk);
@@ -72025,7 +71990,7 @@
break;
default:
DRM_ERROR("Unknown table version %d %d\n", frev, crev);
-@@ -939,7 +972,9 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
+@@ -943,7 +972,9 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
struct radeon_connector_atom_dig *dig_connector =
radeon_connector->con_priv;
int dp_clock;
@@ -72036,7 +72001,7 @@
switch (encoder_mode) {
case ATOM_ENCODER_MODE_DP_MST:
-@@ -960,13 +995,10 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
+@@ -964,13 +995,10 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
ss_enabled =
radeon_atombios_get_ppll_ss_info(rdev, &ss,
ATOM_DP_SS_ID1);
@@ -72051,7 +72016,7 @@
}
break;
case ATOM_ENCODER_MODE_LVDS:
-@@ -1011,7 +1043,7 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
+@@ -1015,7 +1043,7 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
radeon_compute_pll_legacy(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div,
&ref_div, &post_div);
@@ -72060,7 +72025,7 @@
atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id,
encoder_mode, radeon_encoder->encoder_id, mode->clock,
-@@ -1034,7 +1066,7 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
+@@ -1038,7 +1066,7 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
ss.step = step_size;
}
@@ -72069,7 +72034,7 @@
}
}
-@@ -1051,6 +1083,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
+@@ -1055,6 +1083,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
struct radeon_bo *rbo;
uint64_t fb_location;
uint32_t fb_format, fb_pitch_pixels, tiling_flags;
@@ -72077,7 +72042,7 @@
u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE);
u32 tmp, viewport_w, viewport_h;
int r;
-@@ -1141,20 +1174,13 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
+@@ -1145,20 +1174,13 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
break;
}
@@ -72104,7 +72069,7 @@
} else if (tiling_flags & RADEON_TILING_MICRO)
fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_1D_TILED_THIN1);
-@@ -1199,7 +1225,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
+@@ -1203,7 +1225,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
WREG32(EVERGREEN_GRPH_X_END + radeon_crtc->crtc_offset, target_fb->width);
WREG32(EVERGREEN_GRPH_Y_END + radeon_crtc->crtc_offset, target_fb->height);
@@ -72113,7 +72078,7 @@
WREG32(EVERGREEN_GRPH_PITCH + radeon_crtc->crtc_offset, fb_pitch_pixels);
WREG32(EVERGREEN_GRPH_ENABLE + radeon_crtc->crtc_offset, 1);
-@@ -1368,7 +1394,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
+@@ -1372,7 +1394,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
WREG32(AVIVO_D1GRPH_X_END + radeon_crtc->crtc_offset, target_fb->width);
WREG32(AVIVO_D1GRPH_Y_END + radeon_crtc->crtc_offset, target_fb->height);
@@ -72122,7 +72087,7 @@
WREG32(AVIVO_D1GRPH_PITCH + radeon_crtc->crtc_offset, fb_pitch_pixels);
WREG32(AVIVO_D1GRPH_ENABLE + radeon_crtc->crtc_offset, 1);
-@@ -1470,7 +1496,36 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc)
+@@ -1474,7 +1496,36 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc)
struct drm_crtc *test_crtc;
uint32_t pll_in_use = 0;
@@ -72160,7 +72125,7 @@
list_for_each_entry(test_encoder, &dev->mode_config.encoder_list, head) {
if (test_encoder->crtc && (test_encoder->crtc == crtc)) {
/* in DP mode, the DP ref clock can come from PPLL, DCPLL, or ext clock,
-@@ -1485,6 +1540,8 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc)
+@@ -1489,6 +1540,8 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc)
if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(test_encoder))) {
if (rdev->clock.dp_extclk)
return ATOM_PPLL_INVALID;
@@ -72169,7 +72134,7 @@
else if (ASIC_IS_DCE5(rdev))
return ATOM_DCPLL;
}
-@@ -1511,6 +1568,26 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc)
+@@ -1515,6 +1568,26 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc)
}
@@ -72196,7 +72161,7 @@
int atombios_crtc_mode_set(struct drm_crtc *crtc,
struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode,
-@@ -1532,19 +1609,6 @@ int atombios_crtc_mode_set(struct drm_crtc *crtc,
+@@ -1536,19 +1609,6 @@ int atombios_crtc_mode_set(struct drm_crtc *crtc,
}
}
@@ -72216,7 +72181,7 @@
atombios_crtc_set_pll(crtc, adjusted_mode);
if (ASIC_IS_DCE4(rdev))
-@@ -1578,18 +1642,28 @@ static bool atombios_crtc_mode_fixup(struct drm_crtc *crtc,
+@@ -1582,18 +1642,28 @@ static bool atombios_crtc_mode_fixup(struct drm_crtc *crtc,
static void atombios_crtc_prepare(struct drm_crtc *crtc)
{
struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
@@ -72245,7 +72210,7 @@
}
static void atombios_crtc_disable(struct drm_crtc *crtc)
-@@ -1601,6 +1675,8 @@ static void atombios_crtc_disable(struct drm_crtc *crtc)
+@@ -1605,6 +1675,8 @@ static void atombios_crtc_disable(struct drm_crtc *crtc)
int i;
atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
@@ -72254,7 +72219,7 @@
for (i = 0; i < rdev->num_crtc; i++) {
if (rdev->mode_info.crtcs[i] &&
-@@ -1621,6 +1697,12 @@ static void atombios_crtc_disable(struct drm_crtc *crtc)
+@@ -1625,6 +1697,12 @@ static void atombios_crtc_disable(struct drm_crtc *crtc)
atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id,
0, 0, ATOM_DISABLE, 0, 0, 0, 0, 0, false, &ss);
break;
@@ -72268,7 +72233,7 @@
break;
}
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c
-index e8a3c31..8d1724c 100644
+index 3e34f1e..5325c20 100644
--- a/drivers/gpu/drm/radeon/atombios_dp.c
+++ b/drivers/gpu/drm/radeon/atombios_dp.c
@@ -45,6 +45,41 @@ static char *pre_emph_names[] = {
@@ -72362,7 +72327,7 @@
}
/* get the max pix clock supported by the link rate and lane num */
-@@ -746,7 +784,8 @@ static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info)
+@@ -744,7 +782,8 @@ static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info)
/* set the lane count on the sink */
tmp = dp_info->dp_lane_count;
@@ -73004,7 +72969,7 @@
#include <linux/kernel.h>
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
-index 9b3f787..01434ef 100644
+index 5d78973..c5fe79e 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -50,6 +50,39 @@ static const u32 crtc_offsets[6] =
@@ -73543,7 +73508,17 @@
WREG32(GRBM_INT_CNTL, grbm_int_cntl);
WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
-@@ -2765,7 +2918,6 @@ static u32 evergreen_get_ih_wptr(struct radeon_device *rdev)
+@@ -2631,9 +2784,6 @@ int evergreen_irq_set(struct radeon_device *rdev)
+ WREG32(DC_HPD5_INT_CONTROL, hpd5);
+ WREG32(DC_HPD6_INT_CONTROL, hpd6);
+
+- /* posting read */
+- RREG32(SRBM_STATUS);
+-
+ return 0;
+ }
+
+@@ -2768,7 +2918,6 @@ static u32 evergreen_get_ih_wptr(struct radeon_device *rdev)
tmp = RREG32(IH_RB_CNTL);
tmp |= IH_WPTR_OVERFLOW_CLEAR;
WREG32(IH_RB_CNTL, tmp);
@@ -73551,7 +73526,7 @@
}
return (wptr & rdev->ih.ptr_mask);
}
-@@ -3015,11 +3167,24 @@ restart_ih:
+@@ -3018,11 +3167,24 @@ restart_ih:
case 177: /* CP_INT in IB1 */
case 178: /* CP_INT in IB2 */
DRM_DEBUG("IH: CP int: 0x%08x\n", src_data);
@@ -73578,7 +73553,7 @@
break;
case 233: /* GUI IDLE */
DRM_DEBUG("IH: GUI idle\n");
-@@ -3049,6 +3214,7 @@ restart_ih:
+@@ -3052,6 +3214,7 @@ restart_ih:
static int evergreen_startup(struct radeon_device *rdev)
{
@@ -73586,7 +73561,7 @@
int r;
/* enable pcie gen2 link */
-@@ -3095,7 +3261,7 @@ static int evergreen_startup(struct radeon_device *rdev)
+@@ -3098,7 +3261,7 @@ static int evergreen_startup(struct radeon_device *rdev)
r = evergreen_blit_init(rdev);
if (r) {
r600_blit_fini(rdev);
@@ -73595,7 +73570,7 @@
dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
}
-@@ -3104,6 +3270,12 @@ static int evergreen_startup(struct radeon_device *rdev)
+@@ -3107,6 +3270,12 @@ static int evergreen_startup(struct radeon_device *rdev)
if (r)
return r;
@@ -73608,7 +73583,7 @@
/* Enable IRQ */
if (!rdev->irq.installed) {
r = radeon_irq_kms_init(rdev);
-@@ -3119,7 +3291,9 @@ static int evergreen_startup(struct radeon_device *rdev)
+@@ -3122,7 +3291,9 @@ static int evergreen_startup(struct radeon_device *rdev)
}
evergreen_irq_set(rdev);
@@ -73619,7 +73594,7 @@
if (r)
return r;
r = evergreen_cp_load_microcode(rdev);
-@@ -3129,6 +3303,23 @@ static int evergreen_startup(struct radeon_device *rdev)
+@@ -3132,6 +3303,23 @@ static int evergreen_startup(struct radeon_device *rdev)
if (r)
return r;
@@ -73643,7 +73618,7 @@
return 0;
}
-@@ -3148,15 +3339,11 @@ int evergreen_resume(struct radeon_device *rdev)
+@@ -3151,15 +3339,11 @@ int evergreen_resume(struct radeon_device *rdev)
/* post card */
atom_asic_init(rdev->mode_info.atom_context);
@@ -73661,7 +73636,7 @@
return r;
}
-@@ -3166,13 +3353,17 @@ int evergreen_resume(struct radeon_device *rdev)
+@@ -3169,13 +3353,17 @@ int evergreen_resume(struct radeon_device *rdev)
int evergreen_suspend(struct radeon_device *rdev)
{
@@ -73681,7 +73656,7 @@
return 0;
}
-@@ -3243,8 +3434,8 @@ int evergreen_init(struct radeon_device *rdev)
+@@ -3246,8 +3434,8 @@ int evergreen_init(struct radeon_device *rdev)
if (r)
return r;
@@ -73692,7 +73667,7 @@
rdev->ih.ring_obj = NULL;
r600_ih_ring_init(rdev, 64 * 1024);
-@@ -3253,29 +3444,24 @@ int evergreen_init(struct radeon_device *rdev)
+@@ -3256,29 +3444,24 @@ int evergreen_init(struct radeon_device *rdev)
if (r)
return r;
@@ -73729,7 +73704,15 @@
/* Don't start up if the MC ucode is missing on BTC parts.
* The default clocks and voltages before the MC ucode
-@@ -3293,15 +3479,17 @@ int evergreen_init(struct radeon_device *rdev)
+@@ -3291,20 +3474,25 @@ int evergreen_init(struct radeon_device *rdev)
+ }
+ }
+
++ /* posting read */
++ RREG32(SRBM_STATUS);
++
+ return 0;
+ }
void evergreen_fini(struct radeon_device *rdev)
{
@@ -77861,7 +77844,7 @@
#define PACKET3_PREAMBLE_CNTL 0x4A
# define PACKET3_PREAMBLE_BEGIN_CLEAR_STATE (2 << 28)
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
-index 76c1290..40ed0e5 100644
+index dfd1267..8ec5b85 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -65,6 +65,40 @@ MODULE_FIRMWARE(FIRMWARE_R520);
@@ -77973,7 +77956,7 @@
tmp |= RADEON_SW_INT_ENABLE;
}
if (rdev->irq.gui_idle) {
-@@ -739,7 +777,7 @@ int r100_irq_process(struct radeon_device *rdev)
+@@ -743,7 +781,7 @@ int r100_irq_process(struct radeon_device *rdev)
while (status) {
/* SW interrupt */
if (status & RADEON_SW_INT_TEST) {
@@ -77982,7 +77965,7 @@
}
/* gui idle interrupt */
if (status & RADEON_GUI_IDLE_STAT) {
-@@ -809,25 +847,36 @@ u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc)
+@@ -813,25 +851,36 @@ u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc)
void r100_fence_ring_emit(struct radeon_device *rdev,
struct radeon_fence *fence)
{
@@ -78033,7 +78016,7 @@
}
int r100_copy_blit(struct radeon_device *rdev,
-@@ -836,6 +885,7 @@ int r100_copy_blit(struct radeon_device *rdev,
+@@ -840,6 +889,7 @@ int r100_copy_blit(struct radeon_device *rdev,
unsigned num_gpu_pages,
struct radeon_fence *fence)
{
@@ -78041,7 +78024,7 @@
uint32_t cur_pages;
uint32_t stride_bytes = RADEON_GPU_PAGE_SIZE;
uint32_t pitch;
-@@ -853,7 +903,7 @@ int r100_copy_blit(struct radeon_device *rdev,
+@@ -857,7 +907,7 @@ int r100_copy_blit(struct radeon_device *rdev,
/* Ask for enough room for blit + flush + fence */
ndw = 64 + (10 * num_loops);
@@ -78050,7 +78033,7 @@
if (r) {
DRM_ERROR("radeon: moving bo (%d) asking for %u dw.\n", r, ndw);
return -EINVAL;
-@@ -867,8 +917,8 @@ int r100_copy_blit(struct radeon_device *rdev,
+@@ -871,8 +921,8 @@ int r100_copy_blit(struct radeon_device *rdev,
/* pages are in Y direction - height
page width in X direction - width */
@@ -78061,7 +78044,7 @@
RADEON_GMC_SRC_PITCH_OFFSET_CNTL |
RADEON_GMC_DST_PITCH_OFFSET_CNTL |
RADEON_GMC_SRC_CLIPPING |
-@@ -880,26 +930,26 @@ int r100_copy_blit(struct radeon_device *rdev,
+@@ -884,26 +934,26 @@ int r100_copy_blit(struct radeon_device *rdev,
RADEON_DP_SRC_SOURCE_MEMORY |
RADEON_GMC_CLR_CMP_CNTL_DIS |
RADEON_GMC_WR_MSK_DIS);
@@ -78102,7 +78085,7 @@
return r;
}
-@@ -918,21 +968,21 @@ static int r100_cp_wait_for_idle(struct radeon_device *rdev)
+@@ -922,21 +972,21 @@ static int r100_cp_wait_for_idle(struct radeon_device *rdev)
return -1;
}
@@ -78129,7 +78112,7 @@
}
-@@ -1033,6 +1083,7 @@ static void r100_cp_load_microcode(struct radeon_device *rdev)
+@@ -1037,6 +1087,7 @@ static void r100_cp_load_microcode(struct radeon_device *rdev)
int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
{
@@ -78137,7 +78120,7 @@
unsigned rb_bufsz;
unsigned rb_blksz;
unsigned max_fetch;
-@@ -1058,7 +1109,9 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
+@@ -1062,7 +1113,9 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
rb_bufsz = drm_order(ring_size / 8);
ring_size = (1 << (rb_bufsz + 1)) * 4;
r100_cp_load_microcode(rdev);
@@ -78148,7 +78131,7 @@
if (r) {
return r;
}
-@@ -1067,7 +1120,7 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
+@@ -1071,7 +1124,7 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
rb_blksz = 9;
/* cp will read 128bytes at a time (4 dwords) */
max_fetch = 1;
@@ -78157,7 +78140,7 @@
/* Write to CP_RB_WPTR will be delayed for pre_write_timer clocks */
pre_write_timer = 64;
/* Force CP_RB_WPTR write if written more than one time before the
-@@ -1097,13 +1150,13 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
+@@ -1101,13 +1154,13 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
WREG32(RADEON_CP_RB_CNTL, tmp | RADEON_RB_NO_UPDATE);
/* Set ring address */
@@ -78175,7 +78158,7 @@
/* set the wb address whether it's enabled or not */
WREG32(R_00070C_CP_RB_RPTR_ADDR,
-@@ -1119,7 +1172,7 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
+@@ -1123,7 +1176,7 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
WREG32(RADEON_CP_RB_CNTL, tmp);
udelay(10);
@@ -78184,7 +78167,7 @@
/* Set cp mode to bus mastering & enable cp*/
WREG32(RADEON_CP_CSQ_MODE,
REG_SET(RADEON_INDIRECT2_START, indirect2_start) |
-@@ -1127,13 +1180,13 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
+@@ -1131,13 +1184,13 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
WREG32(RADEON_CP_RB_WPTR_DELAY, 0);
WREG32(RADEON_CP_CSQ_MODE, 0x00004D4D);
WREG32(RADEON_CP_CSQ_CNTL, RADEON_CSQ_PRIBM_INDBM);
@@ -78201,7 +78184,7 @@
radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
return 0;
}
-@@ -1145,7 +1198,7 @@ void r100_cp_fini(struct radeon_device *rdev)
+@@ -1149,7 +1202,7 @@ void r100_cp_fini(struct radeon_device *rdev)
}
/* Disable ring */
r100_cp_disable(rdev);
@@ -78210,7 +78193,7 @@
DRM_INFO("radeon: cp finalized\n");
}
-@@ -1153,7 +1206,7 @@ void r100_cp_disable(struct radeon_device *rdev)
+@@ -1157,7 +1210,7 @@ void r100_cp_disable(struct radeon_device *rdev)
{
/* Disable ring */
radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
@@ -78219,7 +78202,7 @@
WREG32(RADEON_CP_CSQ_MODE, 0);
WREG32(RADEON_CP_CSQ_CNTL, 0);
WREG32(R_000770_SCRATCH_UMSK, 0);
-@@ -1163,13 +1216,6 @@ void r100_cp_disable(struct radeon_device *rdev)
+@@ -1167,13 +1220,6 @@ void r100_cp_disable(struct radeon_device *rdev)
}
}
@@ -78233,7 +78216,7 @@
/*
* CS functions
*/
-@@ -1543,7 +1589,17 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
+@@ -1547,7 +1593,17 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
r100_cs_dump_packet(p, pkt);
return r;
}
@@ -78252,7 +78235,7 @@
track->textures[i].robj = reloc->robj;
track->tex_dirty = true;
break;
-@@ -1614,15 +1670,17 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
+@@ -1618,15 +1674,17 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
r100_cs_dump_packet(p, pkt);
return r;
}
@@ -78279,7 +78262,7 @@
track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK;
track->cb_dirty = true;
-@@ -2097,9 +2155,9 @@ int r100_mc_wait_for_idle(struct radeon_device *rdev)
+@@ -2101,9 +2159,9 @@ int r100_mc_wait_for_idle(struct radeon_device *rdev)
return -1;
}
@@ -78291,7 +78274,7 @@
lockup->last_jiffies = jiffies;
}
-@@ -2124,20 +2182,20 @@ void r100_gpu_lockup_update(struct r100_gpu_lockup *lockup, struct radeon_cp *cp
+@@ -2128,20 +2186,20 @@ void r100_gpu_lockup_update(struct r100_gpu_lockup *lockup, struct radeon_cp *cp
* false positive when CP is just gived nothing to do.
*
**/
@@ -78316,7 +78299,7 @@
lockup->last_jiffies = jiffies;
return false;
}
-@@ -2150,32 +2208,31 @@ bool r100_gpu_cp_is_lockup(struct radeon_device *rdev, struct r100_gpu_lockup *l
+@@ -2154,32 +2212,31 @@ bool r100_gpu_cp_is_lockup(struct radeon_device *rdev, struct r100_gpu_lockup *l
return false;
}
@@ -78357,7 +78340,7 @@
/* disable bus mastering */
tmp = RREG32(R_000030_BUS_CNTL);
-@@ -2186,8 +2243,7 @@ void r100_bm_disable(struct radeon_device *rdev)
+@@ -2190,8 +2247,7 @@ void r100_bm_disable(struct radeon_device *rdev)
WREG32(R_000030_BUS_CNTL, (tmp & 0xFFFFFFFF) | 0x00000040);
tmp = RREG32(RADEON_BUS_CNTL);
mdelay(1);
@@ -78367,7 +78350,7 @@
mdelay(1);
}
-@@ -2497,7 +2553,7 @@ static void r100_pll_errata_after_data(struct radeon_device *rdev)
+@@ -2501,7 +2557,7 @@ static void r100_pll_errata_after_data(struct radeon_device *rdev)
* or the chip could hang on a subsequent access
*/
if (rdev->pll_errata & CHIP_ERRATA_PLL_DELAY) {
@@ -78376,7 +78359,7 @@
}
/* This function is required to workaround a hardware bug in some (all?)
-@@ -2578,21 +2634,22 @@ static int r100_debugfs_cp_ring_info(struct seq_file *m, void *data)
+@@ -2582,21 +2638,22 @@ static int r100_debugfs_cp_ring_info(struct seq_file *m, void *data)
struct drm_info_node *node = (struct drm_info_node *) m->private;
struct drm_device *dev = node->minor->dev;
struct radeon_device *rdev = dev->dev_private;
@@ -78404,7 +78387,7 @@
}
return 0;
}
-@@ -3634,7 +3691,7 @@ void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track
+@@ -3638,7 +3695,7 @@ void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track
}
}
@@ -78413,7 +78396,7 @@
{
uint32_t scratch;
uint32_t tmp = 0;
-@@ -3647,15 +3704,15 @@ int r100_ring_test(struct radeon_device *rdev)
+@@ -3651,15 +3708,15 @@ int r100_ring_test(struct radeon_device *rdev)
return r;
}
WREG32(scratch, 0xCAFEDEAD);
@@ -78433,7 +78416,7 @@
for (i = 0; i < rdev->usec_timeout; i++) {
tmp = RREG32(scratch);
if (tmp == 0xDEADBEEF) {
-@@ -3676,12 +3733,14 @@ int r100_ring_test(struct radeon_device *rdev)
+@@ -3680,12 +3737,14 @@ int r100_ring_test(struct radeon_device *rdev)
void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
{
@@ -78452,7 +78435,7 @@
{
struct radeon_ib *ib;
uint32_t scratch;
-@@ -3695,7 +3754,7 @@ int r100_ib_test(struct radeon_device *rdev)
+@@ -3699,7 +3758,7 @@ int r100_ib_test(struct radeon_device *rdev)
return r;
}
WREG32(scratch, 0xCAFEDEAD);
@@ -78461,7 +78444,7 @@
if (r) {
return r;
}
-@@ -3739,34 +3798,16 @@ int r100_ib_test(struct radeon_device *rdev)
+@@ -3743,34 +3802,16 @@ int r100_ib_test(struct radeon_device *rdev)
void r100_ib_fini(struct radeon_device *rdev)
{
@@ -78498,7 +78481,7 @@
WREG32(R_000740_CP_CSQ_CNTL, 0);
/* Save few CRTC registers */
-@@ -3904,6 +3945,12 @@ static int r100_startup(struct radeon_device *rdev)
+@@ -3908,6 +3949,12 @@ static int r100_startup(struct radeon_device *rdev)
if (r)
return r;
@@ -78511,7 +78494,7 @@
/* Enable IRQ */
if (!rdev->irq.installed) {
r = radeon_irq_kms_init(rdev);
-@@ -3919,16 +3966,25 @@ static int r100_startup(struct radeon_device *rdev)
+@@ -3923,16 +3970,25 @@ static int r100_startup(struct radeon_device *rdev)
dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
return r;
}
@@ -78539,7 +78522,7 @@
/* Make sur GART are not working */
if (rdev->flags & RADEON_IS_PCI)
r100_pci_gart_disable(rdev);
-@@ -3946,11 +4002,18 @@ int r100_resume(struct radeon_device *rdev)
+@@ -3950,11 +4006,18 @@ int r100_resume(struct radeon_device *rdev)
r100_clock_startup(rdev);
/* Initialize surface registers */
radeon_surface_init(rdev);
@@ -78559,7 +78542,7 @@
r100_cp_disable(rdev);
radeon_wb_disable(rdev);
r100_irq_disable(rdev);
-@@ -4066,7 +4129,14 @@ int r100_init(struct radeon_device *rdev)
+@@ -4070,7 +4133,14 @@ int r100_init(struct radeon_device *rdev)
return r;
}
r100_set_safe_registers(rdev);
@@ -79228,7 +79211,7 @@
if (r) {
/* Somethings want wront with the accel init stop accel */
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
-index ab46a99..1555cd6 100644
+index e5299a0..9c7062d 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -49,6 +49,7 @@
@@ -79870,7 +79853,7 @@
DRM_DEBUG("r600_irq_set: sw int\n");
cp_int_cntl |= RB_INT_ENABLE;
cp_int_cntl |= TIME_STAMP_INT_ENABLE;
-@@ -3280,7 +3308,6 @@ static u32 r600_get_ih_wptr(struct radeon_device *rdev)
+@@ -3283,7 +3311,6 @@ static u32 r600_get_ih_wptr(struct radeon_device *rdev)
tmp = RREG32(IH_RB_CNTL);
tmp |= IH_WPTR_OVERFLOW_CLEAR;
WREG32(IH_RB_CNTL, tmp);
@@ -79878,7 +79861,7 @@
}
return (wptr & rdev->ih.ptr_mask);
}
-@@ -3466,11 +3493,11 @@ restart_ih:
+@@ -3469,11 +3496,11 @@ restart_ih:
case 177: /* CP_INT in IB1 */
case 178: /* CP_INT in IB2 */
DRM_DEBUG("IH: CP int: 0x%08x\n", src_data);
@@ -79892,7 +79875,7 @@
break;
case 233: /* GUI IDLE */
DRM_DEBUG("IH: GUI idle\n");
-@@ -3503,30 +3530,6 @@ restart_ih:
+@@ -3506,30 +3533,6 @@ restart_ih:
*/
#if defined(CONFIG_DEBUG_FS)
@@ -79923,7 +79906,7 @@
static int r600_debugfs_mc_info(struct seq_file *m, void *data)
{
struct drm_info_node *node = (struct drm_info_node *) m->private;
-@@ -3540,7 +3543,6 @@ static int r600_debugfs_mc_info(struct seq_file *m, void *data)
+@@ -3543,7 +3546,6 @@ static int r600_debugfs_mc_info(struct seq_file *m, void *data)
static struct drm_info_list r600_mc_info_list[] = {
{"r600_mc_info", r600_debugfs_mc_info, 0, NULL},
@@ -85770,10 +85753,10 @@
RADEON_GEM_DOMAIN_VRAM,
RADEON_GEM_DOMAIN_VRAM);
diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c
-index ccf324b..d306cc8 100644
+index 6e98703..ef56e4e 100644
--- a/drivers/gpu/drm/radeon/radeon_bios.c
+++ b/drivers/gpu/drm/radeon/radeon_bios.c
-@@ -173,20 +173,6 @@ static bool radeon_atrm_get_bios(struct radeon_device *rdev)
+@@ -177,20 +177,6 @@ static bool radeon_atrm_get_bios(struct radeon_device *rdev)
}
}
@@ -86113,7 +86096,7 @@
dev_priv->flags |= RADEON_IS_AGP;
else if (pci_is_pcie(dev->pdev))
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
-index 1f32557..cf723c4 100644
+index 0ddc08c..f3ee360 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -58,7 +58,7 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
@@ -86214,9 +86197,9 @@
+ u32 ring = RADEON_CS_RING_GFX;
+ s32 priority = 0;
- if (!cs->num_chunks) {
- return 0;
-@@ -103,6 +175,8 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
+ INIT_LIST_HEAD(&p->validated);
+
+@@ -105,6 +177,8 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
p->idx = 0;
p->chunk_ib_idx = -1;
p->chunk_relocs_idx = -1;
@@ -86225,7 +86208,7 @@
p->chunks_array = kcalloc(cs->num_chunks, sizeof(uint64_t), GFP_KERNEL);
if (p->chunks_array == NULL) {
return -ENOMEM;
-@@ -112,6 +186,7 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
+@@ -114,6 +188,7 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
sizeof(uint64_t)*cs->num_chunks)) {
return -EFAULT;
}
@@ -86233,7 +86216,7 @@
p->nchunks = cs->num_chunks;
p->chunks = kcalloc(p->nchunks, sizeof(struct radeon_cs_chunk), GFP_KERNEL);
if (p->chunks == NULL) {
-@@ -140,16 +215,25 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
+@@ -142,16 +217,25 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
if (p->chunks[i].length_dw == 0)
return -EINVAL;
}
@@ -86263,7 +86246,7 @@
size = p->chunks[i].length_dw * sizeof(uint32_t);
p->chunks[i].kdata = kmalloc(size, GFP_KERNEL);
if (p->chunks[i].kdata == NULL) {
-@@ -160,31 +244,55 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
+@@ -162,31 +246,55 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
return -EFAULT;
}
if (p->chunks[i].chunk_id == RADEON_CHUNK_ID_FLAGS) {
@@ -86339,7 +86322,7 @@
return 0;
}
-@@ -226,14 +334,186 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error)
+@@ -228,14 +336,186 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error)
radeon_ib_free(parser->rdev, &parser->ib);
}
@@ -86527,7 +86510,7 @@
/* initialize parser */
memset(&parser, 0, sizeof(struct radeon_cs_parser));
parser.filp = filp;
-@@ -247,13 +527,6 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
+@@ -249,13 +529,6 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
radeon_mutex_unlock(&rdev->cs_mutex);
return r;
}
@@ -86541,7 +86524,7 @@
r = radeon_cs_parser_relocs(&parser);
if (r) {
if (r != -ERESTARTSYS)
-@@ -262,29 +535,15 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
+@@ -264,29 +537,15 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
radeon_mutex_unlock(&rdev->cs_mutex);
return r;
}
@@ -88828,7 +88811,7 @@
}
spin_unlock_irqrestore(&rdev->irq.sw_lock, irqflags);
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
-index 4bb9e27..9b46238 100644
+index 4bb9e27..b731686 100644
--- a/drivers/gpu/drm/radeon/radeon_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_kms.c
@@ -61,6 +61,8 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
@@ -88973,7 +88956,16 @@
}
void radeon_driver_preclose_kms(struct drm_device *dev,
-@@ -455,5 +525,6 @@ struct drm_ioctl_desc radeon_ioctls_kms[] = {
+@@ -358,6 +428,8 @@ int radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc,
+
+ /* Get associated drm_crtc: */
+ drmcrtc = &rdev->mode_info.crtcs[crtc]->base;
++ if (!drmcrtc)
++ return -EINVAL;
+
+ /* Helper routine in DRM core does all the work: */
+ return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error,
+@@ -455,5 +527,6 @@ struct drm_ioctl_desc radeon_ioctls_kms[] = {
DRM_IOCTL_DEF_DRV(RADEON_GEM_SET_TILING, radeon_gem_set_tiling_ioctl, DRM_AUTH|DRM_UNLOCKED),
DRM_IOCTL_DEF_DRV(RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH|DRM_UNLOCKED),
DRM_IOCTL_DEF_DRV(RADEON_GEM_BUSY, radeon_gem_busy_ioctl, DRM_AUTH|DRM_UNLOCKED),
@@ -90915,7 +90907,7 @@
+ }
+}
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
-index 0b5468b..49b55ed 100644
+index 0b5468b..15042d0 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -114,24 +114,6 @@ static void radeon_ttm_global_fini(struct radeon_device *rdev)
@@ -90948,7 +90940,7 @@
switch (bo->mem.mem_type) {
case TTM_PL_VRAM:
- if (rbo->rdev->cp.ready == false)
-+ if (rbo->rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready == false)
++ if (rbo->rdev->ring[radeon_copy_ring_index(rbo->rdev)].ready == false)
radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_CPU);
else
radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT);
@@ -91629,7 +91621,7 @@
if (r) {
/* Somethings want wront with the accel init stop accel */
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
-index dc00155..739eb0d 100644
+index fc37558..07b6dbf 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -46,6 +46,25 @@
@@ -91719,7 +91711,7 @@
tmp |= S_000040_SW_INT_EN(1);
}
if (rdev->irq.gui_idle) {
-@@ -645,7 +654,7 @@ int rs600_irq_process(struct radeon_device *rdev)
+@@ -649,7 +658,7 @@ int rs600_irq_process(struct radeon_device *rdev)
while (status || rdev->irq.stat_regs.r500.disp_int) {
/* SW interrupt */
if (G_000044_SW_INT(status)) {
@@ -91728,7 +91720,7 @@
}
/* GUI idle */
if (G_000040_GUI_IDLE(status)) {
-@@ -850,6 +859,12 @@ static int rs600_startup(struct radeon_device *rdev)
+@@ -854,6 +863,12 @@ static int rs600_startup(struct radeon_device *rdev)
if (r)
return r;
@@ -91741,7 +91733,7 @@
/* Enable IRQ */
if (!rdev->irq.installed) {
r = radeon_irq_kms_init(rdev);
-@@ -865,15 +880,21 @@ static int rs600_startup(struct radeon_device *rdev)
+@@ -869,15 +884,21 @@ static int rs600_startup(struct radeon_device *rdev)
dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
return r;
}
@@ -91767,7 +91759,7 @@
return r;
}
-@@ -882,6 +903,8 @@ static int rs600_startup(struct radeon_device *rdev)
+@@ -886,6 +907,8 @@ static int rs600_startup(struct radeon_device *rdev)
int rs600_resume(struct radeon_device *rdev)
{
@@ -91776,7 +91768,7 @@
/* Make sur GART are not working */
rs600_gart_disable(rdev);
/* Resume clock before doing reset */
-@@ -898,11 +921,18 @@ int rs600_resume(struct radeon_device *rdev)
+@@ -902,11 +925,18 @@ int rs600_resume(struct radeon_device *rdev)
rv515_clock_startup(rdev);
/* Initialize surface registers */
radeon_surface_init(rdev);
@@ -91796,7 +91788,7 @@
r600_audio_fini(rdev);
r100_cp_disable(rdev);
radeon_wb_disable(rdev);
-@@ -980,7 +1010,14 @@ int rs600_init(struct radeon_device *rdev)
+@@ -984,7 +1014,14 @@ int rs600_init(struct radeon_device *rdev)
if (r)
return r;
rs600_set_safe_registers(rdev);
@@ -92319,10 +92311,10 @@
radeon_bo_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
new file mode 100644
-index 0000000..e710073
+index 0000000..068b21f
--- /dev/null
+++ b/drivers/gpu/drm/radeon/si.c
-@@ -0,0 +1,4154 @@
+@@ -0,0 +1,4157 @@
+/*
+ * Copyright 2011 Advanced Micro Devices, Inc.
+ *
@@ -96451,6 +96443,9 @@
+ return -EINVAL;
+ }
+
++ /* posting read */
++ RREG32(SRBM_STATUS);
++
+ return 0;
+}
+
@@ -104087,7 +104082,7 @@
.init_mem_type = vmw_init_mem_type,
.evict_flags = vmw_evict_flags,
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
-index b639536..db50604 100644
+index f739fcf..e43341a 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -38,6 +38,10 @@
@@ -104171,7 +104166,51 @@
if (dev_priv->capabilities & SVGA_CAP_GMR) {
dev_priv->max_gmr_descriptors =
vmw_read(dev_priv,
-@@ -689,6 +733,15 @@ static int vmw_driver_unload(struct drm_device *dev)
+@@ -555,6 +599,10 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
+ if (unlikely(dev_priv->fman == NULL))
+ goto out_no_fman;
+
++ /* Need to start the fifo to check if we can do screen objects */
++ ret = vmw_3d_resource_inc(dev_priv, true);
++ if (unlikely(ret != 0))
++ goto out_no_fifo;
+
+ ret = ttm_bo_init_mm(&dev_priv->bdev, TTM_PL_VRAM,
+ (dev_priv->vram_size >> PAGE_SHIFT));
+@@ -571,10 +619,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
+ dev_priv->has_gmr = false;
+ }
+
+- /* Need to start the fifo to check if we can do screen objects */
+- ret = vmw_3d_resource_inc(dev_priv, true);
+- if (unlikely(ret != 0))
+- goto out_no_fifo;
+ vmw_kms_save_vga(dev_priv);
+
+ /* Start kms and overlay systems, needs fifo. */
+@@ -620,11 +664,11 @@ out_no_kms:
+ vmw_kms_restore_vga(dev_priv);
+ vmw_3d_resource_dec(dev_priv, false);
+ }
+-out_no_fifo:
++out_no_vram:
+ if (dev_priv->has_gmr)
+ (void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_GMR);
+ (void)ttm_bo_clean_mm(&dev_priv->bdev, TTM_PL_VRAM);
+-out_no_vram:
++out_no_fifo:
+ vmw_fence_manager_takedown(dev_priv->fman);
+ out_no_fman:
+ if (dev_priv->stealth)
+@@ -638,6 +682,7 @@ out_err4:
+ out_err3:
+ drm_mtrr_del(dev_priv->mmio_mtrr, dev_priv->mmio_start,
+ dev_priv->mmio_size, DRM_MTRR_WC);
++out_err2:
+ (void)ttm_bo_device_release(&dev_priv->bdev);
+ out_err1:
+ vmw_ttm_global_release(dev_priv);
+@@ -692,6 +737,15 @@ static int vmw_driver_unload(struct drm_device *dev)
return 0;
}
@@ -104187,7 +104226,7 @@
static void vmw_postclose(struct drm_device *dev,
struct drm_file *file_priv)
{
-@@ -711,6 +764,7 @@ static int vmw_driver_open(struct drm_device *dev, struct drm_file *file_priv)
+@@ -714,6 +768,7 @@ static int vmw_driver_open(struct drm_device *dev, struct drm_file *file_priv)
if (unlikely(vmw_fp == NULL))
return ret;
@@ -104195,7 +104234,7 @@
vmw_fp->tfile = ttm_object_file_init(dev_priv->tdev, 10);
if (unlikely(vmw_fp->tfile == NULL))
goto out_no_tfile;
-@@ -1070,6 +1124,21 @@ static const struct dev_pm_ops vmw_pm_ops = {
+@@ -1073,6 +1128,21 @@ static const struct dev_pm_ops vmw_pm_ops = {
.resume = vmw_pm_resume,
};
@@ -104217,7 +104256,7 @@
static struct drm_driver driver = {
.driver_features = DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED |
DRIVER_MODESET,
-@@ -1093,26 +1162,14 @@ static struct drm_driver driver = {
+@@ -1096,26 +1166,14 @@ static struct drm_driver driver = {
.master_set = vmw_master_set,
.master_drop = vmw_master_drop,
.open = vmw_driver_open,
@@ -104417,7 +104456,7 @@
info->apertures = alloc_apertures(1);
if (!info->apertures) {
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c
-index 1ed5a1c..7e07433 100644
+index 1ed5a1c..992b46b 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c
@@ -69,12 +69,13 @@ struct vmw_user_fence {
@@ -104437,54 +104476,7 @@
uint32_t *tv_sec;
uint32_t *tv_usec;
};
-@@ -484,7 +485,14 @@ void vmw_fence_obj_flush(struct vmw_fence_obj *fence)
-
- static void vmw_fence_destroy(struct vmw_fence_obj *fence)
- {
-+ struct vmw_fence_manager *fman = fence->fman;
-+
- kfree(fence);
-+ /*
-+ * Free kernel space accounting.
-+ */
-+ ttm_mem_global_free(vmw_mem_glob(fman->dev_priv),
-+ fman->fence_size);
- }
-
- int vmw_fence_create(struct vmw_fence_manager *fman,
-@@ -492,12 +500,20 @@ int vmw_fence_create(struct vmw_fence_manager *fman,
- uint32_t mask,
- struct vmw_fence_obj **p_fence)
- {
-+ struct ttm_mem_global *mem_glob = vmw_mem_glob(fman->dev_priv);
- struct vmw_fence_obj *fence;
- int ret;
-
-+ ret = ttm_mem_global_alloc(mem_glob, fman->fence_size,
-+ false, false);
-+ if (unlikely(ret != 0))
-+ return ret;
-+
- fence = kzalloc(sizeof(*fence), GFP_KERNEL);
-- if (unlikely(fence == NULL))
-- return -ENOMEM;
-+ if (unlikely(fence == NULL)) {
-+ ret = -ENOMEM;
-+ goto out_no_object;
-+ }
-
- ret = vmw_fence_obj_init(fman, fence, seqno, mask,
- vmw_fence_destroy);
-@@ -509,6 +525,8 @@ int vmw_fence_create(struct vmw_fence_manager *fman,
-
- out_err_init:
- kfree(fence);
-+out_no_object:
-+ ttm_mem_global_free(mem_glob, fman->fence_size);
- return ret;
- }
-
-@@ -767,46 +785,40 @@ int vmw_fence_obj_unref_ioctl(struct drm_device *dev, void *data,
+@@ -767,46 +768,40 @@ int vmw_fence_obj_unref_ioctl(struct drm_device *dev, void *data,
}
/**
@@ -104560,7 +104552,7 @@
}
-@@ -819,18 +831,21 @@ static void vmw_event_fence_action_delivered(struct drm_pending_event *e)
+@@ -819,18 +814,21 @@ static void vmw_event_fence_action_delivered(struct drm_pending_event *e)
* This function is called when the seqno of the fence where @action is
* attached has passed. It queues the event on the submitter's event list.
* This function is always called from atomic context, and may be called
@@ -104586,7 +104578,7 @@
spin_lock_irqsave(&dev->event_lock, irq_flags);
if (likely(eaction->tv_sec != NULL)) {
-@@ -841,7 +856,9 @@ static void vmw_event_fence_action_seq_passed(struct vmw_fence_action *action)
+@@ -841,7 +839,9 @@ static void vmw_event_fence_action_seq_passed(struct vmw_fence_action *action)
*eaction->tv_usec = tv.tv_usec;
}
@@ -104597,7 +104589,7 @@
wake_up_all(&file_priv->event_wait);
spin_unlock_irqrestore(&dev->event_lock, irq_flags);
}
-@@ -859,9 +876,15 @@ static void vmw_event_fence_action_cleanup(struct vmw_fence_action *action)
+@@ -859,9 +859,15 @@ static void vmw_event_fence_action_cleanup(struct vmw_fence_action *action)
{
struct vmw_event_fence_action *eaction =
container_of(action, struct vmw_event_fence_action, action);
@@ -104614,7 +104606,7 @@
}
-@@ -929,39 +952,23 @@ void vmw_fence_obj_add_action(struct vmw_fence_obj *fence,
+@@ -929,39 +935,23 @@ void vmw_fence_obj_add_action(struct vmw_fence_obj *fence,
* an error code, the caller needs to free that object.
*/
@@ -104664,7 +104656,7 @@
eaction->action.seq_passed = vmw_event_fence_action_seq_passed;
eaction->action.cleanup = vmw_event_fence_action_cleanup;
-@@ -969,16 +976,89 @@ int vmw_event_fence_action_create(struct drm_file *file_priv,
+@@ -969,16 +959,91 @@ int vmw_event_fence_action_create(struct drm_file *file_priv,
eaction->fence = vmw_fence_obj_reference(fence);
eaction->dev = fman->dev_priv->dev;
@@ -104743,6 +104735,8 @@
+ if (ret != 0)
+ goto out_no_queue;
+
++ return 0;
++
+out_no_queue:
+ event->base.destroy(&event->base);
+out_no_event:
@@ -104756,7 +104750,7 @@
int vmw_fence_event_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{
-@@ -991,8 +1071,6 @@ int vmw_fence_event_ioctl(struct drm_device *dev, void *data,
+@@ -991,8 +1056,6 @@ int vmw_fence_event_ioctl(struct drm_device *dev, void *data,
(struct drm_vmw_fence_rep __user *)(unsigned long)
arg->fence_rep;
uint32_t handle;
@@ -104765,7 +104759,7 @@
int ret;
/*
-@@ -1045,59 +1123,28 @@ int vmw_fence_event_ioctl(struct drm_device *dev, void *data,
+@@ -1045,59 +1108,21 @@ int vmw_fence_event_ioctl(struct drm_device *dev, void *data,
BUG_ON(fence == NULL);
@@ -104792,23 +104786,23 @@
- event->base.length = sizeof(*event);
- event->user_data = arg->user_data;
-
- if (arg->flags & DRM_VMW_FE_FLAG_REQ_TIME)
- ret = vmw_event_fence_action_create(file_priv, fence,
+- if (arg->flags & DRM_VMW_FE_FLAG_REQ_TIME)
+- ret = vmw_event_fence_action_create(file_priv, fence,
- &event->base,
- &event->tv_sec,
- &event->tv_usec,
-+ arg->flags,
-+ arg->user_data,
- true);
- else
- ret = vmw_event_fence_action_create(file_priv, fence,
+- true);
+- else
+- ret = vmw_event_fence_action_create(file_priv, fence,
- &event->base,
- NULL,
- NULL,
-+ arg->flags,
-+ arg->user_data,
- true);
-
+- true);
+-
++ ret = vmw_event_fence_action_create(file_priv, fence,
++ arg->flags,
++ arg->user_data,
++ true);
if (unlikely(ret != 0)) {
if (ret != -ERESTARTSYS)
DRM_ERROR("Failed to attach event to fence.\n");
Modified: dists/wheezy/linux/debian/patches/features/all/line6/0010-staging-line6-Remove-obsolete-code.patch
==============================================================================
--- dists/wheezy/linux/debian/patches/features/all/line6/0010-staging-line6-Remove-obsolete-code.patch Fri Aug 7 18:47:01 2015 (r22933)
+++ dists/wheezy/linux/debian/patches/features/all/line6/0010-staging-line6-Remove-obsolete-code.patch Sat Aug 8 17:48:04 2015 (r22934)
@@ -15,11 +15,9 @@
drivers/staging/line6/playback.c | 8 --------
4 files changed, 32 deletions(-)
-diff --git a/drivers/staging/line6/capture.c b/drivers/staging/line6/capture.c
-index d9da7ed..ba441ed 100644
--- a/drivers/staging/line6/capture.c
+++ b/drivers/staging/line6/capture.c
-@@ -244,11 +244,7 @@ static void audio_in_callback(struct urb *urb)
+@@ -244,11 +244,7 @@ static void audio_in_callback(struct urb
length += fsize;
/* the following assumes LINE6_ISO_PACKETS == 1: */
@@ -31,13 +29,11 @@
line6pcm->prev_fsize = fsize;
#ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
-diff --git a/drivers/staging/line6/pcm.c b/drivers/staging/line6/pcm.c
-index 2e4e164..a70c087 100644
--- a/drivers/staging/line6/pcm.c
+++ b/drivers/staging/line6/pcm.c
-@@ -93,21 +93,7 @@ int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels)
- unsigned long flags_new = flags_old | channels;
- int err = 0;
+@@ -96,21 +96,7 @@ int line6_pcm_start(struct snd_line6_pcm
+ flags_new = flags_old | channels;
+ } while (cmpxchg(&line6pcm->flags, flags_old, flags_new) != flags_old);
-#if LINE6_BACKUP_MONITOR_SIGNAL
- if (!(line6pcm->line6->properties->capabilities & LINE6_BIT_HWMON)) {
@@ -57,7 +53,7 @@
if (((flags_old & MASK_CAPTURE) == 0) &&
((flags_new & MASK_CAPTURE) != 0)) {
-@@ -164,9 +150,6 @@ int line6_pcm_stop(struct snd_line6_pcm *line6pcm, int channels)
+@@ -174,9 +160,6 @@ int line6_pcm_stop(struct snd_line6_pcm
((flags_new & MASK_PLAYBACK) == 0)) {
line6_unlink_audio_out_urbs(line6pcm);
}
@@ -67,8 +63,6 @@
return 0;
}
-diff --git a/drivers/staging/line6/pcm.h b/drivers/staging/line6/pcm.h
-index 77055b3..05f4ef3 100644
--- a/drivers/staging/line6/pcm.h
+++ b/drivers/staging/line6/pcm.h
@@ -39,9 +39,6 @@
@@ -81,11 +75,9 @@
/*
Get substream from Line6 PCM data structure
*/
-diff --git a/drivers/staging/line6/playback.c b/drivers/staging/line6/playback.c
-index b344527..e495b32 100644
--- a/drivers/staging/line6/playback.c
+++ b/drivers/staging/line6/playback.c
-@@ -223,18 +223,10 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
+@@ -223,18 +223,10 @@ static int submit_audio_out_urb(struct s
} else
dev_err(line6pcm->line6->ifcdev, "driver bug: len = %d\n", len); /* this is somewhat paranoid */
} else {
Modified: dists/wheezy/linux/debian/patches/features/all/line6/0017-staging-line6-fixed-ALSA-PCM-interaction.patch
==============================================================================
--- dists/wheezy/linux/debian/patches/features/all/line6/0017-staging-line6-fixed-ALSA-PCM-interaction.patch Fri Aug 7 18:47:01 2015 (r22933)
+++ dists/wheezy/linux/debian/patches/features/all/line6/0017-staging-line6-fixed-ALSA-PCM-interaction.patch Sat Aug 8 17:48:04 2015 (r22934)
@@ -13,20 +13,12 @@
Signed-off-by: Markus Grabner <grabner at icg.tugraz.at>
Signed-off-by: Greg Kroah-Hartman <gregkh at suse.de>
+[bwh: Adjust to apply after backported commit 9f613601482c
+ 'staging: line6: avoid __sync_fetch_and_{and,or}']
---
- drivers/staging/line6/capture.c | 46 ++++++++++++++++++++-------
- drivers/staging/line6/capture.h | 2 ++
- drivers/staging/line6/pcm.c | 65 ++++++++++++++++++++++++++------------
- drivers/staging/line6/playback.c | 46 ++++++++++++++++++++-------
- drivers/staging/line6/playback.h | 2 ++
- drivers/staging/line6/revision.h | 2 +-
- 6 files changed, 118 insertions(+), 45 deletions(-)
-
-diff --git a/drivers/staging/line6/capture.c b/drivers/staging/line6/capture.c
-index 8f59ff3..127f952 100644
--- a/drivers/staging/line6/capture.c
+++ b/drivers/staging/line6/capture.c
-@@ -193,6 +193,31 @@ void line6_capture_check_period(struct snd_line6_pcm *line6pcm, int length)
+@@ -193,6 +193,31 @@ void line6_capture_check_period(struct s
}
}
@@ -58,7 +50,7 @@
/*
* Callback for completed capture URB.
*/
-@@ -316,16 +341,11 @@ static int snd_line6_capture_hw_params(struct snd_pcm_substream *substream,
+@@ -316,16 +341,11 @@ static int snd_line6_capture_hw_params(s
}
/* -- [FD] end */
@@ -79,7 +71,7 @@
}
ret = snd_pcm_lib_malloc_pages(substream,
-@@ -342,9 +362,11 @@ static int snd_line6_capture_hw_free(struct snd_pcm_substream *substream)
+@@ -342,9 +362,11 @@ static int snd_line6_capture_hw_free(str
{
struct snd_line6_pcm *line6pcm = snd_pcm_substream_chip(substream);
@@ -94,8 +86,6 @@
return snd_pcm_lib_free_pages(substream);
}
-diff --git a/drivers/staging/line6/capture.h b/drivers/staging/line6/capture.h
-index a7509fb..366cbaa 100644
--- a/drivers/staging/line6/capture.h
+++ b/drivers/staging/line6/capture.h
@@ -19,11 +19,13 @@
@@ -112,11 +102,9 @@
extern int line6_submit_audio_in_all_urbs(struct snd_line6_pcm *line6pcm);
extern void line6_unlink_audio_in_urbs(struct snd_line6_pcm *line6pcm);
extern void line6_unlink_wait_clear_audio_in_urbs(struct snd_line6_pcm
-diff --git a/drivers/staging/line6/pcm.c b/drivers/staging/line6/pcm.c
-index 68727b2..37675e6 100644
--- a/drivers/staging/line6/pcm.c
+++ b/drivers/staging/line6/pcm.c
-@@ -86,17 +86,22 @@ static DEVICE_ATTR(impulse_period, S_IWUSR | S_IRUGO, pcm_get_impulse_period,
+@@ -86,6 +86,12 @@ static DEVICE_ATTR(impulse_period, S_IWU
#endif
@@ -128,10 +116,11 @@
+
int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels)
{
- unsigned long flags_old =
- __sync_fetch_and_or(&line6pcm->flags, channels);
- unsigned long flags_new = flags_old | channels;
- int err = 0;
+ unsigned long flags_old, flags_new;
+@@ -95,11 +101,10 @@ int line6_pcm_start(struct snd_line6_pcm
+ flags_old = ACCESS_ONCE(line6pcm->flags);
+ flags_new = flags_old | channels;
+ } while (cmpxchg(&line6pcm->flags, flags_old, flags_new) != flags_old);
-
+
line6pcm->prev_fbuf = NULL;
@@ -142,7 +131,7 @@
/*
Waiting for completion of active URBs in the stop handler is
a bug, we therefore report an error if capturing is restarted
-@@ -105,34 +110,47 @@ int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels)
+@@ -108,32 +113,45 @@ int line6_pcm_start(struct snd_line6_pcm
if (line6pcm->active_urb_in | line6pcm->unlink_urb_in)
return -EBUSY;
@@ -157,11 +146,8 @@
line6pcm->prev_fsize = 0;
err = line6_submit_audio_in_all_urbs(line6pcm);
-- if (err < 0) {
-- __sync_fetch_and_and(&line6pcm->flags, ~channels);
-- return err;
-- }
-+ if (err < 0)
+ if (err < 0)
+- goto fail;
+ goto pcm_start_error;
}
@@ -184,25 +170,21 @@
line6pcm->count_out = 0;
err = line6_submit_audio_out_all_urbs(line6pcm);
-- if (err < 0) {
-- __sync_fetch_and_and(&line6pcm->flags, ~channels);
-- return err;
-- }
-+ if (err < 0)
+ if (err < 0)
+- goto fail;
+ goto pcm_start_error;
}
return 0;
-+
-+pcm_start_error:
-+ __sync_fetch_and_and(&line6pcm->flags, ~channels);
-+ return err;
- }
- int line6_pcm_stop(struct snd_line6_pcm *line6pcm, int channels)
-@@ -141,14 +159,18 @@ int line6_pcm_stop(struct snd_line6_pcm *line6pcm, int channels)
- __sync_fetch_and_and(&line6pcm->flags, ~channels);
- unsigned long flags_new = flags_old & ~channels;
+-fail:
++pcm_start_error:
+ do {
+ flags_old = ACCESS_ONCE(line6pcm->flags);
+ flags_new = flags_old & ~channels;
+@@ -151,14 +169,18 @@ int line6_pcm_stop(struct snd_line6_pcm
+ flags_new = flags_old & ~channels;
+ } while (cmpxchg(&line6pcm->flags, flags_old, flags_new) != flags_old);
- if (((flags_old & MASK_CAPTURE) != 0) &&
- ((flags_new & MASK_CAPTURE) == 0)) {
@@ -223,7 +205,7 @@
}
return 0;
-@@ -476,18 +498,21 @@ int snd_line6_prepare(struct snd_pcm_substream *substream)
+@@ -489,18 +511,21 @@ int snd_line6_prepare(struct snd_pcm_sub
switch (substream->stream) {
case SNDRV_PCM_STREAM_PLAYBACK:
@@ -248,11 +230,9 @@
if (!test_and_set_bit(BIT_PREPARED, &line6pcm->flags)) {
line6pcm->count_out = 0;
line6pcm->pos_out = 0;
-diff --git a/drivers/staging/line6/playback.c b/drivers/staging/line6/playback.c
-index 9a51b92..4152db2 100644
--- a/drivers/staging/line6/playback.c
+++ b/drivers/staging/line6/playback.c
-@@ -351,6 +351,31 @@ void line6_unlink_wait_clear_audio_out_urbs(struct snd_line6_pcm *line6pcm)
+@@ -351,6 +351,31 @@ void line6_unlink_wait_clear_audio_out_u
wait_clear_audio_out_urbs(line6pcm);
}
@@ -284,7 +264,7 @@
/*
Callback for completed playback URB.
*/
-@@ -459,16 +484,11 @@ static int snd_line6_playback_hw_params(struct snd_pcm_substream *substream,
+@@ -459,16 +484,11 @@ static int snd_line6_playback_hw_params(
}
/* -- [FD] end */
@@ -305,7 +285,7 @@
}
ret = snd_pcm_lib_malloc_pages(substream,
-@@ -485,9 +505,11 @@ static int snd_line6_playback_hw_free(struct snd_pcm_substream *substream)
+@@ -485,9 +505,11 @@ static int snd_line6_playback_hw_free(st
{
struct snd_line6_pcm *line6pcm = snd_pcm_substream_chip(substream);
@@ -320,8 +300,6 @@
return snd_pcm_lib_free_pages(substream);
}
-diff --git a/drivers/staging/line6/playback.h b/drivers/staging/line6/playback.h
-index f2fc8c0..02487ff 100644
--- a/drivers/staging/line6/playback.h
+++ b/drivers/staging/line6/playback.h
@@ -29,7 +29,9 @@
@@ -334,8 +312,6 @@
extern int line6_submit_audio_out_all_urbs(struct snd_line6_pcm *line6pcm);
extern void line6_unlink_audio_out_urbs(struct snd_line6_pcm *line6pcm);
extern void line6_unlink_wait_clear_audio_out_urbs(struct snd_line6_pcm
-diff --git a/drivers/staging/line6/revision.h b/drivers/staging/line6/revision.h
-index 350d0df..b4eee2b 100644
--- a/drivers/staging/line6/revision.h
+++ b/drivers/staging/line6/revision.h
@@ -1,4 +1,4 @@
Modified: dists/wheezy/linux/debian/patches/features/all/line6/0020-staging-line6-separate-handling-of-buffer-allocation.patch
==============================================================================
--- dists/wheezy/linux/debian/patches/features/all/line6/0020-staging-line6-separate-handling-of-buffer-allocation.patch Fri Aug 7 18:47:01 2015 (r22933)
+++ dists/wheezy/linux/debian/patches/features/all/line6/0020-staging-line6-separate-handling-of-buffer-allocation.patch Sat Aug 8 17:48:04 2015 (r22934)
@@ -38,23 +38,12 @@
Signed-off-by: Markus Grabner <grabner at icg.tugraz.at>
Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
+[bwh: Adjust to apply after backported commit 9f613601482c
+ 'staging: line6: avoid __sync_fetch_and_{and,or}']
---
- drivers/staging/line6/capture.c | 54 ++++---------
- drivers/staging/line6/capture.h | 2 +-
- drivers/staging/line6/driver.c | 2 +-
- drivers/staging/line6/pcm.c | 109 +++++++++++++++++---------
- drivers/staging/line6/pcm.h | 158 ++++++++++++++++++++++++++++----------
- drivers/staging/line6/playback.c | 68 ++++++----------
- drivers/staging/line6/playback.h | 2 +-
- drivers/staging/line6/toneport.c | 8 +-
- drivers/staging/line6/usbdefs.h | 44 +++++------
- 9 files changed, 254 insertions(+), 193 deletions(-)
-
-diff --git a/drivers/staging/line6/capture.c b/drivers/staging/line6/capture.c
-index 127f952..c85c5b6 100644
--- a/drivers/staging/line6/capture.c
+++ b/drivers/staging/line6/capture.c
-@@ -107,7 +107,7 @@ void line6_unlink_audio_in_urbs(struct snd_line6_pcm *line6pcm)
+@@ -107,7 +107,7 @@ void line6_unlink_audio_in_urbs(struct s
Wait until unlinking of all currently active capture URBs has been
finished.
*/
@@ -63,7 +52,7 @@
{
int timeout = HZ;
unsigned int i;
-@@ -134,7 +134,7 @@ static void wait_clear_audio_in_urbs(struct snd_line6_pcm *line6pcm)
+@@ -134,7 +134,7 @@ static void wait_clear_audio_in_urbs(str
void line6_unlink_wait_clear_audio_in_urbs(struct snd_line6_pcm *line6pcm)
{
line6_unlink_audio_in_urbs(line6pcm);
@@ -72,7 +61,7 @@
}
/*
-@@ -193,25 +193,6 @@ void line6_capture_check_period(struct snd_line6_pcm *line6pcm, int length)
+@@ -193,25 +193,6 @@ void line6_capture_check_period(struct s
}
}
@@ -98,7 +87,7 @@
void line6_free_capture_buffer(struct snd_line6_pcm *line6pcm)
{
kfree(line6pcm->buffer_in);
-@@ -273,9 +254,9 @@ static void audio_in_callback(struct urb *urb)
+@@ -273,9 +254,9 @@ static void audio_in_callback(struct urb
line6pcm->prev_fsize = fsize;
#ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
@@ -110,7 +99,7 @@
&& (fsize > 0))
line6_capture_copy(line6pcm, fbuf, fsize);
}
-@@ -291,9 +272,9 @@ static void audio_in_callback(struct urb *urb)
+@@ -291,9 +272,9 @@ static void audio_in_callback(struct urb
submit_audio_in_urb(line6pcm);
#ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
@@ -122,7 +111,7 @@
line6_capture_check_period(line6pcm, length);
}
}
-@@ -341,17 +322,17 @@ static int snd_line6_capture_hw_params(struct snd_pcm_substream *substream,
+@@ -341,17 +322,17 @@ static int snd_line6_capture_hw_params(s
}
/* -- [FD] end */
@@ -146,7 +135,7 @@
line6pcm->period_in = params_period_bytes(hw_params);
return 0;
-@@ -361,12 +342,7 @@ static int snd_line6_capture_hw_params(struct snd_pcm_substream *substream,
+@@ -361,12 +342,7 @@ static int snd_line6_capture_hw_params(s
static int snd_line6_capture_hw_free(struct snd_pcm_substream *substream)
{
struct snd_line6_pcm *line6pcm = snd_pcm_substream_chip(substream);
@@ -160,7 +149,7 @@
return snd_pcm_lib_free_pages(substream);
}
-@@ -380,7 +356,7 @@ int snd_line6_capture_trigger(struct snd_line6_pcm *line6pcm, int cmd)
+@@ -380,7 +356,7 @@ int snd_line6_capture_trigger(struct snd
#ifdef CONFIG_PM
case SNDRV_PCM_TRIGGER_RESUME:
#endif
@@ -169,7 +158,7 @@
if (err < 0)
return err;
-@@ -391,7 +367,7 @@ int snd_line6_capture_trigger(struct snd_line6_pcm *line6pcm, int cmd)
+@@ -391,7 +367,7 @@ int snd_line6_capture_trigger(struct snd
#ifdef CONFIG_PM
case SNDRV_PCM_TRIGGER_SUSPEND:
#endif
@@ -178,8 +167,6 @@
if (err < 0)
return err;
-diff --git a/drivers/staging/line6/capture.h b/drivers/staging/line6/capture.h
-index 366cbaa..4157bcb 100644
--- a/drivers/staging/line6/capture.h
+++ b/drivers/staging/line6/capture.h
@@ -19,7 +19,6 @@
@@ -190,7 +177,7 @@
extern void line6_capture_copy(struct snd_line6_pcm *line6pcm, char *fbuf,
int fsize);
extern void line6_capture_check_period(struct snd_line6_pcm *line6pcm,
-@@ -30,6 +29,7 @@ extern int line6_submit_audio_in_all_urbs(struct snd_line6_pcm *line6pcm);
+@@ -30,6 +29,7 @@ extern int line6_submit_audio_in_all_urb
extern void line6_unlink_audio_in_urbs(struct snd_line6_pcm *line6pcm);
extern void line6_unlink_wait_clear_audio_in_urbs(struct snd_line6_pcm
*line6pcm);
@@ -198,8 +185,6 @@
extern int snd_line6_capture_trigger(struct snd_line6_pcm *line6pcm, int cmd);
#endif
-diff --git a/drivers/staging/line6/driver.c b/drivers/staging/line6/driver.c
-index 6a1959e..e8023af 100644
--- a/drivers/staging/line6/driver.c
+++ b/drivers/staging/line6/driver.c
@@ -1346,7 +1346,7 @@ static void __exit line6_exit(void)
@@ -211,11 +196,9 @@
}
usb_deregister(&line6_driver);
-diff --git a/drivers/staging/line6/pcm.c b/drivers/staging/line6/pcm.c
-index 37675e6..90d2d44 100644
--- a/drivers/staging/line6/pcm.c
+++ b/drivers/staging/line6/pcm.c
-@@ -52,9 +52,9 @@ static ssize_t pcm_set_impulse_volume(struct device *dev,
+@@ -52,9 +52,9 @@ static ssize_t pcm_set_impulse_volume(st
line6pcm->impulse_volume = value;
if (value > 0)
@@ -227,19 +210,24 @@
return count;
}
-@@ -92,29 +92,43 @@ static bool test_flags(unsigned long flags0, unsigned long flags1,
+@@ -92,9 +92,9 @@ static bool test_flags(unsigned long fla
return ((flags0 & mask) == 0) && ((flags1 & mask) != 0);
}
-int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels)
+int line6_pcm_acquire(struct snd_line6_pcm *line6pcm, int channels)
{
- unsigned long flags_old =
- __sync_fetch_and_or(&line6pcm->flags, channels);
- unsigned long flags_new = flags_old | channels;
-+ unsigned long flags_final = flags_old;
- int err = 0;
+- unsigned long flags_old, flags_new;
++ unsigned long flags_old, flags_new, flags_final;
+ int err;
+
+ do {
+@@ -102,22 +102,37 @@ int line6_pcm_start(struct snd_line6_pcm
+ flags_new = flags_old | channels;
+ } while (cmpxchg(&line6pcm->flags, flags_old, flags_new) != flags_old);
++ flags_final = flags_old;
++
line6pcm->prev_fbuf = NULL;
- if (test_flags(flags_old, flags_new, MASK_CAPTURE)) {
@@ -280,7 +268,7 @@
}
line6pcm->count_in = 0;
-@@ -122,55 +136,78 @@ int line6_pcm_start(struct snd_line6_pcm *line6pcm, int channels)
+@@ -125,42 +140,59 @@ int line6_pcm_start(struct snd_line6_pcm
err = line6_submit_audio_in_all_urbs(line6pcm);
if (err < 0)
@@ -340,7 +328,11 @@
return 0;
-pcm_start_error:
-- __sync_fetch_and_and(&line6pcm->flags, ~channels);
+- do {
+- flags_old = ACCESS_ONCE(line6pcm->flags);
+- flags_new = flags_old & ~channels;
+- } while (cmpxchg(&line6pcm->flags, flags_old, flags_new) != flags_old);
+-
+pcm_acquire_error:
+ /*
+ If not all requested resources/streams could be obtained, release
@@ -353,9 +345,11 @@
-int line6_pcm_stop(struct snd_line6_pcm *line6pcm, int channels)
+int line6_pcm_release(struct snd_line6_pcm *line6pcm, int channels)
{
- unsigned long flags_old =
- __sync_fetch_and_and(&line6pcm->flags, ~channels);
- unsigned long flags_new = flags_old & ~channels;
+ unsigned long flags_old, flags_new;
+
+@@ -169,18 +201,20 @@ int line6_pcm_stop(struct snd_line6_pcm
+ flags_new = flags_old & ~channels;
+ } while (cmpxchg(&line6pcm->flags, flags_old, flags_new) != flags_old);
- if (test_flags(flags_new, flags_old, MASK_CAPTURE)) {
+ if (test_flags(flags_new, flags_old, LINE6_BITS_CAPTURE_STREAM))
@@ -380,7 +374,7 @@
}
return 0;
-@@ -185,7 +222,7 @@ int snd_line6_trigger(struct snd_pcm_substream *substream, int cmd)
+@@ -195,7 +229,7 @@ int snd_line6_trigger(struct snd_pcm_sub
unsigned long flags;
spin_lock_irqsave(&line6pcm->lock_trigger, flags);
@@ -389,7 +383,7 @@
snd_pcm_group_for_each_entry(s, substream) {
switch (s->stream) {
-@@ -498,13 +535,13 @@ int snd_line6_prepare(struct snd_pcm_substream *substream)
+@@ -511,13 +545,13 @@ int snd_line6_prepare(struct snd_pcm_sub
switch (substream->stream) {
case SNDRV_PCM_STREAM_PLAYBACK:
@@ -405,7 +399,7 @@
line6_unlink_wait_clear_audio_in_urbs(line6pcm);
break;
-@@ -513,7 +550,7 @@ int snd_line6_prepare(struct snd_pcm_substream *substream)
+@@ -526,7 +560,7 @@ int snd_line6_prepare(struct snd_pcm_sub
MISSING_CASE;
}
@@ -414,8 +408,6 @@
line6pcm->count_out = 0;
line6pcm->pos_out = 0;
line6pcm->pos_out_done = 0;
-diff --git a/drivers/staging/line6/pcm.h b/drivers/staging/line6/pcm.h
-index 47c6d69..5210ec8 100644
--- a/drivers/staging/line6/pcm.h
+++ b/drivers/staging/line6/pcm.h
@@ -46,57 +46,131 @@
@@ -474,23 +466,12 @@
+ LINE6_INDEX_PCM_MONITOR_PLAYBACK_STREAM,
+ LINE6_INDEX_PCM_MONITOR_CAPTURE_BUFFER,
+ LINE6_INDEX_PCM_MONITOR_CAPTURE_STREAM,
- #ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
-- BIT_PCM_IMPULSE_PLAYBACK,
-- BIT_PCM_IMPULSE_CAPTURE,
++#ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
+ LINE6_INDEX_PCM_IMPULSE_PLAYBACK_BUFFER,
+ LINE6_INDEX_PCM_IMPULSE_PLAYBACK_STREAM,
+ LINE6_INDEX_PCM_IMPULSE_CAPTURE_BUFFER,
+ LINE6_INDEX_PCM_IMPULSE_CAPTURE_STREAM,
- #endif
-- BIT_PAUSE_PLAYBACK,
-- BIT_PREPARED,
--
-- /* individual masks: */
--/* *INDENT-OFF* */
-- MASK_PCM_ALSA_PLAYBACK = 1 << BIT_PCM_ALSA_PLAYBACK,
-- MASK_PCM_ALSA_CAPTURE = 1 << BIT_PCM_ALSA_CAPTURE,
-- MASK_PCM_MONITOR_PLAYBACK = 1 << BIT_PCM_MONITOR_PLAYBACK,
-- MASK_PCM_MONITOR_CAPTURE = 1 << BIT_PCM_MONITOR_CAPTURE,
++#endif
+ LINE6_INDEX_PAUSE_PLAYBACK,
+ LINE6_INDEX_PREPARED,
+
@@ -503,23 +484,15 @@
+ LINE6_BIT(PCM_MONITOR_PLAYBACK_STREAM),
+ LINE6_BIT(PCM_MONITOR_CAPTURE_BUFFER),
+ LINE6_BIT(PCM_MONITOR_CAPTURE_STREAM),
- #ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
-- MASK_PCM_IMPULSE_PLAYBACK = 1 << BIT_PCM_IMPULSE_PLAYBACK,
-- MASK_PCM_IMPULSE_CAPTURE = 1 << BIT_PCM_IMPULSE_CAPTURE,
++#ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
+ LINE6_BIT(PCM_IMPULSE_PLAYBACK_BUFFER),
+ LINE6_BIT(PCM_IMPULSE_PLAYBACK_STREAM),
+ LINE6_BIT(PCM_IMPULSE_CAPTURE_BUFFER),
+ LINE6_BIT(PCM_IMPULSE_CAPTURE_STREAM),
- #endif
-- MASK_PAUSE_PLAYBACK = 1 << BIT_PAUSE_PLAYBACK,
-- MASK_PREPARED = 1 << BIT_PREPARED,
--/* *INDENT-ON* */
++#endif
+ LINE6_BIT(PAUSE_PLAYBACK),
+ LINE6_BIT(PREPARED),
-
-- /* combined masks (by operation): */
-- MASK_PCM_ALSA = MASK_PCM_ALSA_PLAYBACK | MASK_PCM_ALSA_CAPTURE,
-- MASK_PCM_MONITOR = MASK_PCM_MONITOR_PLAYBACK | MASK_PCM_MONITOR_CAPTURE,
++
+ /* combined bit masks (by operation): */
+ LINE6_BITS_PCM_ALSA_BUFFER =
+ LINE6_BIT_PCM_ALSA_PLAYBACK_BUFFER |
@@ -545,16 +518,35 @@
+
+ /* combined bit masks (by direction): */
+ LINE6_BITS_PLAYBACK_BUFFER =
-+#ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
+ #ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
+- BIT_PCM_IMPULSE_PLAYBACK,
+- BIT_PCM_IMPULSE_CAPTURE,
+ LINE6_BIT_PCM_IMPULSE_PLAYBACK_BUFFER |
-+#endif
+ #endif
+- BIT_PAUSE_PLAYBACK,
+- BIT_PREPARED,
+ LINE6_BIT_PCM_ALSA_PLAYBACK_BUFFER |
+ LINE6_BIT_PCM_MONITOR_PLAYBACK_BUFFER ,
-+
+
+- /* individual masks: */
+-/* *INDENT-OFF* */
+- MASK_PCM_ALSA_PLAYBACK = 1 << BIT_PCM_ALSA_PLAYBACK,
+- MASK_PCM_ALSA_CAPTURE = 1 << BIT_PCM_ALSA_CAPTURE,
+- MASK_PCM_MONITOR_PLAYBACK = 1 << BIT_PCM_MONITOR_PLAYBACK,
+- MASK_PCM_MONITOR_CAPTURE = 1 << BIT_PCM_MONITOR_CAPTURE,
+ LINE6_BITS_PLAYBACK_STREAM =
-+#ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
+ #ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
+- MASK_PCM_IMPULSE_PLAYBACK = 1 << BIT_PCM_IMPULSE_PLAYBACK,
+- MASK_PCM_IMPULSE_CAPTURE = 1 << BIT_PCM_IMPULSE_CAPTURE,
+ LINE6_BIT_PCM_IMPULSE_PLAYBACK_STREAM |
-+#endif
+ #endif
+- MASK_PAUSE_PLAYBACK = 1 << BIT_PAUSE_PLAYBACK,
+- MASK_PREPARED = 1 << BIT_PREPARED,
+-/* *INDENT-ON* */
+-
+- /* combined masks (by operation): */
+- MASK_PCM_ALSA = MASK_PCM_ALSA_PLAYBACK | MASK_PCM_ALSA_CAPTURE,
+- MASK_PCM_MONITOR = MASK_PCM_MONITOR_PLAYBACK | MASK_PCM_MONITOR_CAPTURE,
+ LINE6_BIT_PCM_ALSA_PLAYBACK_STREAM |
+ LINE6_BIT_PCM_MONITOR_PLAYBACK_STREAM ,
+
@@ -598,7 +590,7 @@
*/
unsigned long flags;
-@@ -302,7 +376,7 @@ extern int line6_init_pcm(struct usb_line6 *line6,
+@@ -302,7 +376,7 @@ extern int line6_init_pcm(struct usb_lin
extern int snd_line6_trigger(struct snd_pcm_substream *substream, int cmd);
extern int snd_line6_prepare(struct snd_pcm_substream *substream);
extern void line6_pcm_disconnect(struct snd_line6_pcm *line6pcm);
@@ -608,11 +600,9 @@
+extern int line6_pcm_release(struct snd_line6_pcm *line6pcm, int channels);
#endif
-diff --git a/drivers/staging/line6/playback.c b/drivers/staging/line6/playback.c
-index 4152db2..a0ab9d0 100644
--- a/drivers/staging/line6/playback.c
+++ b/drivers/staging/line6/playback.c
-@@ -166,7 +166,7 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
+@@ -166,7 +166,7 @@ static int submit_audio_out_urb(struct s
struct usb_iso_packet_descriptor *fout =
&urb_out->iso_frame_desc[i];
@@ -621,7 +611,7 @@
fsize = line6pcm->prev_fsize;
if (fsize == 0) {
-@@ -196,8 +196,8 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
+@@ -196,8 +196,8 @@ static int submit_audio_out_urb(struct s
urb_out->transfer_buffer_length = urb_size;
urb_out->context = line6pcm;
@@ -632,7 +622,7 @@
struct snd_pcm_runtime *runtime =
get_substream(line6pcm, SNDRV_PCM_STREAM_PLAYBACK)->runtime;
-@@ -238,10 +238,10 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
+@@ -238,10 +238,10 @@ static int submit_audio_out_urb(struct s
if (line6pcm->prev_fbuf != NULL) {
#ifdef CONFIG_LINE6_USB_IMPULSE_RESPONSE
@@ -645,7 +635,7 @@
line6_capture_copy(line6pcm,
urb_out->transfer_buffer,
urb_out->
-@@ -254,8 +254,8 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
+@@ -254,8 +254,8 @@ static int submit_audio_out_urb(struct s
if (!
(line6pcm->line6->
properties->capabilities & LINE6_BIT_HWMON)
@@ -656,7 +646,7 @@
add_monitor_signal(urb_out, line6pcm->prev_fbuf,
line6pcm->volume_monitor,
bytes_per_frame);
-@@ -321,7 +321,7 @@ void line6_unlink_audio_out_urbs(struct snd_line6_pcm *line6pcm)
+@@ -321,7 +321,7 @@ void line6_unlink_audio_out_urbs(struct
/*
Wait until unlinking of all currently active playback URBs has been finished.
*/
@@ -665,7 +655,7 @@
{
int timeout = HZ;
unsigned int i;
-@@ -348,26 +348,7 @@ static void wait_clear_audio_out_urbs(struct snd_line6_pcm *line6pcm)
+@@ -348,26 +348,7 @@ static void wait_clear_audio_out_urbs(st
void line6_unlink_wait_clear_audio_out_urbs(struct snd_line6_pcm *line6pcm)
{
line6_unlink_audio_out_urbs(line6pcm);
@@ -693,7 +683,7 @@
}
void line6_free_playback_buffer(struct snd_line6_pcm *line6pcm)
-@@ -407,7 +388,7 @@ static void audio_out_callback(struct urb *urb)
+@@ -407,7 +388,7 @@ static void audio_out_callback(struct ur
spin_lock_irqsave(&line6pcm->lock_audio_out, flags);
@@ -702,7 +692,7 @@
struct snd_pcm_runtime *runtime = substream->runtime;
line6pcm->pos_out_done +=
length / line6pcm->properties->bytes_per_frame;
-@@ -432,7 +413,7 @@ static void audio_out_callback(struct urb *urb)
+@@ -432,7 +413,7 @@ static void audio_out_callback(struct ur
if (!shutdown) {
submit_audio_out_urb(line6pcm);
@@ -711,7 +701,7 @@
line6pcm->bytes_out += length;
if (line6pcm->bytes_out >= line6pcm->period_out) {
line6pcm->bytes_out %= line6pcm->period_out;
-@@ -484,17 +465,17 @@ static int snd_line6_playback_hw_params(struct snd_pcm_substream *substream,
+@@ -484,17 +465,17 @@ static int snd_line6_playback_hw_params(
}
/* -- [FD] end */
@@ -735,7 +725,7 @@
line6pcm->period_out = params_period_bytes(hw_params);
return 0;
-@@ -504,12 +485,7 @@ static int snd_line6_playback_hw_params(struct snd_pcm_substream *substream,
+@@ -504,12 +485,7 @@ static int snd_line6_playback_hw_params(
static int snd_line6_playback_hw_free(struct snd_pcm_substream *substream)
{
struct snd_line6_pcm *line6pcm = snd_pcm_substream_chip(substream);
@@ -749,7 +739,7 @@
return snd_pcm_lib_free_pages(substream);
}
-@@ -523,7 +499,7 @@ int snd_line6_playback_trigger(struct snd_line6_pcm *line6pcm, int cmd)
+@@ -523,7 +499,7 @@ int snd_line6_playback_trigger(struct sn
#ifdef CONFIG_PM
case SNDRV_PCM_TRIGGER_RESUME:
#endif
@@ -758,7 +748,7 @@
if (err < 0)
return err;
-@@ -534,7 +510,7 @@ int snd_line6_playback_trigger(struct snd_line6_pcm *line6pcm, int cmd)
+@@ -534,7 +510,7 @@ int snd_line6_playback_trigger(struct sn
#ifdef CONFIG_PM
case SNDRV_PCM_TRIGGER_SUSPEND:
#endif
@@ -767,7 +757,7 @@
if (err < 0)
return err;
-@@ -542,11 +518,11 @@ int snd_line6_playback_trigger(struct snd_line6_pcm *line6pcm, int cmd)
+@@ -542,11 +518,11 @@ int snd_line6_playback_trigger(struct sn
break;
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
@@ -781,8 +771,6 @@
break;
default:
-diff --git a/drivers/staging/line6/playback.h b/drivers/staging/line6/playback.h
-index 02487ff..743bd6f 100644
--- a/drivers/staging/line6/playback.h
+++ b/drivers/staging/line6/playback.h
@@ -29,13 +29,13 @@
@@ -800,11 +788,9 @@
extern int snd_line6_playback_trigger(struct snd_line6_pcm *line6pcm, int cmd);
#endif
-diff --git a/drivers/staging/line6/toneport.c b/drivers/staging/line6/toneport.c
-index b776130..b754f69 100644
--- a/drivers/staging/line6/toneport.c
+++ b/drivers/staging/line6/toneport.c
-@@ -207,9 +207,9 @@ static int snd_toneport_monitor_put(struct snd_kcontrol *kcontrol,
+@@ -207,9 +207,9 @@ static int snd_toneport_monitor_put(stru
line6pcm->volume_monitor = ucontrol->value.integer.value[0];
if (line6pcm->volume_monitor > 0)
@@ -816,7 +802,7 @@
return 1;
}
-@@ -264,7 +264,7 @@ static void toneport_start_pcm(unsigned long arg)
+@@ -264,7 +264,7 @@ static void toneport_start_pcm(unsigned
{
struct usb_line6_toneport *toneport = (struct usb_line6_toneport *)arg;
struct usb_line6 *line6 = &toneport->line6;
@@ -825,7 +811,7 @@
}
/* control definition */
-@@ -446,7 +446,7 @@ void line6_toneport_disconnect(struct usb_interface *interface)
+@@ -446,7 +446,7 @@ void line6_toneport_disconnect(struct us
struct snd_line6_pcm *line6pcm = toneport->line6.line6pcm;
if (line6pcm != NULL) {
@@ -834,8 +820,6 @@
line6_pcm_disconnect(line6pcm);
}
}
-diff --git a/drivers/staging/line6/usbdefs.h b/drivers/staging/line6/usbdefs.h
-index aff9e5c..353d59d 100644
--- a/drivers/staging/line6/usbdefs.h
+++ b/drivers/staging/line6/usbdefs.h
@@ -39,31 +39,29 @@
Modified: dists/wheezy/linux/debian/patches/features/x86/hyperv/0055-Staging-hv-storvsc-Get-rid-of-the-on_io_completion-i.patch
==============================================================================
--- dists/wheezy/linux/debian/patches/features/x86/hyperv/0055-Staging-hv-storvsc-Get-rid-of-the-on_io_completion-i.patch Fri Aug 7 18:47:01 2015 (r22933)
+++ dists/wheezy/linux/debian/patches/features/x86/hyperv/0055-Staging-hv-storvsc-Get-rid-of-the-on_io_completion-i.patch Sat Aug 8 17:48:04 2015 (r22934)
@@ -11,8 +11,9 @@
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
[bwh: Adjusted to apply after backported commits 9d2696e658ef
- '[SCSI] storvsc: Initialize the sglist' and 56b26e69c828
- 'Drivers: scsi: storvsc: Implement a eh_timed_out handler']
+ '[SCSI] storvsc: Initialize the sglist', 56b26e69c828
+ 'Drivers: scsi: storvsc: Implement a eh_timed_out handler', and
+ 8de580742fee 'scsi: storvsc: Fix a bug in copy_from_bounce_buffer()']
---
drivers/staging/hv/storvsc_drv.c | 630 +++++++++++++++++++-------------------
@@ -28,7 +29,7 @@
struct hv_multipage_buffer data_buffer;
struct vstor_packet vstor_packet;
-@@ -437,6 +436,228 @@ get_in_err:
+@@ -437,6 +436,229 @@ get_in_err:
}
@@ -232,23 +233,24 @@
+ if (bounce_sgl[j].length == PAGE_SIZE) {
+ /* full..move to next entry */
+ kunmap_atomic((void *)bounce_addr, KM_IRQ0);
++ bounce_addr = 0;
+ j++;
++ }
+
-+ /* if we need to use another bounce buffer */
-+ if (srclen || i != orig_sgl_count - 1)
-+ bounce_addr =
++ /* if we need to use another bounce buffer */
++ if (srclen && bounce_addr == 0)
++ bounce_addr =
+ (unsigned long)kmap_atomic(
+ sg_page((&bounce_sgl[j])), KM_IRQ0);
+
-+ } else if (srclen == 0 && i == orig_sgl_count - 1) {
-+ /* unmap the last bounce that is < PAGE_SIZE */
-+ kunmap_atomic((void *)bounce_addr, KM_IRQ0);
-+ }
+ }
+
+ kunmap_atomic((void *)(src_addr - orig_sgl[i].offset), KM_IRQ0);
+ }
+
++ if (bounce_addr)
++ kunmap_atomic((void *)bounce_addr, KM_IRQ0);
++
+ local_irq_restore(flags);
+
+ return total_copied;
@@ -257,7 +259,7 @@
static int storvsc_channel_init(struct hv_device *device)
{
struct storvsc_device *stor_device;
-@@ -563,23 +784,100 @@ cleanup:
+@@ -563,22 +785,99 @@ cleanup:
return ret;
}
@@ -298,7 +300,6 @@
- * INQUIRY command with page code parameter set to 0x80
- * MODE_SENSE command with cmd[2] == 0x1c
- *
-- * Setup srb and scsi status so this won't be fatal.
+ * If there is an error; offline the device since all
+ * error recovery strategies would have already been
+ * deployed on the host side.
@@ -367,11 +368,10 @@
+ * INQUIRY command with page code parameter set to 0x80
+ * MODE_SENSE command with cmd[2] == 0x1c
+ *
-+ * Setup srb and scsi status so this won't be fatal.
+ * Setup srb and scsi status so this won't be fatal.
* We do this so we can distinguish truly fatal failues
* (srb status == 0x4) and off-line the device in that case.
- */
-@@ -626,7 +924,7 @@ static void storvsc_on_io_completion(str
+@@ -626,7 +925,7 @@ static void storvsc_on_io_completion(str
stor_pkt->vm_srb.data_transfer_length =
vstor_packet->vm_srb.data_transfer_length;
@@ -380,7 +380,7 @@
if (atomic_dec_and_test(&stor_device->num_outstanding_req) &&
stor_device->drain_notify)
-@@ -876,230 +1174,6 @@ static int storvsc_device_configure(stru
+@@ -876,231 +1175,6 @@ static int storvsc_device_configure(stru
return 0;
}
@@ -586,23 +586,24 @@
- if (bounce_sgl[j].length == PAGE_SIZE) {
- /* full..move to next entry */
- kunmap_atomic((void *)bounce_addr, KM_IRQ0);
+- bounce_addr = 0;
- j++;
+- }
-
-- /* if we need to use another bounce buffer */
-- if (srclen || i != orig_sgl_count - 1)
-- bounce_addr =
+- /* if we need to use another bounce buffer */
+- if (srclen && bounce_addr == 0)
+- bounce_addr =
- (unsigned long)kmap_atomic(
- sg_page((&bounce_sgl[j])), KM_IRQ0);
-
-- } else if (srclen == 0 && i == orig_sgl_count - 1) {
-- /* unmap the last bounce that is < PAGE_SIZE */
-- kunmap_atomic((void *)bounce_addr, KM_IRQ0);
-- }
- }
-
- kunmap_atomic((void *)(src_addr - orig_sgl[i].offset), KM_IRQ0);
- }
-
+- if (bounce_addr)
+- kunmap_atomic((void *)bounce_addr, KM_IRQ0);
+-
- local_irq_restore(flags);
-
- return total_copied;
@@ -611,7 +612,7 @@
static int storvsc_get_chs(struct scsi_device *sdev, struct block_device * bdev,
sector_t capacity, int *info)
{
-@@ -1173,83 +1247,6 @@ static int storvsc_host_reset_handler(st
+@@ -1174,83 +1248,6 @@ static int storvsc_host_reset_handler(st
return SUCCESS;
}
@@ -695,7 +696,7 @@
/*
* The host guarantees to respond to each command, although I/O latencies might
* be unbounded on Azure. Reset the timer unconditionally to give the host a
-@@ -1335,7 +1332,6 @@ static int storvsc_queuecommand(struct S
+@@ -1336,7 +1333,6 @@ static int storvsc_queuecommand(struct S
break;
}
Modified: dists/wheezy/linux/debian/patches/features/x86/hyperv/0067-Staging-hv-storvsc-Move-the-storage-driver-out-of-th.patch
==============================================================================
--- dists/wheezy/linux/debian/patches/features/x86/hyperv/0067-Staging-hv-storvsc-Move-the-storage-driver-out-of-th.patch Fri Aug 7 18:47:01 2015 (r22933)
+++ dists/wheezy/linux/debian/patches/features/x86/hyperv/0067-Staging-hv-storvsc-Move-the-storage-driver-out-of-th.patch Sat Aug 8 17:48:04 2015 (r22934)
@@ -21,8 +21,9 @@
Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
[bwh: Adjusted to apply after backported commits 5c1b10ab7f93
'[SCSI] storvsc: Account for in-transit packets in the RESET path' and
- 9d2696e658ef '[SCSI] storvsc: Initialize the sglist' and 56b26e69c828
- 'Drivers: scsi: storvsc: Implement a eh_timed_out handler']
+ 9d2696e658ef '[SCSI] storvsc: Initialize the sglist', 56b26e69c828
+ 'Drivers: scsi: storvsc: Implement a eh_timed_out handler' and
+ 8de580742fee 'scsi: storvsc: Fix a bug in copy_from_bounce_buffer()']
---
--- a/drivers/scsi/Kconfig
+++ b/drivers/scsi/Kconfig
@@ -61,7 +62,7 @@
sd_mod-objs := sd.o
--- /dev/null
+++ b/drivers/scsi/storvsc_drv.c
-@@ -0,0 +1,1566 @@
+@@ -0,0 +1,1567 @@
+/*
+ * Copyright (c) 2009, Microsoft Corporation.
+ *
@@ -673,23 +674,24 @@
+ if (bounce_sgl[j].length == PAGE_SIZE) {
+ /* full..move to next entry */
+ kunmap_atomic((void *)bounce_addr, KM_IRQ0);
++ bounce_addr = 0;
+ j++;
++ }
+
-+ /* if we need to use another bounce buffer */
-+ if (srclen || i != orig_sgl_count - 1)
-+ bounce_addr =
++ /* if we need to use another bounce buffer */
++ if (srclen && bounce_addr == 0)
++ bounce_addr =
+ (unsigned long)kmap_atomic(
+ sg_page((&bounce_sgl[j])), KM_IRQ0);
+
-+ } else if (srclen == 0 && i == orig_sgl_count - 1) {
-+ /* unmap the last bounce that is < PAGE_SIZE */
-+ kunmap_atomic((void *)bounce_addr, KM_IRQ0);
-+ }
+ }
+
+ kunmap_atomic((void *)(src_addr - orig_sgl[i].offset), KM_IRQ0);
+ }
+
++ if (bounce_addr)
++ kunmap_atomic((void *)bounce_addr, KM_IRQ0);
++
+ local_irq_restore(flags);
+
+ return total_copied;
@@ -1673,7 +1675,7 @@
-Haiyang Zhang <haiyangz at microsoft.com>, and K. Y. Srinivasan <kys at microsoft.com>
--- a/drivers/staging/hv/storvsc_drv.c
+++ /dev/null
-@@ -1,1566 +0,0 @@
+@@ -1,1567 +0,0 @@
-/*
- * Copyright (c) 2009, Microsoft Corporation.
- *
@@ -2285,23 +2287,24 @@
- if (bounce_sgl[j].length == PAGE_SIZE) {
- /* full..move to next entry */
- kunmap_atomic((void *)bounce_addr, KM_IRQ0);
+- bounce_addr = 0;
- j++;
+- }
-
-- /* if we need to use another bounce buffer */
-- if (srclen || i != orig_sgl_count - 1)
-- bounce_addr =
+- /* if we need to use another bounce buffer */
+- if (srclen && bounce_addr == 0)
+- bounce_addr =
- (unsigned long)kmap_atomic(
- sg_page((&bounce_sgl[j])), KM_IRQ0);
-
-- } else if (srclen == 0 && i == orig_sgl_count - 1) {
-- /* unmap the last bounce that is < PAGE_SIZE */
-- kunmap_atomic((void *)bounce_addr, KM_IRQ0);
-- }
- }
-
- kunmap_atomic((void *)(src_addr - orig_sgl[i].offset), KM_IRQ0);
- }
-
+- if (bounce_addr)
+- kunmap_atomic((void *)bounce_addr, KM_IRQ0);
+-
- local_irq_restore(flags);
-
- return total_copied;
Modified: dists/wheezy/linux/debian/patches/features/x86/hyperv/0077-hv-remove-the-second-argument-of-k-un-map_atomic.patch
==============================================================================
--- dists/wheezy/linux/debian/patches/features/x86/hyperv/0077-hv-remove-the-second-argument-of-k-un-map_atomic.patch Fri Aug 7 18:47:01 2015 (r22933)
+++ dists/wheezy/linux/debian/patches/features/x86/hyperv/0077-hv-remove-the-second-argument-of-k-un-map_atomic.patch Sat Aug 8 17:48:04 2015 (r22934)
@@ -6,17 +6,18 @@
Acked-by: Greg Kroah-Hartman <gregkh at suse.de>
Signed-off-by: Cong Wang <amwang at redhat.com>
-[bwh: Adjust filename to apply after move to drivers/scsi; apply changes
- from Linux's merge commit 9f3938346a5c1fa504647670edb5fea5756cfb00.]
+[bwh: Adjust filename to apply after move to drivers/scsi and after
+ backport of commit 8de580742fee
+ 'scsi: storvsc: Fix a bug in copy_from_bounce_buffer()',
+ apply changes from Linux's merge commit
+ 9f3938346a5c1fa504647670edb5fea5756cfb00.]
---
drivers/scsi/storvsc_drv.c | 52 ++++++++++++++++++++++----------------------
1 file changed, 26 insertions(+), 26 deletions(-)
-diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
-index 695ffc3..83a1972 100644
--- a/drivers/scsi/storvsc_drv.c
+++ b/drivers/scsi/storvsc_drv.c
-@@ -481,6 +481,19 @@ cleanup:
+@@ -483,6 +483,19 @@ cleanup:
return NULL;
}
@@ -36,7 +37,7 @@
/* Assume the original sgl has enough room */
static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl,
struct scatterlist *bounce_sgl,
-@@ -499,15 +512,12 @@ static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl,
+@@ -501,15 +514,12 @@ static unsigned int copy_from_bounce_buf
local_irq_save(flags);
for (i = 0; i < orig_sgl_count; i++) {
@@ -54,7 +55,7 @@
while (destlen) {
src = bounce_addr + bounce_sgl[j].offset;
-@@ -523,7 +533,7 @@ static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl,
+@@ -525,7 +535,7 @@ static unsigned int copy_from_bounce_buf
if (bounce_sgl[j].offset == bounce_sgl[j].length) {
/* full */
@@ -63,7 +64,7 @@
j++;
/*
-@@ -537,26 +547,21 @@ static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl,
+@@ -539,26 +549,21 @@ static unsigned int copy_from_bounce_buf
/*
* We are done; cleanup and return.
*/
@@ -94,7 +95,7 @@
}
local_irq_restore(flags);
-@@ -581,15 +586,12 @@ static unsigned int copy_to_bounce_buffer(struct scatterlist *orig_sgl,
+@@ -583,15 +588,12 @@ static unsigned int copy_to_bounce_buffe
local_irq_save(flags);
for (i = 0; i < orig_sgl_count; i++) {
@@ -112,33 +113,32 @@
while (srclen) {
/* assume bounce offset always == 0 */
-@@ -606,22 +608,20 @@ static unsigned int copy_to_bounce_buffer(struct scatterlist *orig_sgl,
+@@ -608,24 +610,22 @@ static unsigned int copy_to_bounce_buffe
if (bounce_sgl[j].length == PAGE_SIZE) {
/* full..move to next entry */
- kunmap_atomic((void *)bounce_addr, KM_IRQ0);
+ sg_kunmap_atomic(bounce_addr);
+ bounce_addr = 0;
j++;
+ }
- /* if we need to use another bounce buffer */
- if (srclen || i != orig_sgl_count - 1)
-- bounce_addr =
+ /* if we need to use another bounce buffer */
+ if (srclen && bounce_addr == 0)
+- bounce_addr =
- (unsigned long)kmap_atomic(
- sg_page((&bounce_sgl[j])), KM_IRQ0);
-+ bounce_addr = sg_kmap_atomic(bounce_sgl,j);
++ bounce_addr = sg_kmap_atomic(bounce_sgl,j);
- } else if (srclen == 0 && i == orig_sgl_count - 1) {
- /* unmap the last bounce that is < PAGE_SIZE */
-- kunmap_atomic((void *)bounce_addr, KM_IRQ0);
-+ sg_kunmap_atomic(bounce_addr);
- }
}
- kunmap_atomic((void *)(src_addr - orig_sgl[i].offset), KM_IRQ0);
+ sg_kunmap_atomic(src_addr - orig_sgl[i].offset);
}
+ if (bounce_addr)
+- kunmap_atomic((void *)bounce_addr, KM_IRQ0);
++ sg_kunmap_atomic(bounce_addr);
+
local_irq_restore(flags);
---
-1.7.9.5
-
+
Modified: dists/wheezy/linux/debian/patches/series
==============================================================================
--- dists/wheezy/linux/debian/patches/series Fri Aug 7 18:47:01 2015 (r22933)
+++ dists/wheezy/linux/debian/patches/series Sat Aug 8 17:48:04 2015 (r22934)
@@ -507,7 +507,6 @@
features/all/line6/0025-staging-line6-toneport.c-remove-err-usage.patch
features/all/line6/0026-staging-line6-midibuf.c-changed-printk-KERN_DEBUG-.-.patch
features/all/line6/0027-staging-line6-midi.c-Added-space-between-switch-and-.patch
-features/all/line6/0028-staging-line6-pcm.c-Removed-trailing-whitespace.patch
features/all/line6/0029-staging-line6-config.h-Remove-CHECKPOINT-macro.patch
features/all/line6/0030-staging-line6-config.h-Delete-unused-header.patch
features/all/line6/0031-staging-line6-changed-interface-of-line6_transmit_pa.patch
@@ -1136,8 +1135,6 @@
debian/mm-truncate-avoid-abi-change-in-3.2.65.patch
bugfix/all/aufs-move-d_rcu-from-overlapping-d_child-to-overlapping-d.patch
debian/vfs-avoid-abi-change-for-dentry-union-changes.patch
-bugfix/all/vfs-read-file_handle-only-once-in-handle_to_path.patch
-bugfix/all/aslr-fix-stack-randomization-on-64-bit-systems.patch
debian/sock-fix-abi-change-in-3.2.67.patch
debian/rmap-fix-abi-change-in-3.2.67.patch
@@ -1154,24 +1151,6 @@
features/all/hpsa/0010-hpsa-add-in-gen9-controller-model-names.patch
features/all/hpsa/0011-hpsa-add-in-P840ar-controller-model-name.patch
-bugfix/all/nfsv4-minor-cleanups-for-nfs4_handle_exception-and-n.patch
bugfix/all/netfilter-ipset-Check-and-reject-crazy-0-input-param.patch
-
-bugfix/all/ib-core-prevent-integer-overflow-in-ib_umem_get.patch
-bugfix/all/netfilter-nf_conntrack-reserve-two-bytes-for-nf_ct_e.patch
-bugfix/all/net-llc-use-correct-size-for-sysctl-timeout-entries.patch
-bugfix/all/net-rds-use-correct-size-for-max-unacked-packets-and.patch
-bugfix/all/xen-pciback-limit-guest-control-of-command-register.patch
-bugfix/x86/x86-asm-entry-64-remove-a-bogus-ret_from_fork-optimi.patch
-bugfix/all/ipv6-don-t-reduce-hop-limit-for-an-interface.patch
-bugfix/x86/crypto-aesni-fix-memory-usage-in-GCM-decryption.patch
-bugfix/all/fs-take-i_mutex-during-prepare_binprm-for-set-ug-id-.patch
-bugfix/all/pipe-iovec-fix-memory-corruption-when-retrying-atomi.patch
-bugfix/all/udf-remove-repeated-loads-blocksize.patch
-bugfix/all/udf-check-length-of-extended-attributes-and-allocati.patch
-bugfix/all/ipv4-missing-sk_nulls_node_init-in-ping_unhash.patch
-bugfix/all/udp-fix-behavior-of-wrong-checksums.patch
-bugfix/all/sctp-fix-asconf-list-handling.patch
-bugfix/x86/x86-bpf_jit-fix-compilation-of-large-bpf-programs.patch
-bugfix/all/sg_start_req-make-sure-that-there-s-not-too-many-ele.patch
bugfix/all/md-use-kzalloc-when-bitmap-is-disabled.patch
+debian/revert-acpica-utilities-split-io-address-types-from-.patch
More information about the Kernel-svn-changes
mailing list