mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-24 19:40:21 +09:00
Merge tag 'lsk-v3.14-15.04' of https://git.linaro.org/kernel/linux-linaro-stable into odroidc2-3.14.y-linarohk
LSK 15.04 v3.14 Conflicts: arch/x86/syscalls/syscall_64.tbl net/netfilter/xt_socket.c
This commit is contained in:
@@ -47,6 +47,8 @@ prototypes:
|
||||
int (*mknod) (struct inode *,struct dentry *,umode_t,dev_t);
|
||||
int (*rename) (struct inode *, struct dentry *,
|
||||
struct inode *, struct dentry *);
|
||||
int (*rename2) (struct inode *, struct dentry *,
|
||||
struct inode *, struct dentry *, unsigned int);
|
||||
int (*readlink) (struct dentry *, char __user *,int);
|
||||
void * (*follow_link) (struct dentry *, struct nameidata *);
|
||||
void (*put_link) (struct dentry *, struct nameidata *, void *);
|
||||
@@ -65,6 +67,7 @@ prototypes:
|
||||
struct file *, unsigned open_flag,
|
||||
umode_t create_mode, int *opened);
|
||||
int (*tmpfile) (struct inode *, struct dentry *, umode_t);
|
||||
int (*dentry_open)(struct dentry *, struct file *, const struct cred *);
|
||||
|
||||
locking rules:
|
||||
all may block
|
||||
@@ -78,6 +81,7 @@ mkdir: yes
|
||||
unlink: yes (both)
|
||||
rmdir: yes (both) (see below)
|
||||
rename: yes (all) (see below)
|
||||
rename2: yes (all) (see below)
|
||||
readlink: no
|
||||
follow_link: no
|
||||
put_link: no
|
||||
@@ -93,10 +97,12 @@ fiemap: no
|
||||
update_time: no
|
||||
atomic_open: yes
|
||||
tmpfile: no
|
||||
dentry_open: no
|
||||
|
||||
Additionally, ->rmdir(), ->unlink() and ->rename() have ->i_mutex on
|
||||
victim.
|
||||
cross-directory ->rename() has (per-superblock) ->s_vfs_rename_sem.
|
||||
cross-directory ->rename() and rename2() has (per-superblock)
|
||||
->s_vfs_rename_sem.
|
||||
|
||||
See Documentation/filesystems/directory-locking for more detailed discussion
|
||||
of the locking scheme for directory operations.
|
||||
|
||||
226
Documentation/filesystems/overlayfs.txt
Normal file
226
Documentation/filesystems/overlayfs.txt
Normal file
@@ -0,0 +1,226 @@
|
||||
Written by: Neil Brown <neilb@suse.de>
|
||||
|
||||
Overlay Filesystem
|
||||
==================
|
||||
|
||||
This document describes a prototype for a new approach to providing
|
||||
overlay-filesystem functionality in Linux (sometimes referred to as
|
||||
union-filesystems). An overlay-filesystem tries to present a
|
||||
filesystem which is the result over overlaying one filesystem on top
|
||||
of the other.
|
||||
|
||||
The result will inevitably fail to look exactly like a normal
|
||||
filesystem for various technical reasons. The expectation is that
|
||||
many use cases will be able to ignore these differences.
|
||||
|
||||
This approach is 'hybrid' because the objects that appear in the
|
||||
filesystem do not all appear to belong to that filesystem. In many
|
||||
cases an object accessed in the union will be indistinguishable
|
||||
from accessing the corresponding object from the original filesystem.
|
||||
This is most obvious from the 'st_dev' field returned by stat(2).
|
||||
|
||||
While directories will report an st_dev from the overlay-filesystem,
|
||||
all non-directory objects will report an st_dev from the lower or
|
||||
upper filesystem that is providing the object. Similarly st_ino will
|
||||
only be unique when combined with st_dev, and both of these can change
|
||||
over the lifetime of a non-directory object. Many applications and
|
||||
tools ignore these values and will not be affected.
|
||||
|
||||
Upper and Lower
|
||||
---------------
|
||||
|
||||
An overlay filesystem combines two filesystems - an 'upper' filesystem
|
||||
and a 'lower' filesystem. When a name exists in both filesystems, the
|
||||
object in the 'upper' filesystem is visible while the object in the
|
||||
'lower' filesystem is either hidden or, in the case of directories,
|
||||
merged with the 'upper' object.
|
||||
|
||||
It would be more correct to refer to an upper and lower 'directory
|
||||
tree' rather than 'filesystem' as it is quite possible for both
|
||||
directory trees to be in the same filesystem and there is no
|
||||
requirement that the root of a filesystem be given for either upper or
|
||||
lower.
|
||||
|
||||
The lower filesystem can be any filesystem supported by Linux and does
|
||||
not need to be writable. The lower filesystem can even be another
|
||||
overlayfs. The upper filesystem will normally be writable and if it
|
||||
is it must support the creation of trusted.* extended attributes, and
|
||||
must provide valid d_type in readdir responses, so NFS is not suitable.
|
||||
|
||||
A read-only overlay of two read-only filesystems may use any
|
||||
filesystem type.
|
||||
|
||||
Directories
|
||||
-----------
|
||||
|
||||
Overlaying mainly involves directories. If a given name appears in both
|
||||
upper and lower filesystems and refers to a non-directory in either,
|
||||
then the lower object is hidden - the name refers only to the upper
|
||||
object.
|
||||
|
||||
Where both upper and lower objects are directories, a merged directory
|
||||
is formed.
|
||||
|
||||
At mount time, the two directories given as mount options "lowerdir" and
|
||||
"upperdir" are combined into a merged directory:
|
||||
|
||||
mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,\
|
||||
workdir=/work /merged
|
||||
|
||||
The "workdir" needs to be an empty directory on the same filesystem
|
||||
as upperdir.
|
||||
|
||||
Then whenever a lookup is requested in such a merged directory, the
|
||||
lookup is performed in each actual directory and the combined result
|
||||
is cached in the dentry belonging to the overlay filesystem. If both
|
||||
actual lookups find directories, both are stored and a merged
|
||||
directory is created, otherwise only one is stored: the upper if it
|
||||
exists, else the lower.
|
||||
|
||||
Only the lists of names from directories are merged. Other content
|
||||
such as metadata and extended attributes are reported for the upper
|
||||
directory only. These attributes of the lower directory are hidden.
|
||||
|
||||
whiteouts and opaque directories
|
||||
--------------------------------
|
||||
|
||||
In order to support rm and rmdir without changing the lower
|
||||
filesystem, an overlay filesystem needs to record in the upper filesystem
|
||||
that files have been removed. This is done using whiteouts and opaque
|
||||
directories (non-directories are always opaque).
|
||||
|
||||
A whiteout is created as a character device with 0/0 device number.
|
||||
When a whiteout is found in the upper level of a merged directory, any
|
||||
matching name in the lower level is ignored, and the whiteout itself
|
||||
is also hidden.
|
||||
|
||||
A directory is made opaque by setting the xattr "trusted.overlay.opaque"
|
||||
to "y". Where the upper filesystem contains an opaque directory, any
|
||||
directory in the lower filesystem with the same name is ignored.
|
||||
|
||||
readdir
|
||||
-------
|
||||
|
||||
When a 'readdir' request is made on a merged directory, the upper and
|
||||
lower directories are each read and the name lists merged in the
|
||||
obvious way (upper is read first, then lower - entries that already
|
||||
exist are not re-added). This merged name list is cached in the
|
||||
'struct file' and so remains as long as the file is kept open. If the
|
||||
directory is opened and read by two processes at the same time, they
|
||||
will each have separate caches. A seekdir to the start of the
|
||||
directory (offset 0) followed by a readdir will cause the cache to be
|
||||
discarded and rebuilt.
|
||||
|
||||
This means that changes to the merged directory do not appear while a
|
||||
directory is being read. This is unlikely to be noticed by many
|
||||
programs.
|
||||
|
||||
seek offsets are assigned sequentially when the directories are read.
|
||||
Thus if
|
||||
- read part of a directory
|
||||
- remember an offset, and close the directory
|
||||
- re-open the directory some time later
|
||||
- seek to the remembered offset
|
||||
|
||||
there may be little correlation between the old and new locations in
|
||||
the list of filenames, particularly if anything has changed in the
|
||||
directory.
|
||||
|
||||
Readdir on directories that are not merged is simply handled by the
|
||||
underlying directory (upper or lower).
|
||||
|
||||
|
||||
Non-directories
|
||||
---------------
|
||||
|
||||
Objects that are not directories (files, symlinks, device-special
|
||||
files etc.) are presented either from the upper or lower filesystem as
|
||||
appropriate. When a file in the lower filesystem is accessed in a way
|
||||
the requires write-access, such as opening for write access, changing
|
||||
some metadata etc., the file is first copied from the lower filesystem
|
||||
to the upper filesystem (copy_up). Note that creating a hard-link
|
||||
also requires copy_up, though of course creation of a symlink does
|
||||
not.
|
||||
|
||||
The copy_up may turn out to be unnecessary, for example if the file is
|
||||
opened for read-write but the data is not modified.
|
||||
|
||||
The copy_up process first makes sure that the containing directory
|
||||
exists in the upper filesystem - creating it and any parents as
|
||||
necessary. It then creates the object with the same metadata (owner,
|
||||
mode, mtime, symlink-target etc.) and then if the object is a file, the
|
||||
data is copied from the lower to the upper filesystem. Finally any
|
||||
extended attributes are copied up.
|
||||
|
||||
Once the copy_up is complete, the overlay filesystem simply
|
||||
provides direct access to the newly created file in the upper
|
||||
filesystem - future operations on the file are barely noticed by the
|
||||
overlay filesystem (though an operation on the name of the file such as
|
||||
rename or unlink will of course be noticed and handled).
|
||||
|
||||
|
||||
Multiple lower layers
|
||||
---------------------
|
||||
|
||||
Multiple lower layers can now be given using the the colon (":") as a
|
||||
separator character between the directory names. For example:
|
||||
|
||||
mount -t overlay overlay -olowerdir=/lower1:/lower2:/lower3 /merged
|
||||
|
||||
As the example shows, "upperdir=" and "workdir=" may be omitted. In
|
||||
that case the overlay will be read-only.
|
||||
|
||||
The specified lower directories will be stacked beginning from the
|
||||
rightmost one and going left. In the above example lower1 will be the
|
||||
top, lower2 the middle and lower3 the bottom layer.
|
||||
|
||||
|
||||
Non-standard behavior
|
||||
---------------------
|
||||
|
||||
The copy_up operation essentially creates a new, identical file and
|
||||
moves it over to the old name. The new file may be on a different
|
||||
filesystem, so both st_dev and st_ino of the file may change.
|
||||
|
||||
Any open files referring to this inode will access the old data and
|
||||
metadata. Similarly any file locks obtained before copy_up will not
|
||||
apply to the copied up file.
|
||||
|
||||
On a file opened with O_RDONLY fchmod(2), fchown(2), futimesat(2) and
|
||||
fsetxattr(2) will fail with EROFS.
|
||||
|
||||
If a file with multiple hard links is copied up, then this will
|
||||
"break" the link. Changes will not be propagated to other names
|
||||
referring to the same inode.
|
||||
|
||||
Symlinks in /proc/PID/ and /proc/PID/fd which point to a non-directory
|
||||
object in overlayfs will not contain valid absolute paths, only
|
||||
relative paths leading up to the filesystem's root. This will be
|
||||
fixed in the future.
|
||||
|
||||
Some operations are not atomic, for example a crash during copy_up or
|
||||
rename will leave the filesystem in an inconsistent state. This will
|
||||
be addressed in the future.
|
||||
|
||||
Changes to underlying filesystems
|
||||
---------------------------------
|
||||
|
||||
Offline changes, when the overlay is not mounted, are allowed to either
|
||||
the upper or the lower trees.
|
||||
|
||||
Changes to the underlying filesystems while part of a mounted overlay
|
||||
filesystem are not allowed. If the underlying filesystem is changed,
|
||||
the behavior of the overlay is undefined, though it will not result in
|
||||
a crash or deadlock.
|
||||
|
||||
Testsuite
|
||||
---------
|
||||
|
||||
There's testsuite developed by David Howells at:
|
||||
|
||||
git://git.infradead.org/users/dhowells/unionmount-testsuite.git
|
||||
|
||||
Run as root:
|
||||
|
||||
# cd unionmount-testsuite
|
||||
# ./run --ov
|
||||
@@ -347,6 +347,8 @@ struct inode_operations {
|
||||
int (*mknod) (struct inode *,struct dentry *,umode_t,dev_t);
|
||||
int (*rename) (struct inode *, struct dentry *,
|
||||
struct inode *, struct dentry *);
|
||||
int (*rename2) (struct inode *, struct dentry *,
|
||||
struct inode *, struct dentry *, unsigned int);
|
||||
int (*readlink) (struct dentry *, char __user *,int);
|
||||
void * (*follow_link) (struct dentry *, struct nameidata *);
|
||||
void (*put_link) (struct dentry *, struct nameidata *, void *);
|
||||
@@ -362,6 +364,7 @@ struct inode_operations {
|
||||
int (*atomic_open)(struct inode *, struct dentry *, struct file *,
|
||||
unsigned open_flag, umode_t create_mode, int *opened);
|
||||
int (*tmpfile) (struct inode *, struct dentry *, umode_t);
|
||||
int (*dentry_open)(struct dentry *, struct file *, const struct cred *);
|
||||
};
|
||||
|
||||
Again, all methods are called without any locks being held, unless
|
||||
@@ -414,6 +417,20 @@ otherwise noted.
|
||||
rename: called by the rename(2) system call to rename the object to
|
||||
have the parent and name given by the second inode and dentry.
|
||||
|
||||
rename2: this has an additional flags argument compared to rename.
|
||||
If no flags are supported by the filesystem then this method
|
||||
need not be implemented. If some flags are supported then the
|
||||
filesystem must return -EINVAL for any unsupported or unknown
|
||||
flags. Currently the following flags are implemented:
|
||||
(1) RENAME_NOREPLACE: this flag indicates that if the target
|
||||
of the rename exists the rename should fail with -EEXIST
|
||||
instead of replacing the target. The VFS already checks for
|
||||
existence, so for local filesystems the RENAME_NOREPLACE
|
||||
implementation is equivalent to plain rename.
|
||||
(2) RENAME_EXCHANGE: exchange source and target. Both must
|
||||
exist; this is checked by the VFS. Unlike plain rename,
|
||||
source and target may be of different type.
|
||||
|
||||
readlink: called by the readlink(2) system call. Only required if
|
||||
you want to support reading symbolic links
|
||||
|
||||
@@ -681,6 +698,12 @@ struct address_space_operations {
|
||||
but instead uses bmap to find out where the blocks in the file
|
||||
are and uses those addresses directly.
|
||||
|
||||
dentry_open: *WARNING: probably going away soon, do not use!* This is an
|
||||
alternative to f_op->open(), the difference is that this method may open
|
||||
a file not necessarily originating from the same filesystem as the one
|
||||
i_op->open() was called on. It may be useful for stacking filesystems
|
||||
which want to allow native I/O directly on underlying files.
|
||||
|
||||
|
||||
invalidatepage: If a page has PagePrivate set, then invalidatepage
|
||||
will be called when part or all of the page is to be removed
|
||||
|
||||
@@ -6482,6 +6482,13 @@ F: drivers/scsi/osd/
|
||||
F: include/scsi/osd_*
|
||||
F: fs/exofs/
|
||||
|
||||
OVERLAY FILESYSTEM
|
||||
M: Miklos Szeredi <miklos@szeredi.hu>
|
||||
L: linux-fsdevel@vger.kernel.org
|
||||
S: Supported
|
||||
F: fs/overlayfs/*
|
||||
F: Documentation/filesystems/overlayfs.txt
|
||||
|
||||
P54 WIRELESS DRIVER
|
||||
M: Christian Lamparter <chunkeey@googlemail.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 14
|
||||
SUBLEVEL = 36
|
||||
SUBLEVEL = 39
|
||||
EXTRAVERSION =
|
||||
NAME = Remembering Coco
|
||||
|
||||
|
||||
@@ -104,11 +104,12 @@ struct osf_dirent_callback {
|
||||
};
|
||||
|
||||
static int
|
||||
osf_filldir(void *__buf, const char *name, int namlen, loff_t offset,
|
||||
u64 ino, unsigned int d_type)
|
||||
osf_filldir(struct dir_context *ctx, const char *name, int namlen,
|
||||
loff_t offset, u64 ino, unsigned int d_type)
|
||||
{
|
||||
struct osf_dirent __user *dirent;
|
||||
struct osf_dirent_callback *buf = (struct osf_dirent_callback *) __buf;
|
||||
struct osf_dirent_callback *buf =
|
||||
container_of(ctx, struct osf_dirent_callback, ctx);
|
||||
unsigned int reclen = ALIGN(NAME_OFFSET + namlen + 1, sizeof(u32));
|
||||
unsigned int d_ino;
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ stash_usr_regs(struct rt_sigframe __user *sf, struct pt_regs *regs,
|
||||
sigset_t *set)
|
||||
{
|
||||
int err;
|
||||
err = __copy_to_user(&(sf->uc.uc_mcontext.regs), regs,
|
||||
err = __copy_to_user(&(sf->uc.uc_mcontext.regs.scratch), regs,
|
||||
sizeof(sf->uc.uc_mcontext.regs.scratch));
|
||||
err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(sigset_t));
|
||||
|
||||
@@ -83,7 +83,7 @@ static int restore_usr_regs(struct pt_regs *regs, struct rt_sigframe __user *sf)
|
||||
if (!err)
|
||||
set_current_blocked(&set);
|
||||
|
||||
err |= __copy_from_user(regs, &(sf->uc.uc_mcontext.regs),
|
||||
err |= __copy_from_user(regs, &(sf->uc.uc_mcontext.regs.scratch),
|
||||
sizeof(sf->uc.uc_mcontext.regs.scratch));
|
||||
|
||||
return err;
|
||||
|
||||
@@ -243,10 +243,18 @@
|
||||
ti,invert-autoidle-bit;
|
||||
};
|
||||
|
||||
dpll_core_byp_mux: dpll_core_byp_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>;
|
||||
ti,bit-shift = <23>;
|
||||
reg = <0x012c>;
|
||||
};
|
||||
|
||||
dpll_core_ck: dpll_core_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,omap4-dpll-core-clock";
|
||||
clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>;
|
||||
clocks = <&sys_clkin1>, <&dpll_core_byp_mux>;
|
||||
reg = <0x0120>, <0x0124>, <0x012c>, <0x0128>;
|
||||
};
|
||||
|
||||
@@ -309,10 +317,18 @@
|
||||
clock-div = <1>;
|
||||
};
|
||||
|
||||
dpll_dsp_byp_mux: dpll_dsp_byp_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&sys_clkin1>, <&dsp_dpll_hs_clk_div>;
|
||||
ti,bit-shift = <23>;
|
||||
reg = <0x0240>;
|
||||
};
|
||||
|
||||
dpll_dsp_ck: dpll_dsp_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,omap4-dpll-clock";
|
||||
clocks = <&sys_clkin1>, <&dsp_dpll_hs_clk_div>;
|
||||
clocks = <&sys_clkin1>, <&dpll_dsp_byp_mux>;
|
||||
reg = <0x0234>, <0x0238>, <0x0240>, <0x023c>;
|
||||
};
|
||||
|
||||
@@ -335,10 +351,18 @@
|
||||
clock-div = <1>;
|
||||
};
|
||||
|
||||
dpll_iva_byp_mux: dpll_iva_byp_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&sys_clkin1>, <&iva_dpll_hs_clk_div>;
|
||||
ti,bit-shift = <23>;
|
||||
reg = <0x01ac>;
|
||||
};
|
||||
|
||||
dpll_iva_ck: dpll_iva_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,omap4-dpll-clock";
|
||||
clocks = <&sys_clkin1>, <&iva_dpll_hs_clk_div>;
|
||||
clocks = <&sys_clkin1>, <&dpll_iva_byp_mux>;
|
||||
reg = <0x01a0>, <0x01a4>, <0x01ac>, <0x01a8>;
|
||||
};
|
||||
|
||||
@@ -361,10 +385,18 @@
|
||||
clock-div = <1>;
|
||||
};
|
||||
|
||||
dpll_gpu_byp_mux: dpll_gpu_byp_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>;
|
||||
ti,bit-shift = <23>;
|
||||
reg = <0x02e4>;
|
||||
};
|
||||
|
||||
dpll_gpu_ck: dpll_gpu_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,omap4-dpll-clock";
|
||||
clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>;
|
||||
clocks = <&sys_clkin1>, <&dpll_gpu_byp_mux>;
|
||||
reg = <0x02d8>, <0x02dc>, <0x02e4>, <0x02e0>;
|
||||
};
|
||||
|
||||
@@ -398,10 +430,18 @@
|
||||
clock-div = <1>;
|
||||
};
|
||||
|
||||
dpll_ddr_byp_mux: dpll_ddr_byp_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>;
|
||||
ti,bit-shift = <23>;
|
||||
reg = <0x021c>;
|
||||
};
|
||||
|
||||
dpll_ddr_ck: dpll_ddr_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,omap4-dpll-clock";
|
||||
clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>;
|
||||
clocks = <&sys_clkin1>, <&dpll_ddr_byp_mux>;
|
||||
reg = <0x0210>, <0x0214>, <0x021c>, <0x0218>;
|
||||
};
|
||||
|
||||
@@ -416,10 +456,18 @@
|
||||
ti,invert-autoidle-bit;
|
||||
};
|
||||
|
||||
dpll_gmac_byp_mux: dpll_gmac_byp_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>;
|
||||
ti,bit-shift = <23>;
|
||||
reg = <0x02b4>;
|
||||
};
|
||||
|
||||
dpll_gmac_ck: dpll_gmac_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,omap4-dpll-clock";
|
||||
clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>;
|
||||
clocks = <&sys_clkin1>, <&dpll_gmac_byp_mux>;
|
||||
reg = <0x02a8>, <0x02ac>, <0x02b4>, <0x02b0>;
|
||||
};
|
||||
|
||||
@@ -482,10 +530,18 @@
|
||||
clock-div = <1>;
|
||||
};
|
||||
|
||||
dpll_eve_byp_mux: dpll_eve_byp_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&sys_clkin1>, <&eve_dpll_hs_clk_div>;
|
||||
ti,bit-shift = <23>;
|
||||
reg = <0x0290>;
|
||||
};
|
||||
|
||||
dpll_eve_ck: dpll_eve_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,omap4-dpll-clock";
|
||||
clocks = <&sys_clkin1>, <&eve_dpll_hs_clk_div>;
|
||||
clocks = <&sys_clkin1>, <&dpll_eve_byp_mux>;
|
||||
reg = <0x0284>, <0x0288>, <0x0290>, <0x028c>;
|
||||
};
|
||||
|
||||
@@ -1214,10 +1270,18 @@
|
||||
clock-div = <1>;
|
||||
};
|
||||
|
||||
dpll_per_byp_mux: dpll_per_byp_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&sys_clkin1>, <&per_dpll_hs_clk_div>;
|
||||
ti,bit-shift = <23>;
|
||||
reg = <0x014c>;
|
||||
};
|
||||
|
||||
dpll_per_ck: dpll_per_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,omap4-dpll-clock";
|
||||
clocks = <&sys_clkin1>, <&per_dpll_hs_clk_div>;
|
||||
clocks = <&sys_clkin1>, <&dpll_per_byp_mux>;
|
||||
reg = <0x0140>, <0x0144>, <0x014c>, <0x0148>;
|
||||
};
|
||||
|
||||
@@ -1240,10 +1304,18 @@
|
||||
clock-div = <1>;
|
||||
};
|
||||
|
||||
dpll_usb_byp_mux: dpll_usb_byp_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&sys_clkin1>, <&usb_dpll_hs_clk_div>;
|
||||
ti,bit-shift = <23>;
|
||||
reg = <0x018c>;
|
||||
};
|
||||
|
||||
dpll_usb_ck: dpll_usb_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,omap4-dpll-j-type-clock";
|
||||
clocks = <&sys_clkin1>, <&usb_dpll_hs_clk_div>;
|
||||
clocks = <&sys_clkin1>, <&dpll_usb_byp_mux>;
|
||||
reg = <0x0180>, <0x0184>, <0x018c>, <0x0188>;
|
||||
};
|
||||
|
||||
|
||||
@@ -58,14 +58,18 @@
|
||||
# define VFP_ABI_FRAME 0
|
||||
# define BSAES_ASM_EXTENDED_KEY
|
||||
# define XTS_CHAIN_TWEAK
|
||||
# define __ARM_ARCH__ 7
|
||||
# define __ARM_ARCH__ __LINUX_ARM_ARCH__
|
||||
# define __ARM_MAX_ARCH__ 7
|
||||
#endif
|
||||
|
||||
#ifdef __thumb__
|
||||
# define adrl adr
|
||||
#endif
|
||||
|
||||
#if __ARM_ARCH__>=7
|
||||
#if __ARM_MAX_ARCH__>=7
|
||||
.arch armv7-a
|
||||
.fpu neon
|
||||
|
||||
.text
|
||||
.syntax unified @ ARMv7-capable assembler is expected to handle this
|
||||
#ifdef __thumb2__
|
||||
@@ -74,8 +78,6 @@
|
||||
.code 32
|
||||
#endif
|
||||
|
||||
.fpu neon
|
||||
|
||||
.type _bsaes_decrypt8,%function
|
||||
.align 4
|
||||
_bsaes_decrypt8:
|
||||
@@ -2095,9 +2097,11 @@ bsaes_xts_decrypt:
|
||||
vld1.8 {q8}, [r0] @ initial tweak
|
||||
adr r2, .Lxts_magic
|
||||
|
||||
#ifndef XTS_CHAIN_TWEAK
|
||||
tst r9, #0xf @ if not multiple of 16
|
||||
it ne @ Thumb2 thing, sanity check in ARM
|
||||
subne r9, #0x10 @ subtract another 16 bytes
|
||||
#endif
|
||||
subs r9, #0x80
|
||||
|
||||
blo .Lxts_dec_short
|
||||
|
||||
@@ -701,14 +701,18 @@ $code.=<<___;
|
||||
# define VFP_ABI_FRAME 0
|
||||
# define BSAES_ASM_EXTENDED_KEY
|
||||
# define XTS_CHAIN_TWEAK
|
||||
# define __ARM_ARCH__ 7
|
||||
# define __ARM_ARCH__ __LINUX_ARM_ARCH__
|
||||
# define __ARM_MAX_ARCH__ 7
|
||||
#endif
|
||||
|
||||
#ifdef __thumb__
|
||||
# define adrl adr
|
||||
#endif
|
||||
|
||||
#if __ARM_ARCH__>=7
|
||||
#if __ARM_MAX_ARCH__>=7
|
||||
.arch armv7-a
|
||||
.fpu neon
|
||||
|
||||
.text
|
||||
.syntax unified @ ARMv7-capable assembler is expected to handle this
|
||||
#ifdef __thumb2__
|
||||
@@ -717,8 +721,6 @@ $code.=<<___;
|
||||
.code 32
|
||||
#endif
|
||||
|
||||
.fpu neon
|
||||
|
||||
.type _bsaes_decrypt8,%function
|
||||
.align 4
|
||||
_bsaes_decrypt8:
|
||||
@@ -2076,9 +2078,11 @@ bsaes_xts_decrypt:
|
||||
vld1.8 {@XMM[8]}, [r0] @ initial tweak
|
||||
adr $magic, .Lxts_magic
|
||||
|
||||
#ifndef XTS_CHAIN_TWEAK
|
||||
tst $len, #0xf @ if not multiple of 16
|
||||
it ne @ Thumb2 thing, sanity check in ARM
|
||||
subne $len, #0x10 @ subtract another 16 bytes
|
||||
#endif
|
||||
subs $len, #0x80
|
||||
|
||||
blo .Lxts_dec_short
|
||||
|
||||
@@ -45,7 +45,7 @@ static inline void at91rm9200_standby(void)
|
||||
" mcr p15, 0, %0, c7, c0, 4\n\t"
|
||||
" str %5, [%1, %2]"
|
||||
:
|
||||
: "r" (0), "r" (AT91_BASE_SYS), "r" (AT91RM9200_SDRAMC_LPR),
|
||||
: "r" (0), "r" (at91_ramc_base[0]), "r" (AT91RM9200_SDRAMC_LPR),
|
||||
"r" (1), "r" (AT91RM9200_SDRAMC_SRR),
|
||||
"r" (lpr));
|
||||
}
|
||||
|
||||
@@ -151,6 +151,15 @@ switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
||||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
|
||||
/*
|
||||
* init_mm.pgd does not contain any user mappings and it is always
|
||||
* active for kernel addresses in TTBR1. Just set the reserved TTBR0.
|
||||
*/
|
||||
if (next == &init_mm) {
|
||||
cpu_set_reserved_ttbr0();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!cpumask_test_and_set_cpu(cpu, mm_cpumask(next)) || prev != next)
|
||||
check_and_switch_context(next, tsk);
|
||||
}
|
||||
|
||||
@@ -325,25 +325,6 @@ static void __init setup_machine_fdt(phys_addr_t dt_phys)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Limit the memory size that was specified via FDT.
|
||||
*/
|
||||
static int __init early_mem(char *p)
|
||||
{
|
||||
phys_addr_t limit;
|
||||
|
||||
if (!p)
|
||||
return 1;
|
||||
|
||||
limit = memparse(p, &p) & PAGE_MASK;
|
||||
pr_notice("Memory limited to %lldMB\n", limit >> 20);
|
||||
|
||||
memblock_enforce_memory_limit(limit);
|
||||
|
||||
return 0;
|
||||
}
|
||||
early_param("mem", early_mem);
|
||||
|
||||
static void __init request_standard_resources(void)
|
||||
{
|
||||
struct memblock_region *region;
|
||||
|
||||
@@ -106,6 +106,7 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size,
|
||||
flags |= GFP_DMA;
|
||||
if (IS_ENABLED(CONFIG_DMA_CMA) && (flags & __GFP_WAIT)) {
|
||||
struct page *page;
|
||||
void *addr;
|
||||
|
||||
size = PAGE_ALIGN(size);
|
||||
page = dma_alloc_from_contiguous(dev, size >> PAGE_SHIFT,
|
||||
@@ -114,7 +115,10 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size,
|
||||
return NULL;
|
||||
|
||||
*dma_handle = phys_to_dma(dev, page_to_phys(page));
|
||||
return page_address(page);
|
||||
addr = page_address(page);
|
||||
if (flags & __GFP_ZERO)
|
||||
memset(addr, 0, size);
|
||||
return addr;
|
||||
} else {
|
||||
return swiotlb_alloc_coherent(dev, size, dma_handle, flags);
|
||||
}
|
||||
|
||||
@@ -132,10 +132,29 @@ static void arm64_memory_present(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
static phys_addr_t memory_limit = (phys_addr_t)ULLONG_MAX;
|
||||
|
||||
/*
|
||||
* Limit the memory size that was specified via FDT.
|
||||
*/
|
||||
static int __init early_mem(char *p)
|
||||
{
|
||||
if (!p)
|
||||
return 1;
|
||||
|
||||
memory_limit = memparse(p, &p) & PAGE_MASK;
|
||||
pr_notice("Memory limited to %lldMB\n", memory_limit >> 20);
|
||||
|
||||
return 0;
|
||||
}
|
||||
early_param("mem", early_mem);
|
||||
|
||||
void __init arm64_memblock_init(void)
|
||||
{
|
||||
u64 *reserve_map, base, size;
|
||||
|
||||
memblock_enforce_memory_limit(memory_limit);
|
||||
|
||||
/*
|
||||
* Register the kernel text, kernel data, initrd, and initial
|
||||
* pagetables with memblock.
|
||||
|
||||
@@ -56,11 +56,12 @@ struct getdents_callback {
|
||||
|
||||
#define NAME_OFFSET(de) ((int) ((de)->d_name - (char __user *) (de)))
|
||||
|
||||
static int filldir(void * __buf, const char * name, int namlen, loff_t offset,
|
||||
u64 ino, unsigned d_type)
|
||||
static int filldir(struct dir_context *ctx, const char *name, int namlen,
|
||||
loff_t offset, u64 ino, unsigned d_type)
|
||||
{
|
||||
struct hpux_dirent __user * dirent;
|
||||
struct getdents_callback * buf = (struct getdents_callback *) __buf;
|
||||
struct getdents_callback *buf =
|
||||
container_of(ctx, struct getdents_callback, ctx);
|
||||
ino_t d_ino;
|
||||
int reclen = ALIGN(NAME_OFFSET(dirent) + namlen + 1, sizeof(long));
|
||||
|
||||
|
||||
@@ -50,6 +50,7 @@ ethernet@b0000 {
|
||||
fsl,num_tx_queues = <0x8>;
|
||||
fsl,magic-packet;
|
||||
local-mac-address = [ 00 00 00 00 00 00 ];
|
||||
ranges;
|
||||
|
||||
queue-group@b0000 {
|
||||
#address-cells = <1>;
|
||||
|
||||
@@ -50,6 +50,7 @@ ethernet@b1000 {
|
||||
fsl,num_tx_queues = <0x8>;
|
||||
fsl,magic-packet;
|
||||
local-mac-address = [ 00 00 00 00 00 00 ];
|
||||
ranges;
|
||||
|
||||
queue-group@b1000 {
|
||||
#address-cells = <1>;
|
||||
|
||||
@@ -49,6 +49,7 @@ ethernet@b2000 {
|
||||
fsl,num_tx_queues = <0x8>;
|
||||
fsl,magic-packet;
|
||||
local-mac-address = [ 00 00 00 00 00 00 ];
|
||||
ranges;
|
||||
|
||||
queue-group@b2000 {
|
||||
#address-cells = <1>;
|
||||
|
||||
@@ -1422,7 +1422,7 @@ machine_check_handle_early:
|
||||
bne 9f /* continue in V mode if we are. */
|
||||
|
||||
5:
|
||||
#ifdef CONFIG_KVM_BOOK3S_64_HV
|
||||
#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
|
||||
/*
|
||||
* We are coming from kernel context. Check if we are coming from
|
||||
* guest. if yes, then we can continue. We will fall through
|
||||
|
||||
@@ -24,10 +24,10 @@
|
||||
static struct kobject *mobility_kobj;
|
||||
|
||||
struct update_props_workarea {
|
||||
u32 phandle;
|
||||
u32 state;
|
||||
u64 reserved;
|
||||
u32 nprops;
|
||||
__be32 phandle;
|
||||
__be32 state;
|
||||
__be64 reserved;
|
||||
__be32 nprops;
|
||||
} __packed;
|
||||
|
||||
#define NODE_ACTION_MASK 0xff000000
|
||||
@@ -53,11 +53,11 @@ static int mobility_rtas_call(int token, char *buf, s32 scope)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int delete_dt_node(u32 phandle)
|
||||
static int delete_dt_node(__be32 phandle)
|
||||
{
|
||||
struct device_node *dn;
|
||||
|
||||
dn = of_find_node_by_phandle(phandle);
|
||||
dn = of_find_node_by_phandle(be32_to_cpu(phandle));
|
||||
if (!dn)
|
||||
return -ENOENT;
|
||||
|
||||
@@ -126,7 +126,7 @@ static int update_dt_property(struct device_node *dn, struct property **prop,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int update_dt_node(u32 phandle, s32 scope)
|
||||
static int update_dt_node(__be32 phandle, s32 scope)
|
||||
{
|
||||
struct update_props_workarea *upwa;
|
||||
struct device_node *dn;
|
||||
@@ -135,6 +135,7 @@ static int update_dt_node(u32 phandle, s32 scope)
|
||||
char *prop_data;
|
||||
char *rtas_buf;
|
||||
int update_properties_token;
|
||||
u32 nprops;
|
||||
u32 vd;
|
||||
|
||||
update_properties_token = rtas_token("ibm,update-properties");
|
||||
@@ -145,7 +146,7 @@ static int update_dt_node(u32 phandle, s32 scope)
|
||||
if (!rtas_buf)
|
||||
return -ENOMEM;
|
||||
|
||||
dn = of_find_node_by_phandle(phandle);
|
||||
dn = of_find_node_by_phandle(be32_to_cpu(phandle));
|
||||
if (!dn) {
|
||||
kfree(rtas_buf);
|
||||
return -ENOENT;
|
||||
@@ -161,6 +162,7 @@ static int update_dt_node(u32 phandle, s32 scope)
|
||||
break;
|
||||
|
||||
prop_data = rtas_buf + sizeof(*upwa);
|
||||
nprops = be32_to_cpu(upwa->nprops);
|
||||
|
||||
/* On the first call to ibm,update-properties for a node the
|
||||
* the first property value descriptor contains an empty
|
||||
@@ -169,17 +171,17 @@ static int update_dt_node(u32 phandle, s32 scope)
|
||||
*/
|
||||
if (*prop_data == 0) {
|
||||
prop_data++;
|
||||
vd = *(u32 *)prop_data;
|
||||
vd = be32_to_cpu(*(__be32 *)prop_data);
|
||||
prop_data += vd + sizeof(vd);
|
||||
upwa->nprops--;
|
||||
nprops--;
|
||||
}
|
||||
|
||||
for (i = 0; i < upwa->nprops; i++) {
|
||||
for (i = 0; i < nprops; i++) {
|
||||
char *prop_name;
|
||||
|
||||
prop_name = prop_data;
|
||||
prop_data += strlen(prop_name) + 1;
|
||||
vd = *(u32 *)prop_data;
|
||||
vd = be32_to_cpu(*(__be32 *)prop_data);
|
||||
prop_data += sizeof(vd);
|
||||
|
||||
switch (vd) {
|
||||
@@ -211,13 +213,13 @@ static int update_dt_node(u32 phandle, s32 scope)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int add_dt_node(u32 parent_phandle, u32 drc_index)
|
||||
static int add_dt_node(__be32 parent_phandle, __be32 drc_index)
|
||||
{
|
||||
struct device_node *dn;
|
||||
struct device_node *parent_dn;
|
||||
int rc;
|
||||
|
||||
parent_dn = of_find_node_by_phandle(parent_phandle);
|
||||
parent_dn = of_find_node_by_phandle(be32_to_cpu(parent_phandle));
|
||||
if (!parent_dn)
|
||||
return -ENOENT;
|
||||
|
||||
@@ -236,7 +238,7 @@ static int add_dt_node(u32 parent_phandle, u32 drc_index)
|
||||
int pseries_devicetree_update(s32 scope)
|
||||
{
|
||||
char *rtas_buf;
|
||||
u32 *data;
|
||||
__be32 *data;
|
||||
int update_nodes_token;
|
||||
int rc;
|
||||
|
||||
@@ -253,17 +255,17 @@ int pseries_devicetree_update(s32 scope)
|
||||
if (rc && rc != 1)
|
||||
break;
|
||||
|
||||
data = (u32 *)rtas_buf + 4;
|
||||
while (*data & NODE_ACTION_MASK) {
|
||||
data = (__be32 *)rtas_buf + 4;
|
||||
while (be32_to_cpu(*data) & NODE_ACTION_MASK) {
|
||||
int i;
|
||||
u32 action = *data & NODE_ACTION_MASK;
|
||||
int node_count = *data & NODE_COUNT_MASK;
|
||||
u32 action = be32_to_cpu(*data) & NODE_ACTION_MASK;
|
||||
u32 node_count = be32_to_cpu(*data) & NODE_COUNT_MASK;
|
||||
|
||||
data++;
|
||||
|
||||
for (i = 0; i < node_count; i++) {
|
||||
u32 phandle = *data++;
|
||||
u32 drc_index;
|
||||
__be32 phandle = *data++;
|
||||
__be32 drc_index;
|
||||
|
||||
switch (action) {
|
||||
case DELETE_DT_NODE:
|
||||
|
||||
@@ -960,6 +960,8 @@ out:
|
||||
cpuc->pcr[0] |= cpuc->event[0]->hw.config_base;
|
||||
}
|
||||
|
||||
static void sparc_pmu_start(struct perf_event *event, int flags);
|
||||
|
||||
/* On this PMU each PIC has it's own PCR control register. */
|
||||
static void calculate_multiple_pcrs(struct cpu_hw_events *cpuc)
|
||||
{
|
||||
@@ -972,20 +974,13 @@ static void calculate_multiple_pcrs(struct cpu_hw_events *cpuc)
|
||||
struct perf_event *cp = cpuc->event[i];
|
||||
struct hw_perf_event *hwc = &cp->hw;
|
||||
int idx = hwc->idx;
|
||||
u64 enc;
|
||||
|
||||
if (cpuc->current_idx[i] != PIC_NO_INDEX)
|
||||
continue;
|
||||
|
||||
sparc_perf_event_set_period(cp, hwc, idx);
|
||||
cpuc->current_idx[i] = idx;
|
||||
|
||||
enc = perf_event_get_enc(cpuc->events[i]);
|
||||
cpuc->pcr[idx] &= ~mask_for_index(idx);
|
||||
if (hwc->state & PERF_HES_STOPPED)
|
||||
cpuc->pcr[idx] |= nop_for_index(idx);
|
||||
else
|
||||
cpuc->pcr[idx] |= event_encoding(enc, idx);
|
||||
sparc_pmu_start(cp, PERF_EF_RELOAD);
|
||||
}
|
||||
out:
|
||||
for (i = 0; i < cpuc->n_events; i++) {
|
||||
@@ -1101,7 +1096,6 @@ static void sparc_pmu_del(struct perf_event *event, int _flags)
|
||||
int i;
|
||||
|
||||
local_irq_save(flags);
|
||||
perf_pmu_disable(event->pmu);
|
||||
|
||||
for (i = 0; i < cpuc->n_events; i++) {
|
||||
if (event == cpuc->event[i]) {
|
||||
@@ -1127,7 +1121,6 @@ static void sparc_pmu_del(struct perf_event *event, int _flags)
|
||||
}
|
||||
}
|
||||
|
||||
perf_pmu_enable(event->pmu);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
@@ -1361,7 +1354,6 @@ static int sparc_pmu_add(struct perf_event *event, int ef_flags)
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
perf_pmu_disable(event->pmu);
|
||||
|
||||
n0 = cpuc->n_events;
|
||||
if (n0 >= sparc_pmu->max_hw_events)
|
||||
@@ -1394,7 +1386,6 @@ nocheck:
|
||||
|
||||
ret = 0;
|
||||
out:
|
||||
perf_pmu_enable(event->pmu);
|
||||
local_irq_restore(flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -281,6 +281,8 @@ void arch_trigger_all_cpu_backtrace(void)
|
||||
printk(" TPC[%lx] O7[%lx] I7[%lx] RPC[%lx]\n",
|
||||
gp->tpc, gp->o7, gp->i7, gp->rpc);
|
||||
}
|
||||
|
||||
touch_nmi_watchdog();
|
||||
}
|
||||
|
||||
memset(global_cpu_snapshot, 0, sizeof(global_cpu_snapshot));
|
||||
@@ -356,6 +358,8 @@ static void pmu_snapshot_all_cpus(void)
|
||||
(cpu == this_cpu ? '*' : ' '), cpu,
|
||||
pp->pcr[0], pp->pcr[1], pp->pcr[2], pp->pcr[3],
|
||||
pp->pic[0], pp->pic[1], pp->pic[2], pp->pic[3]);
|
||||
|
||||
touch_nmi_watchdog();
|
||||
}
|
||||
|
||||
memset(global_cpu_snapshot, 0, sizeof(global_cpu_snapshot));
|
||||
|
||||
@@ -332,7 +332,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second
|
||||
long err;
|
||||
|
||||
/* No need for backward compatibility. We can start fresh... */
|
||||
if (call <= SEMCTL) {
|
||||
if (call <= SEMTIMEDOP) {
|
||||
switch (call) {
|
||||
case SEMOP:
|
||||
err = sys_semtimedop(first, ptr,
|
||||
|
||||
@@ -8,9 +8,11 @@
|
||||
|
||||
.text
|
||||
ENTRY(memmove) /* o0=dst o1=src o2=len */
|
||||
mov %o0, %g1
|
||||
brz,pn %o2, 99f
|
||||
mov %o0, %g1
|
||||
|
||||
cmp %o0, %o1
|
||||
bleu,pt %xcc, memcpy
|
||||
bleu,pt %xcc, 2f
|
||||
add %o1, %o2, %g7
|
||||
cmp %g7, %o0
|
||||
bleu,pt %xcc, memcpy
|
||||
@@ -24,7 +26,34 @@ ENTRY(memmove) /* o0=dst o1=src o2=len */
|
||||
stb %g7, [%o0]
|
||||
bne,pt %icc, 1b
|
||||
sub %o0, 1, %o0
|
||||
|
||||
99:
|
||||
retl
|
||||
mov %g1, %o0
|
||||
|
||||
/* We can't just call memcpy for these memmove cases. On some
|
||||
* chips the memcpy uses cache initializing stores and when dst
|
||||
* and src are close enough, those can clobber the source data
|
||||
* before we've loaded it in.
|
||||
*/
|
||||
2: or %o0, %o1, %g7
|
||||
or %o2, %g7, %g7
|
||||
andcc %g7, 0x7, %g0
|
||||
bne,pn %xcc, 4f
|
||||
nop
|
||||
|
||||
3: ldx [%o1], %g7
|
||||
add %o1, 8, %o1
|
||||
subcc %o2, 8, %o2
|
||||
add %o0, 8, %o0
|
||||
bne,pt %icc, 3b
|
||||
stx %g7, [%o0 - 0x8]
|
||||
ba,a,pt %xcc, 99b
|
||||
|
||||
4: ldub [%o1], %g7
|
||||
add %o1, 1, %o1
|
||||
subcc %o2, 1, %o2
|
||||
add %o0, 1, %o0
|
||||
bne,pt %icc, 4b
|
||||
stb %g7, [%o0 - 0x1]
|
||||
ba,a,pt %xcc, 99b
|
||||
ENDPROC(memmove)
|
||||
|
||||
@@ -460,10 +460,12 @@ static void __init sparc_context_init(int numctx)
|
||||
void switch_mm(struct mm_struct *old_mm, struct mm_struct *mm,
|
||||
struct task_struct *tsk)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (mm->context == NO_CONTEXT) {
|
||||
spin_lock(&srmmu_context_spinlock);
|
||||
spin_lock_irqsave(&srmmu_context_spinlock, flags);
|
||||
alloc_context(old_mm, mm);
|
||||
spin_unlock(&srmmu_context_spinlock);
|
||||
spin_unlock_irqrestore(&srmmu_context_spinlock, flags);
|
||||
srmmu_ctxd_set(&srmmu_context_table[mm->context], mm->pgd);
|
||||
}
|
||||
|
||||
@@ -988,14 +990,15 @@ int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
|
||||
|
||||
void destroy_context(struct mm_struct *mm)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (mm->context != NO_CONTEXT) {
|
||||
flush_cache_mm(mm);
|
||||
srmmu_ctxd_set(&srmmu_context_table[mm->context], srmmu_swapper_pg_dir);
|
||||
flush_tlb_mm(mm);
|
||||
spin_lock(&srmmu_context_spinlock);
|
||||
spin_lock_irqsave(&srmmu_context_spinlock, flags);
|
||||
free_context(mm->context);
|
||||
spin_unlock(&srmmu_context_spinlock);
|
||||
spin_unlock_irqrestore(&srmmu_context_spinlock, flags);
|
||||
mm->context = NO_CONTEXT;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1109,7 +1109,7 @@ static int __driver_rfc4106_decrypt(struct aead_request *req)
|
||||
src = kmalloc(req->cryptlen + req->assoclen, GFP_ATOMIC);
|
||||
if (!src)
|
||||
return -ENOMEM;
|
||||
assoc = (src + req->cryptlen + auth_tag_len);
|
||||
assoc = (src + req->cryptlen);
|
||||
scatterwalk_map_and_copy(src, req->src, 0, req->cryptlen, 0);
|
||||
scatterwalk_map_and_copy(assoc, req->assoc, 0,
|
||||
req->assoclen, 0);
|
||||
@@ -1134,7 +1134,7 @@ static int __driver_rfc4106_decrypt(struct aead_request *req)
|
||||
scatterwalk_done(&src_sg_walk, 0, 0);
|
||||
scatterwalk_done(&assoc_sg_walk, 0, 0);
|
||||
} else {
|
||||
scatterwalk_map_and_copy(dst, req->dst, 0, req->cryptlen, 1);
|
||||
scatterwalk_map_and_copy(dst, req->dst, 0, tempCipherLen, 1);
|
||||
kfree(src);
|
||||
}
|
||||
return retval;
|
||||
|
||||
@@ -368,7 +368,7 @@ static inline void drop_fpu(struct task_struct *tsk)
|
||||
preempt_disable();
|
||||
tsk->thread.fpu_counter = 0;
|
||||
__drop_fpu(tsk);
|
||||
clear_used_math();
|
||||
clear_stopped_child_used_math(tsk);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
|
||||
@@ -181,6 +181,16 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
||||
},
|
||||
},
|
||||
|
||||
/* ASRock */
|
||||
{ /* Handle problems with rebooting on ASRock Q1900DC-ITX */
|
||||
.callback = set_pci_reboot,
|
||||
.ident = "ASRock Q1900DC-ITX",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "ASRock"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "Q1900DC-ITX"),
|
||||
},
|
||||
},
|
||||
|
||||
/* ASUS */
|
||||
{ /* Handle problems with rebooting on ASUS P4S800 */
|
||||
.callback = set_bios_reboot,
|
||||
|
||||
@@ -375,7 +375,7 @@ int __restore_xstate_sig(void __user *buf, void __user *buf_fx, int size)
|
||||
* thread's fpu state, reconstruct fxstate from the fsave
|
||||
* header. Sanitize the copied state etc.
|
||||
*/
|
||||
struct xsave_struct *xsave = &tsk->thread.fpu.state->xsave;
|
||||
struct fpu *fpu = &tsk->thread.fpu;
|
||||
struct user_i387_ia32_struct env;
|
||||
int err = 0;
|
||||
|
||||
@@ -389,14 +389,15 @@ int __restore_xstate_sig(void __user *buf, void __user *buf_fx, int size)
|
||||
*/
|
||||
drop_fpu(tsk);
|
||||
|
||||
if (__copy_from_user(xsave, buf_fx, state_size) ||
|
||||
if (__copy_from_user(&fpu->state->xsave, buf_fx, state_size) ||
|
||||
__copy_from_user(&env, buf, sizeof(env))) {
|
||||
fpu_finit(fpu);
|
||||
err = -1;
|
||||
} else {
|
||||
sanitize_restored_xstate(tsk, &env, xstate_bv, fx_only);
|
||||
set_used_math();
|
||||
}
|
||||
|
||||
set_used_math();
|
||||
if (use_eager_fpu()) {
|
||||
preempt_disable();
|
||||
math_state_restore();
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
.text
|
||||
.globl __kernel_sigreturn
|
||||
.type __kernel_sigreturn,@function
|
||||
nop /* this guy is needed for .LSTARTFDEDLSI1 below (watch for HACK) */
|
||||
ALIGN
|
||||
__kernel_sigreturn:
|
||||
.LSTART_sigreturn:
|
||||
|
||||
@@ -962,7 +962,7 @@ static int acpi_processor_setup_cpuidle_states(struct acpi_processor *pr)
|
||||
return -EINVAL;
|
||||
|
||||
drv->safe_state_index = -1;
|
||||
for (i = 0; i < CPUIDLE_STATE_MAX; i++) {
|
||||
for (i = CPUIDLE_DRIVER_STATE_START; i < CPUIDLE_STATE_MAX; i++) {
|
||||
drv->states[i].name[0] = '\0';
|
||||
drv->states[i].desc[0] = '\0';
|
||||
}
|
||||
|
||||
@@ -313,7 +313,7 @@ static int regcache_rbtree_insert_to_block(struct regmap *map,
|
||||
if (pos == 0) {
|
||||
memmove(blk + offset * map->cache_word_size,
|
||||
blk, rbnode->blklen * map->cache_word_size);
|
||||
bitmap_shift_right(present, present, offset, blklen);
|
||||
bitmap_shift_left(present, present, offset, blklen);
|
||||
}
|
||||
|
||||
/* update the rbnode block, its size and the base register */
|
||||
|
||||
@@ -814,10 +814,6 @@ static int __init nbd_init(void)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
nbd_dev = kcalloc(nbds_max, sizeof(*nbd_dev), GFP_KERNEL);
|
||||
if (!nbd_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
part_shift = 0;
|
||||
if (max_part > 0) {
|
||||
part_shift = fls(max_part);
|
||||
@@ -839,6 +835,10 @@ static int __init nbd_init(void)
|
||||
if (nbds_max > 1UL << (MINORBITS - part_shift))
|
||||
return -EINVAL;
|
||||
|
||||
nbd_dev = kcalloc(nbds_max, sizeof(*nbd_dev), GFP_KERNEL);
|
||||
if (!nbd_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < nbds_max; i++) {
|
||||
struct gendisk *disk = alloc_disk(1 << part_shift);
|
||||
if (!disk)
|
||||
|
||||
@@ -124,7 +124,7 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
|
||||
{
|
||||
struct ibmvtpm_dev *ibmvtpm;
|
||||
struct ibmvtpm_crq crq;
|
||||
u64 *word = (u64 *) &crq;
|
||||
__be64 *word = (__be64 *)&crq;
|
||||
int rc;
|
||||
|
||||
ibmvtpm = (struct ibmvtpm_dev *)TPM_VPRIV(chip);
|
||||
@@ -145,11 +145,11 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
|
||||
memcpy((void *)ibmvtpm->rtce_buf, (void *)buf, count);
|
||||
crq.valid = (u8)IBMVTPM_VALID_CMD;
|
||||
crq.msg = (u8)VTPM_TPM_COMMAND;
|
||||
crq.len = (u16)count;
|
||||
crq.data = ibmvtpm->rtce_dma_handle;
|
||||
crq.len = cpu_to_be16(count);
|
||||
crq.data = cpu_to_be32(ibmvtpm->rtce_dma_handle);
|
||||
|
||||
rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(word[0]),
|
||||
cpu_to_be64(word[1]));
|
||||
rc = ibmvtpm_send_crq(ibmvtpm->vdev, be64_to_cpu(word[0]),
|
||||
be64_to_cpu(word[1]));
|
||||
if (rc != H_SUCCESS) {
|
||||
dev_err(ibmvtpm->dev, "tpm_ibmvtpm_send failed rc=%d\n", rc);
|
||||
rc = 0;
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
struct ibmvtpm_crq {
|
||||
u8 valid;
|
||||
u8 msg;
|
||||
u16 len;
|
||||
u32 data;
|
||||
u64 reserved;
|
||||
__be16 len;
|
||||
__be32 data;
|
||||
__be64 reserved;
|
||||
} __attribute__((packed, aligned(8)));
|
||||
|
||||
struct ibmvtpm_crq_queue {
|
||||
|
||||
@@ -142,6 +142,7 @@ struct ports_device {
|
||||
* notification
|
||||
*/
|
||||
struct work_struct control_work;
|
||||
struct work_struct config_work;
|
||||
|
||||
struct list_head ports;
|
||||
|
||||
@@ -1832,10 +1833,21 @@ static void config_intr(struct virtio_device *vdev)
|
||||
|
||||
portdev = vdev->priv;
|
||||
|
||||
if (!use_multiport(portdev))
|
||||
schedule_work(&portdev->config_work);
|
||||
}
|
||||
|
||||
static void config_work_handler(struct work_struct *work)
|
||||
{
|
||||
struct ports_device *portdev;
|
||||
|
||||
portdev = container_of(work, struct ports_device, control_work);
|
||||
if (!use_multiport(portdev)) {
|
||||
struct virtio_device *vdev;
|
||||
struct port *port;
|
||||
u16 rows, cols;
|
||||
|
||||
vdev = portdev->vdev;
|
||||
virtio_cread(vdev, struct virtio_console_config, cols, &cols);
|
||||
virtio_cread(vdev, struct virtio_console_config, rows, &rows);
|
||||
|
||||
@@ -2024,12 +2036,14 @@ static int virtcons_probe(struct virtio_device *vdev)
|
||||
spin_lock_init(&portdev->ports_lock);
|
||||
INIT_LIST_HEAD(&portdev->ports);
|
||||
|
||||
INIT_WORK(&portdev->config_work, &config_work_handler);
|
||||
INIT_WORK(&portdev->control_work, &control_work_handler);
|
||||
|
||||
if (multiport) {
|
||||
unsigned int nr_added_bufs;
|
||||
|
||||
spin_lock_init(&portdev->c_ivq_lock);
|
||||
spin_lock_init(&portdev->c_ovq_lock);
|
||||
INIT_WORK(&portdev->control_work, &control_work_handler);
|
||||
|
||||
nr_added_bufs = fill_queue(portdev->c_ivq,
|
||||
&portdev->c_ivq_lock);
|
||||
@@ -2097,6 +2111,8 @@ static void virtcons_remove(struct virtio_device *vdev)
|
||||
/* Finish up work that's lined up */
|
||||
if (use_multiport(portdev))
|
||||
cancel_work_sync(&portdev->control_work);
|
||||
else
|
||||
cancel_work_sync(&portdev->config_work);
|
||||
|
||||
list_for_each_entry_safe(port, port2, &portdev->ports, list)
|
||||
unplug_port(port);
|
||||
@@ -2148,6 +2164,7 @@ static int virtcons_freeze(struct virtio_device *vdev)
|
||||
|
||||
virtqueue_disable_cb(portdev->c_ivq);
|
||||
cancel_work_sync(&portdev->control_work);
|
||||
cancel_work_sync(&portdev->config_work);
|
||||
/*
|
||||
* Once more: if control_work_handler() was running, it would
|
||||
* enable the cb as the last step.
|
||||
|
||||
@@ -225,12 +225,12 @@ static int __init efm32_clockevent_init(struct device_node *np)
|
||||
clock_event_ddata.base = base;
|
||||
clock_event_ddata.periodic_top = DIV_ROUND_CLOSEST(rate, 1024 * HZ);
|
||||
|
||||
setup_irq(irq, &efm32_clock_event_irq);
|
||||
|
||||
clockevents_config_and_register(&clock_event_ddata.evtdev,
|
||||
DIV_ROUND_CLOSEST(rate, 1024),
|
||||
0xf, 0xffff);
|
||||
|
||||
setup_irq(irq, &efm32_clock_event_irq);
|
||||
|
||||
return 0;
|
||||
|
||||
err_get_irq:
|
||||
|
||||
@@ -172,10 +172,6 @@ static void __init sun5i_timer_init(struct device_node *node)
|
||||
|
||||
ticks_per_jiffy = DIV_ROUND_UP(rate, HZ);
|
||||
|
||||
ret = setup_irq(irq, &sun5i_timer_irq);
|
||||
if (ret)
|
||||
pr_warn("failed to setup irq %d\n", irq);
|
||||
|
||||
/* Enable timer0 interrupt */
|
||||
val = readl(timer_base + TIMER_IRQ_EN_REG);
|
||||
writel(val | TIMER_IRQ_EN(0), timer_base + TIMER_IRQ_EN_REG);
|
||||
@@ -185,6 +181,10 @@ static void __init sun5i_timer_init(struct device_node *node)
|
||||
|
||||
clockevents_config_and_register(&sun5i_clockevent, rate,
|
||||
TIMER_SYNC_TICKS, 0xffffffff);
|
||||
|
||||
ret = setup_irq(irq, &sun5i_timer_irq);
|
||||
if (ret)
|
||||
pr_warn("failed to setup irq %d\n", irq);
|
||||
}
|
||||
CLOCKSOURCE_OF_DECLARE(sun5i_a13, "allwinner,sun5i-a13-hstimer",
|
||||
sun5i_timer_init);
|
||||
|
||||
@@ -252,9 +252,6 @@ int cpuidle_enable_device(struct cpuidle_device *dev)
|
||||
if (!dev->registered)
|
||||
return -EINVAL;
|
||||
|
||||
if (!dev->state_count)
|
||||
dev->state_count = drv->state_count;
|
||||
|
||||
ret = cpuidle_add_device_sysfs(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -398,7 +398,7 @@ static int cpuidle_add_state_sysfs(struct cpuidle_device *device)
|
||||
struct cpuidle_driver *drv = cpuidle_get_cpu_driver(device);
|
||||
|
||||
/* state statistics */
|
||||
for (i = 0; i < device->state_count; i++) {
|
||||
for (i = 0; i < drv->state_count; i++) {
|
||||
kobj = kzalloc(sizeof(struct cpuidle_state_kobj), GFP_KERNEL);
|
||||
if (!kobj)
|
||||
goto error_state;
|
||||
@@ -430,9 +430,10 @@ error_state:
|
||||
*/
|
||||
static void cpuidle_remove_state_sysfs(struct cpuidle_device *device)
|
||||
{
|
||||
struct cpuidle_driver *drv = cpuidle_get_cpu_driver(device);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < device->state_count; i++)
|
||||
for (i = 0; i < drv->state_count; i++)
|
||||
cpuidle_free_state_kobj(device, i);
|
||||
}
|
||||
|
||||
|
||||
@@ -48,6 +48,8 @@ static bool dw_dma_of_filter(struct dma_chan *chan, void *param)
|
||||
return true;
|
||||
}
|
||||
|
||||
#define DRV_NAME "dw_dmac"
|
||||
|
||||
static struct dma_chan *dw_dma_of_xlate(struct of_phandle_args *dma_spec,
|
||||
struct of_dma *ofdma)
|
||||
{
|
||||
@@ -293,7 +295,7 @@ static struct platform_driver dw_driver = {
|
||||
.remove = dw_remove,
|
||||
.shutdown = dw_shutdown,
|
||||
.driver = {
|
||||
.name = "dw_dmac",
|
||||
.name = DRV_NAME,
|
||||
.pm = &dw_dev_pm_ops,
|
||||
.of_match_table = of_match_ptr(dw_dma_of_id_table),
|
||||
.acpi_match_table = ACPI_PTR(dw_dma_acpi_id_table),
|
||||
@@ -314,3 +316,4 @@ module_exit(dw_exit);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DESCRIPTION("Synopsys DesignWare DMA Controller platform driver");
|
||||
MODULE_ALIAS("platform:" DRV_NAME);
|
||||
|
||||
@@ -487,6 +487,7 @@ static int omap_dma_terminate_all(struct omap_chan *c)
|
||||
* c->desc is NULL and exit.)
|
||||
*/
|
||||
if (c->desc) {
|
||||
omap_dma_desc_free(&c->desc->vd);
|
||||
c->desc = NULL;
|
||||
/* Avoid stopping the dma twice */
|
||||
if (!c->paused)
|
||||
|
||||
@@ -1306,6 +1306,9 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
(x << 16) | y);
|
||||
viewport_w = crtc->mode.hdisplay;
|
||||
viewport_h = (crtc->mode.vdisplay + 1) & ~1;
|
||||
if ((rdev->family >= CHIP_BONAIRE) &&
|
||||
(crtc->mode.flags & DRM_MODE_FLAG_INTERLACE))
|
||||
viewport_h *= 2;
|
||||
WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
|
||||
(viewport_w << 16) | viewport_h);
|
||||
|
||||
|
||||
@@ -7069,6 +7069,9 @@ int cik_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;
|
||||
}
|
||||
|
||||
|
||||
@@ -4596,6 +4596,9 @@ int evergreen_irq_set(struct radeon_device *rdev)
|
||||
WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, afmt5);
|
||||
WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, afmt6);
|
||||
|
||||
/* posting read */
|
||||
RREG32(SRBM_STATUS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -742,6 +742,10 @@ int r100_irq_set(struct radeon_device *rdev)
|
||||
tmp |= RADEON_FP2_DETECT_MASK;
|
||||
}
|
||||
WREG32(RADEON_GEN_INT_CNTL, tmp);
|
||||
|
||||
/* read back to post the write */
|
||||
RREG32(RADEON_GEN_INT_CNTL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -3647,6 +3647,9 @@ int r600_irq_set(struct radeon_device *rdev)
|
||||
WREG32(RV770_CG_THERMAL_INT, thermal_int);
|
||||
}
|
||||
|
||||
/* posting read */
|
||||
RREG32(R_000E50_SRBM_STATUS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ static bool igp_read_bios_from_vram(struct radeon_device *rdev)
|
||||
|
||||
static bool radeon_read_bios(struct radeon_device *rdev)
|
||||
{
|
||||
uint8_t __iomem *bios;
|
||||
uint8_t __iomem *bios, val1, val2;
|
||||
size_t size;
|
||||
|
||||
rdev->bios = NULL;
|
||||
@@ -86,15 +86,19 @@ static bool radeon_read_bios(struct radeon_device *rdev)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (size == 0 || bios[0] != 0x55 || bios[1] != 0xaa) {
|
||||
val1 = readb(&bios[0]);
|
||||
val2 = readb(&bios[1]);
|
||||
|
||||
if (size == 0 || val1 != 0x55 || val2 != 0xaa) {
|
||||
pci_unmap_rom(rdev->pdev, bios);
|
||||
return false;
|
||||
}
|
||||
rdev->bios = kmemdup(bios, size, GFP_KERNEL);
|
||||
rdev->bios = kzalloc(size, GFP_KERNEL);
|
||||
if (rdev->bios == NULL) {
|
||||
pci_unmap_rom(rdev->pdev, bios);
|
||||
return false;
|
||||
}
|
||||
memcpy_fromio(rdev->bios, bios, size);
|
||||
pci_unmap_rom(rdev->pdev, bios);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -179,11 +179,13 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
|
||||
u32 ring = RADEON_CS_RING_GFX;
|
||||
s32 priority = 0;
|
||||
|
||||
INIT_LIST_HEAD(&p->validated);
|
||||
|
||||
if (!cs->num_chunks) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* get chunks */
|
||||
INIT_LIST_HEAD(&p->validated);
|
||||
p->idx = 0;
|
||||
p->ib.sa_bo = NULL;
|
||||
p->ib.semaphore = NULL;
|
||||
|
||||
@@ -700,6 +700,10 @@ int rs600_irq_set(struct radeon_device *rdev)
|
||||
WREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL, hpd2);
|
||||
if (ASIC_IS_DCE2(rdev))
|
||||
WREG32(R_007408_HDMI0_AUDIO_PACKET_CONTROL, hdmi0);
|
||||
|
||||
/* posting read */
|
||||
RREG32(R_000040_GEN_INT_CNTL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -5958,6 +5958,9 @@ int si_irq_set(struct radeon_device *rdev)
|
||||
|
||||
WREG32(CG_THERMAL_INT, thermal_int);
|
||||
|
||||
/* posting read */
|
||||
RREG32(SRBM_STATUS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -6875,8 +6878,7 @@ int si_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
|
||||
WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
|
||||
|
||||
if (!vclk || !dclk) {
|
||||
/* keep the Bypass mode, put PLL to sleep */
|
||||
WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
|
||||
/* keep the Bypass mode */
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -6892,8 +6894,7 @@ int si_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
|
||||
/* set VCO_MODE to 1 */
|
||||
WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK);
|
||||
|
||||
/* toggle UPLL_SLEEP to 1 then back to 0 */
|
||||
WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
|
||||
/* disable sleep mode */
|
||||
WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK);
|
||||
|
||||
/* deassert UPLL_RESET */
|
||||
|
||||
@@ -733,32 +733,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
|
||||
goto out_err1;
|
||||
}
|
||||
|
||||
ret = ttm_bo_init_mm(&dev_priv->bdev, TTM_PL_VRAM,
|
||||
(dev_priv->vram_size >> PAGE_SHIFT));
|
||||
if (unlikely(ret != 0)) {
|
||||
DRM_ERROR("Failed initializing memory manager for VRAM.\n");
|
||||
goto out_err2;
|
||||
}
|
||||
|
||||
dev_priv->has_gmr = true;
|
||||
if (((dev_priv->capabilities & (SVGA_CAP_GMR | SVGA_CAP_GMR2)) == 0) ||
|
||||
refuse_dma || ttm_bo_init_mm(&dev_priv->bdev, VMW_PL_GMR,
|
||||
VMW_PL_GMR) != 0) {
|
||||
DRM_INFO("No GMR memory available. "
|
||||
"Graphics memory resources are very limited.\n");
|
||||
dev_priv->has_gmr = false;
|
||||
}
|
||||
|
||||
if (dev_priv->capabilities & SVGA_CAP_GBOBJECTS) {
|
||||
dev_priv->has_mob = true;
|
||||
if (ttm_bo_init_mm(&dev_priv->bdev, VMW_PL_MOB,
|
||||
VMW_PL_MOB) != 0) {
|
||||
DRM_INFO("No MOB memory available. "
|
||||
"3D will be disabled.\n");
|
||||
dev_priv->has_mob = false;
|
||||
}
|
||||
}
|
||||
|
||||
dev_priv->mmio_mtrr = arch_phys_wc_add(dev_priv->mmio_start,
|
||||
dev_priv->mmio_size);
|
||||
|
||||
@@ -821,6 +795,33 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
|
||||
goto out_no_fman;
|
||||
}
|
||||
|
||||
|
||||
ret = ttm_bo_init_mm(&dev_priv->bdev, TTM_PL_VRAM,
|
||||
(dev_priv->vram_size >> PAGE_SHIFT));
|
||||
if (unlikely(ret != 0)) {
|
||||
DRM_ERROR("Failed initializing memory manager for VRAM.\n");
|
||||
goto out_no_vram;
|
||||
}
|
||||
|
||||
dev_priv->has_gmr = true;
|
||||
if (((dev_priv->capabilities & (SVGA_CAP_GMR | SVGA_CAP_GMR2)) == 0) ||
|
||||
refuse_dma || ttm_bo_init_mm(&dev_priv->bdev, VMW_PL_GMR,
|
||||
VMW_PL_GMR) != 0) {
|
||||
DRM_INFO("No GMR memory available. "
|
||||
"Graphics memory resources are very limited.\n");
|
||||
dev_priv->has_gmr = false;
|
||||
}
|
||||
|
||||
if (dev_priv->capabilities & SVGA_CAP_GBOBJECTS) {
|
||||
dev_priv->has_mob = true;
|
||||
if (ttm_bo_init_mm(&dev_priv->bdev, VMW_PL_MOB,
|
||||
VMW_PL_MOB) != 0) {
|
||||
DRM_INFO("No MOB memory available. "
|
||||
"3D will be disabled.\n");
|
||||
dev_priv->has_mob = false;
|
||||
}
|
||||
}
|
||||
|
||||
vmw_kms_save_vga(dev_priv);
|
||||
|
||||
/* Start kms and overlay systems, needs fifo. */
|
||||
@@ -846,6 +847,12 @@ out_no_fifo:
|
||||
vmw_kms_close(dev_priv);
|
||||
out_no_kms:
|
||||
vmw_kms_restore_vga(dev_priv);
|
||||
if (dev_priv->has_mob)
|
||||
(void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_MOB);
|
||||
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:
|
||||
vmw_fence_manager_takedown(dev_priv->fman);
|
||||
out_no_fman:
|
||||
if (dev_priv->capabilities & SVGA_CAP_IRQMASK)
|
||||
@@ -861,12 +868,6 @@ out_err4:
|
||||
iounmap(dev_priv->mmio_virt);
|
||||
out_err3:
|
||||
arch_phys_wc_del(dev_priv->mmio_mtrr);
|
||||
if (dev_priv->has_mob)
|
||||
(void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_MOB);
|
||||
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_err2:
|
||||
(void)ttm_bo_device_release(&dev_priv->bdev);
|
||||
out_err1:
|
||||
vmw_ttm_global_release(dev_priv);
|
||||
@@ -896,6 +897,13 @@ static int vmw_driver_unload(struct drm_device *dev)
|
||||
}
|
||||
vmw_kms_close(dev_priv);
|
||||
vmw_overlay_close(dev_priv);
|
||||
|
||||
if (dev_priv->has_mob)
|
||||
(void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_MOB);
|
||||
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);
|
||||
|
||||
vmw_fence_manager_takedown(dev_priv->fman);
|
||||
if (dev_priv->capabilities & SVGA_CAP_IRQMASK)
|
||||
drm_irq_uninstall(dev_priv->dev);
|
||||
@@ -907,11 +915,6 @@ static int vmw_driver_unload(struct drm_device *dev)
|
||||
ttm_object_device_release(&dev_priv->tdev);
|
||||
iounmap(dev_priv->mmio_virt);
|
||||
arch_phys_wc_del(dev_priv->mmio_mtrr);
|
||||
if (dev_priv->has_mob)
|
||||
(void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_MOB);
|
||||
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);
|
||||
(void)ttm_bo_device_release(&dev_priv->bdev);
|
||||
vmw_ttm_global_release(dev_priv);
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)
|
||||
iio_trigger_set_drvdata(adis->trig, adis);
|
||||
ret = iio_trigger_register(adis->trig);
|
||||
|
||||
indio_dev->trig = adis->trig;
|
||||
indio_dev->trig = iio_trigger_get(adis->trig);
|
||||
if (ret)
|
||||
goto error_free_irq;
|
||||
|
||||
|
||||
@@ -25,6 +25,16 @@
|
||||
#include <linux/poll.h>
|
||||
#include "inv_mpu_iio.h"
|
||||
|
||||
static void inv_clear_kfifo(struct inv_mpu6050_state *st)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
/* take the spin lock sem to avoid interrupt kick in */
|
||||
spin_lock_irqsave(&st->time_stamp_lock, flags);
|
||||
kfifo_reset(&st->timestamps);
|
||||
spin_unlock_irqrestore(&st->time_stamp_lock, flags);
|
||||
}
|
||||
|
||||
int inv_reset_fifo(struct iio_dev *indio_dev)
|
||||
{
|
||||
int result;
|
||||
@@ -51,6 +61,10 @@ int inv_reset_fifo(struct iio_dev *indio_dev)
|
||||
INV_MPU6050_BIT_FIFO_RST);
|
||||
if (result)
|
||||
goto reset_fifo_fail;
|
||||
|
||||
/* clear timestamps fifo */
|
||||
inv_clear_kfifo(st);
|
||||
|
||||
/* enable interrupt */
|
||||
if (st->chip_config.accl_fifo_enable ||
|
||||
st->chip_config.gyro_fifo_enable) {
|
||||
@@ -84,16 +98,6 @@ reset_fifo_fail:
|
||||
return result;
|
||||
}
|
||||
|
||||
static void inv_clear_kfifo(struct inv_mpu6050_state *st)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
/* take the spin lock sem to avoid interrupt kick in */
|
||||
spin_lock_irqsave(&st->time_stamp_lock, flags);
|
||||
kfifo_reset(&st->timestamps);
|
||||
spin_unlock_irqrestore(&st->time_stamp_lock, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* inv_mpu6050_irq_handler() - Cache a timestamp at each data ready interrupt.
|
||||
*/
|
||||
@@ -185,7 +189,6 @@ end_session:
|
||||
flush_fifo:
|
||||
/* Flush HW and SW FIFOs. */
|
||||
inv_reset_fifo(indio_dev);
|
||||
inv_clear_kfifo(st);
|
||||
mutex_unlock(&indio_dev->mlock);
|
||||
iio_trigger_notify_done(indio_dev->trig);
|
||||
|
||||
|
||||
@@ -94,6 +94,14 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
|
||||
if (dmasync)
|
||||
dma_set_attr(DMA_ATTR_WRITE_BARRIER, &attrs);
|
||||
|
||||
/*
|
||||
* If the combination of the addr and size requested for this memory
|
||||
* region causes an integer overflow, return error.
|
||||
*/
|
||||
if ((PAGE_ALIGN(addr + size) <= size) ||
|
||||
(PAGE_ALIGN(addr + size) <= addr))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (!can_do_mlock())
|
||||
return ERR_PTR(-EPERM);
|
||||
|
||||
|
||||
@@ -476,6 +476,7 @@ static void ib_uverbs_async_handler(struct ib_uverbs_file *file,
|
||||
|
||||
entry->desc.async.element = element;
|
||||
entry->desc.async.event_type = event;
|
||||
entry->desc.async.reserved = 0;
|
||||
entry->counter = counter;
|
||||
|
||||
list_add_tail(&entry->list, &file->async_file->event_list);
|
||||
|
||||
@@ -64,6 +64,14 @@ enum {
|
||||
#define GUID_TBL_BLK_NUM_ENTRIES 8
|
||||
#define GUID_TBL_BLK_SIZE (GUID_TBL_ENTRY_SIZE * GUID_TBL_BLK_NUM_ENTRIES)
|
||||
|
||||
/* Counters should be saturate once they reach their maximum value */
|
||||
#define ASSIGN_32BIT_COUNTER(counter, value) do {\
|
||||
if ((value) > U32_MAX) \
|
||||
counter = cpu_to_be32(U32_MAX); \
|
||||
else \
|
||||
counter = cpu_to_be32(value); \
|
||||
} while (0)
|
||||
|
||||
struct mlx4_mad_rcv_buf {
|
||||
struct ib_grh grh;
|
||||
u8 payload[256];
|
||||
@@ -730,10 +738,14 @@ static int ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
|
||||
static void edit_counter(struct mlx4_counter *cnt,
|
||||
struct ib_pma_portcounters *pma_cnt)
|
||||
{
|
||||
pma_cnt->port_xmit_data = cpu_to_be32((be64_to_cpu(cnt->tx_bytes)>>2));
|
||||
pma_cnt->port_rcv_data = cpu_to_be32((be64_to_cpu(cnt->rx_bytes)>>2));
|
||||
pma_cnt->port_xmit_packets = cpu_to_be32(be64_to_cpu(cnt->tx_frames));
|
||||
pma_cnt->port_rcv_packets = cpu_to_be32(be64_to_cpu(cnt->rx_frames));
|
||||
ASSIGN_32BIT_COUNTER(pma_cnt->port_xmit_data,
|
||||
(be64_to_cpu(cnt->tx_bytes) >> 2));
|
||||
ASSIGN_32BIT_COUNTER(pma_cnt->port_rcv_data,
|
||||
(be64_to_cpu(cnt->rx_bytes) >> 2));
|
||||
ASSIGN_32BIT_COUNTER(pma_cnt->port_xmit_packets,
|
||||
be64_to_cpu(cnt->tx_frames));
|
||||
ASSIGN_32BIT_COUNTER(pma_cnt->port_rcv_packets,
|
||||
be64_to_cpu(cnt->rx_frames));
|
||||
}
|
||||
|
||||
static int iboe_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
|
||||
|
||||
@@ -291,9 +291,16 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where,
|
||||
struct request_queue *q = bdev_get_queue(where->bdev);
|
||||
unsigned short logical_block_size = queue_logical_block_size(q);
|
||||
sector_t num_sectors;
|
||||
unsigned int uninitialized_var(special_cmd_max_sectors);
|
||||
|
||||
/* Reject unsupported discard requests */
|
||||
if ((rw & REQ_DISCARD) && !blk_queue_discard(q)) {
|
||||
/*
|
||||
* Reject unsupported discard and write same requests.
|
||||
*/
|
||||
if (rw & REQ_DISCARD)
|
||||
special_cmd_max_sectors = q->limits.max_discard_sectors;
|
||||
else if (rw & REQ_WRITE_SAME)
|
||||
special_cmd_max_sectors = q->limits.max_write_same_sectors;
|
||||
if ((rw & (REQ_DISCARD | REQ_WRITE_SAME)) && special_cmd_max_sectors == 0) {
|
||||
dec_count(io, region, -EOPNOTSUPP);
|
||||
return;
|
||||
}
|
||||
@@ -319,7 +326,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where,
|
||||
store_io_and_region_in_bio(bio, io, region);
|
||||
|
||||
if (rw & REQ_DISCARD) {
|
||||
num_sectors = min_t(sector_t, q->limits.max_discard_sectors, remaining);
|
||||
num_sectors = min_t(sector_t, special_cmd_max_sectors, remaining);
|
||||
bio->bi_iter.bi_size = num_sectors << SECTOR_SHIFT;
|
||||
remaining -= num_sectors;
|
||||
} else if (rw & REQ_WRITE_SAME) {
|
||||
@@ -328,7 +335,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where,
|
||||
*/
|
||||
dp->get_page(dp, &page, &len, &offset);
|
||||
bio_add_page(bio, page, logical_block_size, offset);
|
||||
num_sectors = min_t(sector_t, q->limits.max_write_same_sectors, remaining);
|
||||
num_sectors = min_t(sector_t, special_cmd_max_sectors, remaining);
|
||||
bio->bi_iter.bi_size = num_sectors << SECTOR_SHIFT;
|
||||
|
||||
offset = 0;
|
||||
|
||||
@@ -2352,10 +2352,16 @@ static void __dm_destroy(struct mapped_device *md, bool wait)
|
||||
set_bit(DMF_FREEING, &md->flags);
|
||||
spin_unlock(&_minor_lock);
|
||||
|
||||
/*
|
||||
* Take suspend_lock so that presuspend and postsuspend methods
|
||||
* do not race with internal suspend.
|
||||
*/
|
||||
mutex_lock(&md->suspend_lock);
|
||||
if (!dm_suspended_md(md)) {
|
||||
dm_table_presuspend_targets(map);
|
||||
dm_table_postsuspend_targets(map);
|
||||
}
|
||||
mutex_unlock(&md->suspend_lock);
|
||||
|
||||
/* dm_put_live_table must be before msleep, otherwise deadlock is possible */
|
||||
dm_put_live_table(md, srcu_idx);
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
/* Offset base used to differentiate between CAPTURE and OUTPUT
|
||||
* while mmaping */
|
||||
#define DST_QUEUE_OFF_BASE (TASK_SIZE / 2)
|
||||
#define DST_QUEUE_OFF_BASE (1 << 30)
|
||||
|
||||
#define MFC_BANK1_ALLOC_CTX 0
|
||||
#define MFC_BANK2_ALLOC_CTX 1
|
||||
|
||||
@@ -1183,6 +1183,7 @@ static int sh_veu_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
*vdev = sh_veu_videodev;
|
||||
vdev->v4l2_dev = &veu->v4l2_dev;
|
||||
spin_lock_init(&veu->lock);
|
||||
mutex_init(&veu->fop_lock);
|
||||
vdev->lock = &veu->fop_lock;
|
||||
|
||||
@@ -629,7 +629,7 @@ static int __init kempld_init(void)
|
||||
if (force_device_id[0]) {
|
||||
for (id = kempld_dmi_table; id->matches[0].slot != DMI_NONE; id++)
|
||||
if (strstr(id->ident, force_device_id))
|
||||
if (id->callback && id->callback(id))
|
||||
if (id->callback && !id->callback(id))
|
||||
break;
|
||||
if (id->matches[0].slot == DMI_NONE)
|
||||
return -ENODEV;
|
||||
|
||||
@@ -481,6 +481,42 @@ static void disable_int(struct pxa3xx_nand_info *info, uint32_t int_mask)
|
||||
nand_writel(info, NDCR, ndcr | int_mask);
|
||||
}
|
||||
|
||||
static void drain_fifo(struct pxa3xx_nand_info *info, void *data, int len)
|
||||
{
|
||||
if (info->ecc_bch) {
|
||||
int timeout;
|
||||
|
||||
/*
|
||||
* According to the datasheet, when reading from NDDB
|
||||
* with BCH enabled, after each 32 bytes reads, we
|
||||
* have to make sure that the NDSR.RDDREQ bit is set.
|
||||
*
|
||||
* Drain the FIFO 8 32 bits reads at a time, and skip
|
||||
* the polling on the last read.
|
||||
*/
|
||||
while (len > 8) {
|
||||
__raw_readsl(info->mmio_base + NDDB, data, 8);
|
||||
|
||||
for (timeout = 0;
|
||||
!(nand_readl(info, NDSR) & NDSR_RDDREQ);
|
||||
timeout++) {
|
||||
if (timeout >= 5) {
|
||||
dev_err(&info->pdev->dev,
|
||||
"Timeout on RDDREQ while draining the FIFO\n");
|
||||
return;
|
||||
}
|
||||
|
||||
mdelay(1);
|
||||
}
|
||||
|
||||
data += 32;
|
||||
len -= 8;
|
||||
}
|
||||
}
|
||||
|
||||
__raw_readsl(info->mmio_base + NDDB, data, len);
|
||||
}
|
||||
|
||||
static void handle_data_pio(struct pxa3xx_nand_info *info)
|
||||
{
|
||||
unsigned int do_bytes = min(info->data_size, info->chunk_size);
|
||||
@@ -497,14 +533,14 @@ static void handle_data_pio(struct pxa3xx_nand_info *info)
|
||||
DIV_ROUND_UP(info->oob_size, 4));
|
||||
break;
|
||||
case STATE_PIO_READING:
|
||||
__raw_readsl(info->mmio_base + NDDB,
|
||||
info->data_buff + info->data_buff_pos,
|
||||
DIV_ROUND_UP(do_bytes, 4));
|
||||
drain_fifo(info,
|
||||
info->data_buff + info->data_buff_pos,
|
||||
DIV_ROUND_UP(do_bytes, 4));
|
||||
|
||||
if (info->oob_size > 0)
|
||||
__raw_readsl(info->mmio_base + NDDB,
|
||||
info->oob_buff + info->oob_buff_pos,
|
||||
DIV_ROUND_UP(info->oob_size, 4));
|
||||
drain_fifo(info,
|
||||
info->oob_buff + info->oob_buff_pos,
|
||||
DIV_ROUND_UP(info->oob_size, 4));
|
||||
break;
|
||||
default:
|
||||
dev_err(&info->pdev->dev, "%s: invalid state %d\n", __func__,
|
||||
|
||||
@@ -502,6 +502,14 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf)
|
||||
skb->pkt_type = PACKET_BROADCAST;
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
|
||||
skb_reset_mac_header(skb);
|
||||
skb_reset_network_header(skb);
|
||||
skb_reset_transport_header(skb);
|
||||
|
||||
skb_reset_mac_header(skb);
|
||||
skb_reset_network_header(skb);
|
||||
skb_reset_transport_header(skb);
|
||||
|
||||
can_skb_reserve(skb);
|
||||
can_skb_prv(skb)->ifindex = dev->ifindex;
|
||||
|
||||
|
||||
@@ -1095,12 +1095,19 @@ static int flexcan_probe(struct platform_device *pdev)
|
||||
const struct flexcan_devtype_data *devtype_data;
|
||||
struct net_device *dev;
|
||||
struct flexcan_priv *priv;
|
||||
struct regulator *reg_xceiver;
|
||||
struct resource *mem;
|
||||
struct clk *clk_ipg = NULL, *clk_per = NULL;
|
||||
void __iomem *base;
|
||||
int err, irq;
|
||||
u32 clock_freq = 0;
|
||||
|
||||
reg_xceiver = devm_regulator_get(&pdev->dev, "xceiver");
|
||||
if (PTR_ERR(reg_xceiver) == -EPROBE_DEFER)
|
||||
return -EPROBE_DEFER;
|
||||
else if (IS_ERR(reg_xceiver))
|
||||
reg_xceiver = NULL;
|
||||
|
||||
if (pdev->dev.of_node)
|
||||
of_property_read_u32(pdev->dev.of_node,
|
||||
"clock-frequency", &clock_freq);
|
||||
@@ -1162,9 +1169,7 @@ static int flexcan_probe(struct platform_device *pdev)
|
||||
priv->pdata = dev_get_platdata(&pdev->dev);
|
||||
priv->devtype_data = devtype_data;
|
||||
|
||||
priv->reg_xceiver = devm_regulator_get(&pdev->dev, "xceiver");
|
||||
if (IS_ERR(priv->reg_xceiver))
|
||||
priv->reg_xceiver = NULL;
|
||||
priv->reg_xceiver = reg_xceiver;
|
||||
|
||||
netif_napi_add(dev, &priv->napi, flexcan_poll, FLEXCAN_NAPI_WEIGHT);
|
||||
|
||||
|
||||
@@ -1516,7 +1516,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
|
||||
{
|
||||
struct pcnet32_private *lp;
|
||||
int i, media;
|
||||
int fdx, mii, fset, dxsuflo;
|
||||
int fdx, mii, fset, dxsuflo, sram;
|
||||
int chip_version;
|
||||
char *chipname;
|
||||
struct net_device *dev;
|
||||
@@ -1553,7 +1553,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
|
||||
}
|
||||
|
||||
/* initialize variables */
|
||||
fdx = mii = fset = dxsuflo = 0;
|
||||
fdx = mii = fset = dxsuflo = sram = 0;
|
||||
chip_version = (chip_version >> 12) & 0xffff;
|
||||
|
||||
switch (chip_version) {
|
||||
@@ -1586,6 +1586,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
|
||||
chipname = "PCnet/FAST III 79C973"; /* PCI */
|
||||
fdx = 1;
|
||||
mii = 1;
|
||||
sram = 1;
|
||||
break;
|
||||
case 0x2626:
|
||||
chipname = "PCnet/Home 79C978"; /* PCI */
|
||||
@@ -1609,6 +1610,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
|
||||
chipname = "PCnet/FAST III 79C975"; /* PCI */
|
||||
fdx = 1;
|
||||
mii = 1;
|
||||
sram = 1;
|
||||
break;
|
||||
case 0x2628:
|
||||
chipname = "PCnet/PRO 79C976";
|
||||
@@ -1637,6 +1639,31 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
|
||||
dxsuflo = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* The Am79C973/Am79C975 controllers come with 12K of SRAM
|
||||
* which we can use for the Tx/Rx buffers but most importantly,
|
||||
* the use of SRAM allow us to use the BCR18:NOUFLO bit to avoid
|
||||
* Tx fifo underflows.
|
||||
*/
|
||||
if (sram) {
|
||||
/*
|
||||
* The SRAM is being configured in two steps. First we
|
||||
* set the SRAM size in the BCR25:SRAM_SIZE bits. According
|
||||
* to the datasheet, each bit corresponds to a 512-byte
|
||||
* page so we can have at most 24 pages. The SRAM_SIZE
|
||||
* holds the value of the upper 8 bits of the 16-bit SRAM size.
|
||||
* The low 8-bits start at 0x00 and end at 0xff. So the
|
||||
* address range is from 0x0000 up to 0x17ff. Therefore,
|
||||
* the SRAM_SIZE is set to 0x17. The next step is to set
|
||||
* the BCR26:SRAM_BND midway through so the Tx and Rx
|
||||
* buffers can share the SRAM equally.
|
||||
*/
|
||||
a->write_bcr(ioaddr, 25, 0x17);
|
||||
a->write_bcr(ioaddr, 26, 0xc);
|
||||
/* And finally enable the NOUFLO bit */
|
||||
a->write_bcr(ioaddr, 18, a->read_bcr(ioaddr, 18) | (1 << 11));
|
||||
}
|
||||
|
||||
dev = alloc_etherdev(sizeof(*lp));
|
||||
if (!dev) {
|
||||
ret = -ENOMEM;
|
||||
|
||||
@@ -12395,6 +12395,9 @@ static int bnx2x_init_dev(struct bnx2x *bp, struct pci_dev *pdev,
|
||||
pci_write_config_dword(bp->pdev, PCICFG_GRC_ADDRESS,
|
||||
PCICFG_VENDOR_ID_OFFSET);
|
||||
|
||||
/* Set PCIe reset type to fundamental for EEH recovery */
|
||||
pdev->needs_freset = 1;
|
||||
|
||||
/* AER (Advanced Error reporting) configuration */
|
||||
rc = pci_enable_pcie_error_reporting(pdev);
|
||||
if (!rc)
|
||||
|
||||
@@ -300,9 +300,18 @@ static const struct driver_info cx82310_info = {
|
||||
.tx_fixup = cx82310_tx_fixup,
|
||||
};
|
||||
|
||||
#define USB_DEVICE_CLASS(vend, prod, cl, sc, pr) \
|
||||
.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
|
||||
USB_DEVICE_ID_MATCH_DEV_INFO, \
|
||||
.idVendor = (vend), \
|
||||
.idProduct = (prod), \
|
||||
.bDeviceClass = (cl), \
|
||||
.bDeviceSubClass = (sc), \
|
||||
.bDeviceProtocol = (pr)
|
||||
|
||||
static const struct usb_device_id products[] = {
|
||||
{
|
||||
USB_DEVICE_AND_INTERFACE_INFO(0x0572, 0xcb01, 0xff, 0, 0),
|
||||
USB_DEVICE_CLASS(0x0572, 0xcb01, 0xff, 0, 0),
|
||||
.driver_info = (unsigned long) &cx82310_info
|
||||
},
|
||||
{ },
|
||||
|
||||
@@ -708,7 +708,6 @@ struct iwl_priv {
|
||||
unsigned long reload_jiffies;
|
||||
int reload_count;
|
||||
bool ucode_loaded;
|
||||
bool init_ucode_run; /* Don't run init uCode again */
|
||||
|
||||
u8 plcp_delta_threshold;
|
||||
|
||||
|
||||
@@ -418,9 +418,6 @@ int iwl_run_init_ucode(struct iwl_priv *priv)
|
||||
if (!priv->fw->img[IWL_UCODE_INIT].sec[0].len)
|
||||
return 0;
|
||||
|
||||
if (priv->init_ucode_run)
|
||||
return 0;
|
||||
|
||||
iwl_init_notification_wait(&priv->notif_wait, &calib_wait,
|
||||
calib_complete, ARRAY_SIZE(calib_complete),
|
||||
iwlagn_wait_calib, priv);
|
||||
@@ -440,8 +437,6 @@ int iwl_run_init_ucode(struct iwl_priv *priv)
|
||||
*/
|
||||
ret = iwl_wait_notification(&priv->notif_wait, &calib_wait,
|
||||
UCODE_CALIB_TIMEOUT);
|
||||
if (!ret)
|
||||
priv->init_ucode_run = true;
|
||||
|
||||
goto out;
|
||||
|
||||
|
||||
@@ -594,7 +594,7 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
|
||||
|
||||
ret = iwl_mvm_mac_ctxt_add(mvm, vif);
|
||||
if (ret)
|
||||
goto out_remove_mac;
|
||||
goto out_release;
|
||||
|
||||
iwl_mvm_power_disable(mvm, vif);
|
||||
|
||||
|
||||
@@ -290,7 +290,7 @@ int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_ar
|
||||
struct device_node *p;
|
||||
const __be32 *intspec, *tmp, *addr;
|
||||
u32 intsize, intlen;
|
||||
int i, res = -EINVAL;
|
||||
int i, res;
|
||||
|
||||
pr_debug("of_irq_parse_one: dev=%s, index=%d\n", of_node_full_name(device), index);
|
||||
|
||||
@@ -323,15 +323,19 @@ int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_ar
|
||||
|
||||
/* Get size of interrupt specifier */
|
||||
tmp = of_get_property(p, "#interrupt-cells", NULL);
|
||||
if (tmp == NULL)
|
||||
if (tmp == NULL) {
|
||||
res = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
intsize = be32_to_cpu(*tmp);
|
||||
|
||||
pr_debug(" intsize=%d intlen=%d\n", intsize, intlen);
|
||||
|
||||
/* Check index */
|
||||
if ((index + 1) * intsize > intlen)
|
||||
if ((index + 1) * intsize > intlen) {
|
||||
res = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Copy intspec into irq structure */
|
||||
intspec += index * intsize;
|
||||
|
||||
@@ -127,16 +127,8 @@ static const char *aer_agent_string[] = {
|
||||
static void __print_tlp_header(struct pci_dev *dev,
|
||||
struct aer_header_log_regs *t)
|
||||
{
|
||||
unsigned char *tlp = (unsigned char *)&t;
|
||||
|
||||
dev_err(&dev->dev, " TLP Header:"
|
||||
" %02x%02x%02x%02x %02x%02x%02x%02x"
|
||||
" %02x%02x%02x%02x %02x%02x%02x%02x\n",
|
||||
*(tlp + 3), *(tlp + 2), *(tlp + 1), *tlp,
|
||||
*(tlp + 7), *(tlp + 6), *(tlp + 5), *(tlp + 4),
|
||||
*(tlp + 11), *(tlp + 10), *(tlp + 9),
|
||||
*(tlp + 8), *(tlp + 15), *(tlp + 14),
|
||||
*(tlp + 13), *(tlp + 12));
|
||||
dev_err(&dev->dev, " TLP Header: %08x %08x %08x %08x\n",
|
||||
t->dw0, t->dw1, t->dw2, t->dw3);
|
||||
}
|
||||
|
||||
static void __aer_print_error(struct pci_dev *dev,
|
||||
|
||||
@@ -50,7 +50,9 @@ static void devm_phy_consume(struct device *dev, void *res)
|
||||
|
||||
static int devm_phy_match(struct device *dev, void *res, void *match_data)
|
||||
{
|
||||
return res == match_data;
|
||||
struct phy **phy = res;
|
||||
|
||||
return *phy == match_data;
|
||||
}
|
||||
|
||||
static struct phy *phy_lookup(struct device *device, const char *port)
|
||||
|
||||
@@ -1764,10 +1764,12 @@ static int _regulator_do_enable(struct regulator_dev *rdev)
|
||||
trace_regulator_enable(rdev_get_name(rdev));
|
||||
|
||||
if (rdev->ena_pin) {
|
||||
ret = regulator_ena_gpio_ctrl(rdev, true);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
rdev->ena_gpio_state = 1;
|
||||
if (!rdev->ena_gpio_state) {
|
||||
ret = regulator_ena_gpio_ctrl(rdev, true);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
rdev->ena_gpio_state = 1;
|
||||
}
|
||||
} else if (rdev->desc->ops->enable) {
|
||||
ret = rdev->desc->ops->enable(rdev);
|
||||
if (ret < 0)
|
||||
@@ -1897,10 +1899,12 @@ static int _regulator_do_disable(struct regulator_dev *rdev)
|
||||
trace_regulator_disable(rdev_get_name(rdev));
|
||||
|
||||
if (rdev->ena_pin) {
|
||||
ret = regulator_ena_gpio_ctrl(rdev, false);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
rdev->ena_gpio_state = 0;
|
||||
if (rdev->ena_gpio_state) {
|
||||
ret = regulator_ena_gpio_ctrl(rdev, false);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
rdev->ena_gpio_state = 0;
|
||||
}
|
||||
|
||||
} else if (rdev->desc->ops->disable) {
|
||||
ret = rdev->desc->ops->disable(rdev);
|
||||
@@ -3454,12 +3458,6 @@ regulator_register(const struct regulator_desc *regulator_desc,
|
||||
config->ena_gpio, ret);
|
||||
goto wash;
|
||||
}
|
||||
|
||||
if (config->ena_gpio_flags & GPIOF_OUT_INIT_HIGH)
|
||||
rdev->ena_gpio_state = 1;
|
||||
|
||||
if (config->ena_gpio_invert)
|
||||
rdev->ena_gpio_state = !rdev->ena_gpio_state;
|
||||
}
|
||||
|
||||
/* set regulator constraints */
|
||||
@@ -3631,9 +3629,11 @@ int regulator_suspend_finish(void)
|
||||
list_for_each_entry(rdev, ®ulator_list, list) {
|
||||
mutex_lock(&rdev->mutex);
|
||||
if (rdev->use_count > 0 || rdev->constraints->always_on) {
|
||||
error = _regulator_do_enable(rdev);
|
||||
if (error)
|
||||
ret = error;
|
||||
if (!_regulator_is_enabled(rdev)) {
|
||||
error = _regulator_do_enable(rdev);
|
||||
if (error)
|
||||
ret = error;
|
||||
}
|
||||
} else {
|
||||
if (!have_full_constraints())
|
||||
goto unlock;
|
||||
|
||||
@@ -5684,9 +5684,9 @@ free_port:
|
||||
hba_free:
|
||||
if (phba->msix_enabled)
|
||||
pci_disable_msix(phba->pcidev);
|
||||
iscsi_host_remove(phba->shost);
|
||||
pci_dev_put(phba->pcidev);
|
||||
iscsi_host_free(phba->shost);
|
||||
pci_set_drvdata(pcidev, NULL);
|
||||
disable_pci:
|
||||
pci_disable_device(pcidev);
|
||||
return ret;
|
||||
|
||||
@@ -500,6 +500,7 @@ static void sas_revalidate_domain(struct work_struct *work)
|
||||
struct sas_discovery_event *ev = to_sas_discovery_event(work);
|
||||
struct asd_sas_port *port = ev->port;
|
||||
struct sas_ha_struct *ha = port->ha;
|
||||
struct domain_device *ddev = port->port_dev;
|
||||
|
||||
/* prevent revalidation from finding sata links in recovery */
|
||||
mutex_lock(&ha->disco_mutex);
|
||||
@@ -514,8 +515,9 @@ static void sas_revalidate_domain(struct work_struct *work)
|
||||
SAS_DPRINTK("REVALIDATING DOMAIN on port %d, pid:%d\n", port->id,
|
||||
task_pid_nr(current));
|
||||
|
||||
if (port->port_dev)
|
||||
res = sas_ex_revalidate_domain(port->port_dev);
|
||||
if (ddev && (ddev->dev_type == SAS_FANOUT_EXPANDER_DEVICE ||
|
||||
ddev->dev_type == SAS_EDGE_EXPANDER_DEVICE))
|
||||
res = sas_ex_revalidate_domain(ddev);
|
||||
|
||||
SAS_DPRINTK("done REVALIDATING DOMAIN on port %d, pid:%d, res 0x%x\n",
|
||||
port->id, task_pid_nr(current), res);
|
||||
|
||||
@@ -1515,7 +1515,7 @@ static int tcm_qla2xxx_check_initiator_node_acl(
|
||||
/*
|
||||
* Finally register the new FC Nexus with TCM
|
||||
*/
|
||||
__transport_register_session(se_nacl->se_tpg, se_nacl, se_sess, sess);
|
||||
transport_register_session(se_nacl->se_tpg, se_nacl, se_sess, sess);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1258,9 +1258,11 @@ int scsi_prep_state_check(struct scsi_device *sdev, struct request *req)
|
||||
"rejecting I/O to dead device\n");
|
||||
ret = BLKPREP_KILL;
|
||||
break;
|
||||
case SDEV_QUIESCE:
|
||||
case SDEV_BLOCK:
|
||||
case SDEV_CREATED_BLOCK:
|
||||
ret = BLKPREP_DEFER;
|
||||
break;
|
||||
case SDEV_QUIESCE:
|
||||
/*
|
||||
* If the devices is blocked we defer normal commands.
|
||||
*/
|
||||
|
||||
@@ -781,17 +781,17 @@ static void atmel_spi_pdc_next_xfer(struct spi_master *master,
|
||||
(unsigned long long)xfer->rx_dma);
|
||||
}
|
||||
|
||||
/* REVISIT: We're waiting for ENDRX before we start the next
|
||||
/* REVISIT: We're waiting for RXBUFF before we start the next
|
||||
* transfer because we need to handle some difficult timing
|
||||
* issues otherwise. If we wait for ENDTX in one transfer and
|
||||
* then starts waiting for ENDRX in the next, it's difficult
|
||||
* to tell the difference between the ENDRX interrupt we're
|
||||
* actually waiting for and the ENDRX interrupt of the
|
||||
* issues otherwise. If we wait for TXBUFE in one transfer and
|
||||
* then starts waiting for RXBUFF in the next, it's difficult
|
||||
* to tell the difference between the RXBUFF interrupt we're
|
||||
* actually waiting for and the RXBUFF interrupt of the
|
||||
* previous transfer.
|
||||
*
|
||||
* It should be doable, though. Just not now...
|
||||
*/
|
||||
spi_writel(as, IER, SPI_BIT(ENDRX) | SPI_BIT(OVRES));
|
||||
spi_writel(as, IER, SPI_BIT(RXBUFF) | SPI_BIT(OVRES));
|
||||
spi_writel(as, PTCR, SPI_BIT(TXTEN) | SPI_BIT(RXTEN));
|
||||
}
|
||||
|
||||
|
||||
@@ -503,12 +503,12 @@ static void giveback(struct pl022 *pl022)
|
||||
pl022->cur_msg = NULL;
|
||||
pl022->cur_transfer = NULL;
|
||||
pl022->cur_chip = NULL;
|
||||
spi_finalize_current_message(pl022->master);
|
||||
|
||||
/* disable the SPI/SSP operation */
|
||||
writew((readw(SSP_CR1(pl022->virtbase)) &
|
||||
(~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase));
|
||||
|
||||
spi_finalize_current_message(pl022->master);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -846,13 +846,14 @@ void spi_finalize_current_message(struct spi_master *master)
|
||||
"failed to unprepare message: %d\n", ret);
|
||||
}
|
||||
}
|
||||
|
||||
trace_spi_message_done(mesg);
|
||||
|
||||
master->cur_msg_prepared = false;
|
||||
|
||||
mesg->state = NULL;
|
||||
if (mesg->complete)
|
||||
mesg->complete(mesg->context);
|
||||
|
||||
trace_spi_message_done(mesg);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(spi_finalize_current_message);
|
||||
|
||||
|
||||
@@ -1159,7 +1159,6 @@ static irqreturn_t mxs_lradc_handle_irq(int irq, void *data)
|
||||
LRADC_CTRL1_LRADC_IRQ(TOUCHSCREEN_VCHANNEL2));
|
||||
}
|
||||
|
||||
if (iio_buffer_enabled(iio))
|
||||
if (iio_buffer_enabled(iio)) {
|
||||
if (reg & lradc->buffer_vchans)
|
||||
iio_trigger_poll(iio->trig, iio_get_time_ns());
|
||||
|
||||
@@ -105,8 +105,8 @@ static inline void ll_set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt,
|
||||
#define ll_vfs_unlink(inode,entry,mnt) vfs_unlink(inode,entry)
|
||||
#define ll_vfs_mknod(dir,entry,mnt,mode,dev) vfs_mknod(dir,entry,mode,dev)
|
||||
#define ll_security_inode_unlink(dir,entry,mnt) security_inode_unlink(dir,entry)
|
||||
#define ll_vfs_rename(old,old_dir,mnt,new,new_dir,mnt1,delegated_inode) \
|
||||
vfs_rename(old,old_dir,new,new_dir,delegated_inode)
|
||||
#define ll_vfs_rename(old, old_dir, mnt, new, new_dir, mnt1) \
|
||||
vfs_rename(old, old_dir, new, new_dir, NULL, 0)
|
||||
|
||||
#define cfs_bio_io_error(a,b) bio_io_error((a))
|
||||
#define cfs_bio_endio(a,b,c) bio_endio((a),(c))
|
||||
|
||||
@@ -205,13 +205,15 @@ static int ll_encode_fh(struct inode *inode, __u32 *fh, int *plen,
|
||||
return LUSTRE_NFS_FID;
|
||||
}
|
||||
|
||||
static int ll_nfs_get_name_filldir(void *cookie, const char *name, int namelen,
|
||||
loff_t hash, u64 ino, unsigned type)
|
||||
static int ll_nfs_get_name_filldir(struct dir_context *ctx, const char *name,
|
||||
int namelen, loff_t hash, u64 ino,
|
||||
unsigned type)
|
||||
{
|
||||
/* It is hack to access lde_fid for comparison with lgd_fid.
|
||||
* So the input 'name' must be part of the 'lu_dirent'. */
|
||||
struct lu_dirent *lde = container_of0(name, struct lu_dirent, lde_name);
|
||||
struct ll_getname_data *lgd = cookie;
|
||||
struct ll_getname_data *lgd =
|
||||
container_of(ctx, struct ll_getname_data, ctx);
|
||||
struct lu_fid fid;
|
||||
|
||||
fid_le_to_cpu(&fid, &lde->lde_fid);
|
||||
|
||||
@@ -115,27 +115,6 @@ failed:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int ll_readlink(struct dentry *dentry, char *buffer, int buflen)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
struct ptlrpc_request *request;
|
||||
char *symname;
|
||||
int rc;
|
||||
|
||||
CDEBUG(D_VFSTRACE, "VFS Op\n");
|
||||
|
||||
ll_inode_size_lock(inode);
|
||||
rc = ll_readlink_internal(inode, &request, &symname);
|
||||
if (rc)
|
||||
GOTO(out, rc);
|
||||
|
||||
rc = vfs_readlink(dentry, buffer, buflen, symname);
|
||||
out:
|
||||
ptlrpc_req_finished(request);
|
||||
ll_inode_size_unlock(inode);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void *ll_follow_link(struct dentry *dentry, struct nameidata *nd)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
@@ -175,7 +154,7 @@ static void ll_put_link(struct dentry *dentry, struct nameidata *nd, void *cooki
|
||||
}
|
||||
|
||||
struct inode_operations ll_fast_symlink_inode_operations = {
|
||||
.readlink = ll_readlink,
|
||||
.readlink = generic_readlink,
|
||||
.setattr = ll_setattr,
|
||||
.follow_link = ll_follow_link,
|
||||
.put_link = ll_put_link,
|
||||
|
||||
@@ -223,7 +223,7 @@ int lustre_rename(struct dentry *dir, struct vfsmount *mnt,
|
||||
GOTO(put_old, err = PTR_ERR(dchild_new));
|
||||
|
||||
err = ll_vfs_rename(dir->d_inode, dchild_old, mnt,
|
||||
dir->d_inode, dchild_new, mnt, NULL);
|
||||
dir->d_inode, dchild_new, mnt);
|
||||
|
||||
dput(dchild_new);
|
||||
put_old:
|
||||
|
||||
@@ -936,6 +936,7 @@ bool RFbSetPower(
|
||||
break;
|
||||
case RATE_6M:
|
||||
case RATE_9M:
|
||||
case RATE_12M:
|
||||
case RATE_18M:
|
||||
byPwr = pDevice->abyOFDMPwrTbl[uCH];
|
||||
if (pDevice->byRFType == RF_UW2452) {
|
||||
|
||||
@@ -752,6 +752,7 @@ int RFbSetPower(struct vnt_private *priv, u32 rate, u32 channel)
|
||||
break;
|
||||
case RATE_6M:
|
||||
case RATE_9M:
|
||||
case RATE_12M:
|
||||
case RATE_18M:
|
||||
case RATE_24M:
|
||||
case RATE_36M:
|
||||
|
||||
@@ -1165,7 +1165,7 @@ iscsit_handle_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
||||
* traditional iSCSI block I/O.
|
||||
*/
|
||||
if (iscsit_allocate_iovecs(cmd) < 0) {
|
||||
return iscsit_add_reject_cmd(cmd,
|
||||
return iscsit_reject_cmd(cmd,
|
||||
ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf);
|
||||
}
|
||||
immed_data = cmd->immediate_data;
|
||||
@@ -4196,11 +4196,17 @@ int iscsit_close_connection(
|
||||
pr_debug("Closing iSCSI connection CID %hu on SID:"
|
||||
" %u\n", conn->cid, sess->sid);
|
||||
/*
|
||||
* Always up conn_logout_comp just in case the RX Thread is sleeping
|
||||
* and the logout response never got sent because the connection
|
||||
* failed.
|
||||
* Always up conn_logout_comp for the traditional TCP case just in case
|
||||
* the RX Thread in iscsi_target_rx_opcode() is sleeping and the logout
|
||||
* response never got sent because the connection failed.
|
||||
*
|
||||
* However for iser-target, isert_wait4logout() is using conn_logout_comp
|
||||
* to signal logout response TX interrupt completion. Go ahead and skip
|
||||
* this for iser since isert_rx_opcode() does not wait on logout failure,
|
||||
* and to avoid iscsi_conn pointer dereference in iser-target code.
|
||||
*/
|
||||
complete(&conn->conn_logout_comp);
|
||||
if (conn->conn_transport->transport_type == ISCSI_TCP)
|
||||
complete(&conn->conn_logout_comp);
|
||||
|
||||
iscsi_release_thread_set(conn);
|
||||
|
||||
|
||||
@@ -1591,8 +1591,6 @@ int target_configure_device(struct se_device *dev)
|
||||
ret = dev->transport->configure_device(dev);
|
||||
if (ret)
|
||||
goto out;
|
||||
dev->dev_flags |= DF_CONFIGURED;
|
||||
|
||||
/*
|
||||
* XXX: there is not much point to have two different values here..
|
||||
*/
|
||||
@@ -1654,6 +1652,8 @@ int target_configure_device(struct se_device *dev)
|
||||
list_add_tail(&dev->g_dev_node, &g_device_list);
|
||||
mutex_unlock(&g_device_mutex);
|
||||
|
||||
dev->dev_flags |= DF_CONFIGURED;
|
||||
|
||||
return 0;
|
||||
|
||||
out_free_alua:
|
||||
|
||||
@@ -76,7 +76,7 @@ enum preempt_type {
|
||||
};
|
||||
|
||||
static void __core_scsi3_complete_pro_release(struct se_device *, struct se_node_acl *,
|
||||
struct t10_pr_registration *, int);
|
||||
struct t10_pr_registration *, int, int);
|
||||
|
||||
static sense_reason_t
|
||||
target_scsi2_reservation_check(struct se_cmd *cmd)
|
||||
@@ -528,6 +528,18 @@ static int core_scsi3_pr_seq_non_holder(
|
||||
|
||||
return 0;
|
||||
}
|
||||
} else if (we && registered_nexus) {
|
||||
/*
|
||||
* Reads are allowed for Write Exclusive locks
|
||||
* from all registrants.
|
||||
*/
|
||||
if (cmd->data_direction == DMA_FROM_DEVICE) {
|
||||
pr_debug("Allowing READ CDB: 0x%02x for %s"
|
||||
" reservation\n", cdb[0],
|
||||
core_scsi3_pr_dump_type(pr_reg_type));
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
pr_debug("%s Conflict for %sregistered nexus %s CDB: 0x%2x"
|
||||
" for %s reservation\n", transport_dump_cmd_direction(cmd),
|
||||
@@ -1186,7 +1198,7 @@ static int core_scsi3_check_implicit_release(
|
||||
* service action with the SERVICE ACTION RESERVATION KEY
|
||||
* field set to zero (see 5.7.11.3).
|
||||
*/
|
||||
__core_scsi3_complete_pro_release(dev, nacl, pr_reg, 0);
|
||||
__core_scsi3_complete_pro_release(dev, nacl, pr_reg, 0, 1);
|
||||
ret = 1;
|
||||
/*
|
||||
* For 'All Registrants' reservation types, all existing
|
||||
@@ -1228,7 +1240,8 @@ static void __core_scsi3_free_registration(
|
||||
|
||||
pr_reg->pr_reg_deve->def_pr_registered = 0;
|
||||
pr_reg->pr_reg_deve->pr_res_key = 0;
|
||||
list_del(&pr_reg->pr_reg_list);
|
||||
if (!list_empty(&pr_reg->pr_reg_list))
|
||||
list_del(&pr_reg->pr_reg_list);
|
||||
/*
|
||||
* Caller accessing *pr_reg using core_scsi3_locate_pr_reg(),
|
||||
* so call core_scsi3_put_pr_reg() to decrement our reference.
|
||||
@@ -1280,6 +1293,7 @@ void core_scsi3_free_pr_reg_from_nacl(
|
||||
{
|
||||
struct t10_reservation *pr_tmpl = &dev->t10_pr;
|
||||
struct t10_pr_registration *pr_reg, *pr_reg_tmp, *pr_res_holder;
|
||||
bool free_reg = false;
|
||||
/*
|
||||
* If the passed se_node_acl matches the reservation holder,
|
||||
* release the reservation.
|
||||
@@ -1287,13 +1301,18 @@ void core_scsi3_free_pr_reg_from_nacl(
|
||||
spin_lock(&dev->dev_reservation_lock);
|
||||
pr_res_holder = dev->dev_pr_res_holder;
|
||||
if ((pr_res_holder != NULL) &&
|
||||
(pr_res_holder->pr_reg_nacl == nacl))
|
||||
__core_scsi3_complete_pro_release(dev, nacl, pr_res_holder, 0);
|
||||
(pr_res_holder->pr_reg_nacl == nacl)) {
|
||||
__core_scsi3_complete_pro_release(dev, nacl, pr_res_holder, 0, 1);
|
||||
free_reg = true;
|
||||
}
|
||||
spin_unlock(&dev->dev_reservation_lock);
|
||||
/*
|
||||
* Release any registration associated with the struct se_node_acl.
|
||||
*/
|
||||
spin_lock(&pr_tmpl->registration_lock);
|
||||
if (pr_res_holder && free_reg)
|
||||
__core_scsi3_free_registration(dev, pr_res_holder, NULL, 0);
|
||||
|
||||
list_for_each_entry_safe(pr_reg, pr_reg_tmp,
|
||||
&pr_tmpl->registration_list, pr_reg_list) {
|
||||
|
||||
@@ -1316,7 +1335,7 @@ void core_scsi3_free_all_registrations(
|
||||
if (pr_res_holder != NULL) {
|
||||
struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
|
||||
__core_scsi3_complete_pro_release(dev, pr_res_nacl,
|
||||
pr_res_holder, 0);
|
||||
pr_res_holder, 0, 0);
|
||||
}
|
||||
spin_unlock(&dev->dev_reservation_lock);
|
||||
|
||||
@@ -2126,13 +2145,13 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
|
||||
/*
|
||||
* sa_res_key=0 Unregister Reservation Key for registered I_T Nexus.
|
||||
*/
|
||||
pr_holder = core_scsi3_check_implicit_release(
|
||||
cmd->se_dev, pr_reg);
|
||||
type = pr_reg->pr_res_type;
|
||||
pr_holder = core_scsi3_check_implicit_release(cmd->se_dev,
|
||||
pr_reg);
|
||||
if (pr_holder < 0) {
|
||||
ret = TCM_RESERVATION_CONFLICT;
|
||||
goto out;
|
||||
}
|
||||
type = pr_reg->pr_res_type;
|
||||
|
||||
spin_lock(&pr_tmpl->registration_lock);
|
||||
/*
|
||||
@@ -2290,6 +2309,7 @@ core_scsi3_pro_reserve(struct se_cmd *cmd, int type, int scope, u64 res_key)
|
||||
spin_lock(&dev->dev_reservation_lock);
|
||||
pr_res_holder = dev->dev_pr_res_holder;
|
||||
if (pr_res_holder) {
|
||||
int pr_res_type = pr_res_holder->pr_res_type;
|
||||
/*
|
||||
* From spc4r17 Section 5.7.9: Reserving:
|
||||
*
|
||||
@@ -2300,7 +2320,9 @@ core_scsi3_pro_reserve(struct se_cmd *cmd, int type, int scope, u64 res_key)
|
||||
* the logical unit, then the command shall be completed with
|
||||
* RESERVATION CONFLICT status.
|
||||
*/
|
||||
if (pr_res_holder != pr_reg) {
|
||||
if ((pr_res_holder != pr_reg) &&
|
||||
(pr_res_type != PR_TYPE_WRITE_EXCLUSIVE_ALLREG) &&
|
||||
(pr_res_type != PR_TYPE_EXCLUSIVE_ACCESS_ALLREG)) {
|
||||
struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
|
||||
pr_err("SPC-3 PR: Attempted RESERVE from"
|
||||
" [%s]: %s while reservation already held by"
|
||||
@@ -2406,23 +2428,59 @@ static void __core_scsi3_complete_pro_release(
|
||||
struct se_device *dev,
|
||||
struct se_node_acl *se_nacl,
|
||||
struct t10_pr_registration *pr_reg,
|
||||
int explicit)
|
||||
int explicit,
|
||||
int unreg)
|
||||
{
|
||||
struct target_core_fabric_ops *tfo = se_nacl->se_tpg->se_tpg_tfo;
|
||||
char i_buf[PR_REG_ISID_ID_LEN];
|
||||
int pr_res_type = 0, pr_res_scope = 0;
|
||||
|
||||
memset(i_buf, 0, PR_REG_ISID_ID_LEN);
|
||||
core_pr_dump_initiator_port(pr_reg, i_buf, PR_REG_ISID_ID_LEN);
|
||||
/*
|
||||
* Go ahead and release the current PR reservation holder.
|
||||
* If an All Registrants reservation is currently active and
|
||||
* a unregister operation is requested, replace the current
|
||||
* dev_pr_res_holder with another active registration.
|
||||
*/
|
||||
dev->dev_pr_res_holder = NULL;
|
||||
if (dev->dev_pr_res_holder) {
|
||||
pr_res_type = dev->dev_pr_res_holder->pr_res_type;
|
||||
pr_res_scope = dev->dev_pr_res_holder->pr_res_scope;
|
||||
dev->dev_pr_res_holder->pr_res_type = 0;
|
||||
dev->dev_pr_res_holder->pr_res_scope = 0;
|
||||
dev->dev_pr_res_holder->pr_res_holder = 0;
|
||||
dev->dev_pr_res_holder = NULL;
|
||||
}
|
||||
if (!unreg)
|
||||
goto out;
|
||||
|
||||
pr_debug("SPC-3 PR [%s] Service Action: %s RELEASE cleared"
|
||||
" reservation holder TYPE: %s ALL_TG_PT: %d\n",
|
||||
tfo->get_fabric_name(), (explicit) ? "explicit" : "implicit",
|
||||
core_scsi3_pr_dump_type(pr_reg->pr_res_type),
|
||||
(pr_reg->pr_reg_all_tg_pt) ? 1 : 0);
|
||||
spin_lock(&dev->t10_pr.registration_lock);
|
||||
list_del_init(&pr_reg->pr_reg_list);
|
||||
/*
|
||||
* If the I_T nexus is a reservation holder, the persistent reservation
|
||||
* is of an all registrants type, and the I_T nexus is the last remaining
|
||||
* registered I_T nexus, then the device server shall also release the
|
||||
* persistent reservation.
|
||||
*/
|
||||
if (!list_empty(&dev->t10_pr.registration_list) &&
|
||||
((pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) ||
|
||||
(pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG))) {
|
||||
dev->dev_pr_res_holder =
|
||||
list_entry(dev->t10_pr.registration_list.next,
|
||||
struct t10_pr_registration, pr_reg_list);
|
||||
dev->dev_pr_res_holder->pr_res_type = pr_res_type;
|
||||
dev->dev_pr_res_holder->pr_res_scope = pr_res_scope;
|
||||
dev->dev_pr_res_holder->pr_res_holder = 1;
|
||||
}
|
||||
spin_unlock(&dev->t10_pr.registration_lock);
|
||||
out:
|
||||
if (!dev->dev_pr_res_holder) {
|
||||
pr_debug("SPC-3 PR [%s] Service Action: %s RELEASE cleared"
|
||||
" reservation holder TYPE: %s ALL_TG_PT: %d\n",
|
||||
tfo->get_fabric_name(), (explicit) ? "explicit" :
|
||||
"implicit", core_scsi3_pr_dump_type(pr_res_type),
|
||||
(pr_reg->pr_reg_all_tg_pt) ? 1 : 0);
|
||||
}
|
||||
pr_debug("SPC-3 PR [%s] RELEASE Node: %s%s\n",
|
||||
tfo->get_fabric_name(), se_nacl->initiatorname,
|
||||
i_buf);
|
||||
@@ -2553,7 +2611,7 @@ core_scsi3_emulate_pro_release(struct se_cmd *cmd, int type, int scope,
|
||||
* server shall not establish a unit attention condition.
|
||||
*/
|
||||
__core_scsi3_complete_pro_release(dev, se_sess->se_node_acl,
|
||||
pr_reg, 1);
|
||||
pr_reg, 1, 0);
|
||||
|
||||
spin_unlock(&dev->dev_reservation_lock);
|
||||
|
||||
@@ -2641,7 +2699,7 @@ core_scsi3_emulate_pro_clear(struct se_cmd *cmd, u64 res_key)
|
||||
if (pr_res_holder) {
|
||||
struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
|
||||
__core_scsi3_complete_pro_release(dev, pr_res_nacl,
|
||||
pr_res_holder, 0);
|
||||
pr_res_holder, 0, 0);
|
||||
}
|
||||
spin_unlock(&dev->dev_reservation_lock);
|
||||
/*
|
||||
@@ -2700,7 +2758,7 @@ static void __core_scsi3_complete_pro_preempt(
|
||||
*/
|
||||
if (dev->dev_pr_res_holder)
|
||||
__core_scsi3_complete_pro_release(dev, nacl,
|
||||
dev->dev_pr_res_holder, 0);
|
||||
dev->dev_pr_res_holder, 0, 0);
|
||||
|
||||
dev->dev_pr_res_holder = pr_reg;
|
||||
pr_reg->pr_res_holder = 1;
|
||||
@@ -2944,8 +3002,8 @@ core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int scope, u64 res_key,
|
||||
*/
|
||||
if (pr_reg_n != pr_res_holder)
|
||||
__core_scsi3_complete_pro_release(dev,
|
||||
pr_res_holder->pr_reg_nacl,
|
||||
dev->dev_pr_res_holder, 0);
|
||||
pr_res_holder->pr_reg_nacl,
|
||||
dev->dev_pr_res_holder, 0, 0);
|
||||
/*
|
||||
* b) Remove the registrations for all I_T nexuses identified
|
||||
* by the SERVICE ACTION RESERVATION KEY field, except the
|
||||
@@ -3415,7 +3473,7 @@ after_iport_check:
|
||||
* holder (i.e., the I_T nexus on which the
|
||||
*/
|
||||
__core_scsi3_complete_pro_release(dev, pr_res_nacl,
|
||||
dev->dev_pr_res_holder, 0);
|
||||
dev->dev_pr_res_holder, 0, 0);
|
||||
/*
|
||||
* g) Move the persistent reservation to the specified I_T nexus using
|
||||
* the same scope and type as the persistent reservation released in
|
||||
@@ -3855,7 +3913,8 @@ core_scsi3_pri_read_full_status(struct se_cmd *cmd)
|
||||
unsigned char *buf;
|
||||
u32 add_desc_len = 0, add_len = 0, desc_len, exp_desc_len;
|
||||
u32 off = 8; /* off into first Full Status descriptor */
|
||||
int format_code = 0;
|
||||
int format_code = 0, pr_res_type = 0, pr_res_scope = 0;
|
||||
bool all_reg = false;
|
||||
|
||||
if (cmd->data_length < 8) {
|
||||
pr_err("PRIN SA READ_FULL_STATUS SCSI Data Length: %u"
|
||||
@@ -3872,6 +3931,19 @@ core_scsi3_pri_read_full_status(struct se_cmd *cmd)
|
||||
buf[2] = ((dev->t10_pr.pr_generation >> 8) & 0xff);
|
||||
buf[3] = (dev->t10_pr.pr_generation & 0xff);
|
||||
|
||||
spin_lock(&dev->dev_reservation_lock);
|
||||
if (dev->dev_pr_res_holder) {
|
||||
struct t10_pr_registration *pr_holder = dev->dev_pr_res_holder;
|
||||
|
||||
if (pr_holder->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG ||
|
||||
pr_holder->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG) {
|
||||
all_reg = true;
|
||||
pr_res_type = pr_holder->pr_res_type;
|
||||
pr_res_scope = pr_holder->pr_res_scope;
|
||||
}
|
||||
}
|
||||
spin_unlock(&dev->dev_reservation_lock);
|
||||
|
||||
spin_lock(&pr_tmpl->registration_lock);
|
||||
list_for_each_entry_safe(pr_reg, pr_reg_tmp,
|
||||
&pr_tmpl->registration_list, pr_reg_list) {
|
||||
@@ -3921,14 +3993,20 @@ core_scsi3_pri_read_full_status(struct se_cmd *cmd)
|
||||
* reservation holder for PR_HOLDER bit.
|
||||
*
|
||||
* Also, if this registration is the reservation
|
||||
* holder, fill in SCOPE and TYPE in the next byte.
|
||||
* holder or there is an All Registrants reservation
|
||||
* active, fill in SCOPE and TYPE in the next byte.
|
||||
*/
|
||||
if (pr_reg->pr_res_holder) {
|
||||
buf[off++] |= 0x01;
|
||||
buf[off++] = (pr_reg->pr_res_scope & 0xf0) |
|
||||
(pr_reg->pr_res_type & 0x0f);
|
||||
} else
|
||||
} else if (all_reg) {
|
||||
buf[off++] |= 0x01;
|
||||
buf[off++] = (pr_res_scope & 0xf0) |
|
||||
(pr_res_type & 0x0f);
|
||||
} else {
|
||||
off += 2;
|
||||
}
|
||||
|
||||
off += 4; /* Skip over reserved area */
|
||||
/*
|
||||
|
||||
@@ -1111,7 +1111,7 @@ static u32 pscsi_get_device_type(struct se_device *dev)
|
||||
struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
|
||||
struct scsi_device *sd = pdv->pdv_sd;
|
||||
|
||||
return sd->type;
|
||||
return (sd) ? sd->type : TYPE_NO_LUN;
|
||||
}
|
||||
|
||||
static sector_t pscsi_get_blocks(struct se_device *dev)
|
||||
|
||||
@@ -2327,6 +2327,10 @@ int target_get_sess_cmd(struct se_session *se_sess, struct se_cmd *se_cmd,
|
||||
list_add_tail(&se_cmd->se_cmd_list, &se_sess->sess_cmd_list);
|
||||
out:
|
||||
spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
|
||||
|
||||
if (ret && ack_kref)
|
||||
target_put_sess_cmd(se_sess, se_cmd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(target_get_sess_cmd);
|
||||
|
||||
@@ -346,7 +346,7 @@ void ft_invl_hw_context(struct ft_cmd *cmd)
|
||||
ep = fc_seq_exch(seq);
|
||||
if (ep) {
|
||||
lport = ep->lp;
|
||||
if (lport && (ep->xid <= lport->lro_xid))
|
||||
if (lport && (ep->xid <= lport->lro_xid)) {
|
||||
/*
|
||||
* "ddp_done" trigger invalidation of HW
|
||||
* specific DDP context
|
||||
@@ -361,6 +361,7 @@ void ft_invl_hw_context(struct ft_cmd *cmd)
|
||||
* identified using ep->xid)
|
||||
*/
|
||||
cmd->was_ddp_setup = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -247,8 +247,6 @@ static void n_tty_write_wakeup(struct tty_struct *tty)
|
||||
|
||||
static void n_tty_check_throttle(struct tty_struct *tty)
|
||||
{
|
||||
if (tty->driver->type == TTY_DRIVER_TYPE_PTY)
|
||||
return;
|
||||
/*
|
||||
* Check the remaining room for the input canonicalization
|
||||
* mode. We don't want to throttle the driver if we're in
|
||||
@@ -1512,23 +1510,6 @@ n_tty_receive_char_lnext(struct tty_struct *tty, unsigned char c, char flag)
|
||||
n_tty_receive_char_flagged(tty, c, flag);
|
||||
}
|
||||
|
||||
/**
|
||||
* n_tty_receive_buf - data receive
|
||||
* @tty: terminal device
|
||||
* @cp: buffer
|
||||
* @fp: flag buffer
|
||||
* @count: characters
|
||||
*
|
||||
* Called by the terminal driver when a block of characters has
|
||||
* been received. This function must be called from soft contexts
|
||||
* not from interrupt context. The driver is responsible for making
|
||||
* calls one at a time and in order (or using flush_to_ldisc)
|
||||
*
|
||||
* n_tty_receive_buf()/producer path:
|
||||
* claims non-exclusive termios_rwsem
|
||||
* publishes read_head and canon_head
|
||||
*/
|
||||
|
||||
static void
|
||||
n_tty_receive_buf_real_raw(struct tty_struct *tty, const unsigned char *cp,
|
||||
char *fp, int count)
|
||||
@@ -1684,24 +1665,85 @@ static void __receive_buf(struct tty_struct *tty, const unsigned char *cp,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* n_tty_receive_buf_common - process input
|
||||
* @tty: device to receive input
|
||||
* @cp: input chars
|
||||
* @fp: flags for each char (if NULL, all chars are TTY_NORMAL)
|
||||
* @count: number of input chars in @cp
|
||||
*
|
||||
* Called by the terminal driver when a block of characters has
|
||||
* been received. This function must be called from soft contexts
|
||||
* not from interrupt context. The driver is responsible for making
|
||||
* calls one at a time and in order (or using flush_to_ldisc)
|
||||
*
|
||||
* Returns the # of input chars from @cp which were processed.
|
||||
*
|
||||
* In canonical mode, the maximum line length is 4096 chars (including
|
||||
* the line termination char); lines longer than 4096 chars are
|
||||
* truncated. After 4095 chars, input data is still processed but
|
||||
* not stored. Overflow processing ensures the tty can always
|
||||
* receive more input until at least one line can be read.
|
||||
*
|
||||
* In non-canonical mode, the read buffer will only accept 4095 chars;
|
||||
* this provides the necessary space for a newline char if the input
|
||||
* mode is switched to canonical.
|
||||
*
|
||||
* Note it is possible for the read buffer to _contain_ 4096 chars
|
||||
* in non-canonical mode: the read buffer could already contain the
|
||||
* maximum canon line of 4096 chars when the mode is switched to
|
||||
* non-canonical.
|
||||
*
|
||||
* n_tty_receive_buf()/producer path:
|
||||
* claims non-exclusive termios_rwsem
|
||||
* publishes commit_head or canon_head
|
||||
*/
|
||||
static int
|
||||
n_tty_receive_buf_common(struct tty_struct *tty, const unsigned char *cp,
|
||||
char *fp, int count, int flow)
|
||||
{
|
||||
struct n_tty_data *ldata = tty->disc_data;
|
||||
int room, n, rcvd = 0;
|
||||
int room, n, rcvd = 0, overflow;
|
||||
|
||||
down_read(&tty->termios_rwsem);
|
||||
|
||||
while (1) {
|
||||
room = receive_room(tty);
|
||||
/*
|
||||
* When PARMRK is set, each input char may take up to 3 chars
|
||||
* in the read buf; reduce the buffer space avail by 3x
|
||||
*
|
||||
* If we are doing input canonicalization, and there are no
|
||||
* pending newlines, let characters through without limit, so
|
||||
* that erase characters will be handled. Other excess
|
||||
* characters will be beeped.
|
||||
*
|
||||
* paired with store in *_copy_from_read_buf() -- guarantees
|
||||
* the consumer has loaded the data in read_buf up to the new
|
||||
* read_tail (so this producer will not overwrite unread data)
|
||||
*/
|
||||
size_t tail = ldata->read_tail;
|
||||
|
||||
room = N_TTY_BUF_SIZE - (ldata->read_head - tail);
|
||||
if (I_PARMRK(tty))
|
||||
room = (room + 2) / 3;
|
||||
room--;
|
||||
if (room <= 0) {
|
||||
overflow = ldata->icanon && ldata->canon_head == tail;
|
||||
if (overflow && room < 0)
|
||||
ldata->read_head--;
|
||||
room = overflow;
|
||||
ldata->no_room = flow && !room;
|
||||
} else
|
||||
overflow = 0;
|
||||
|
||||
n = min(count, room);
|
||||
if (!n) {
|
||||
if (flow && !room)
|
||||
ldata->no_room = 1;
|
||||
if (!n)
|
||||
break;
|
||||
}
|
||||
__receive_buf(tty, cp, fp, n);
|
||||
|
||||
/* ignore parity errors if handling overflow */
|
||||
if (!overflow || !fp || *fp != TTY_PARITY)
|
||||
__receive_buf(tty, cp, fp, n);
|
||||
|
||||
cp += n;
|
||||
if (fp)
|
||||
fp += n;
|
||||
@@ -1710,7 +1752,17 @@ n_tty_receive_buf_common(struct tty_struct *tty, const unsigned char *cp,
|
||||
}
|
||||
|
||||
tty->receive_room = room;
|
||||
n_tty_check_throttle(tty);
|
||||
|
||||
/* Unthrottle if handling overflow on pty */
|
||||
if (tty->driver->type == TTY_DRIVER_TYPE_PTY) {
|
||||
if (overflow) {
|
||||
tty_set_flow_change(tty, TTY_UNTHROTTLE_SAFE);
|
||||
tty_unthrottle_safe(tty);
|
||||
__tty_set_flow_change(tty, 0);
|
||||
}
|
||||
} else
|
||||
n_tty_check_throttle(tty);
|
||||
|
||||
up_read(&tty->termios_rwsem);
|
||||
|
||||
return rcvd;
|
||||
|
||||
@@ -66,7 +66,7 @@ static void moan_device(const char *str, struct pci_dev *dev)
|
||||
"Please send the output of lspci -vv, this\n"
|
||||
"message (0x%04x,0x%04x,0x%04x,0x%04x), the\n"
|
||||
"manufacturer and name of serial board or\n"
|
||||
"modem board to rmk+serial@arm.linux.org.uk.\n",
|
||||
"modem board to <linux-serial@vger.kernel.org>.\n",
|
||||
pci_name(dev), str, dev->vendor, dev->device,
|
||||
dev->subsystem_vendor, dev->subsystem_device);
|
||||
}
|
||||
|
||||
@@ -362,6 +362,9 @@ static void lpuart_setup_watermark(struct lpuart_port *sport)
|
||||
writeb(val | UARTPFIFO_TXFE | UARTPFIFO_RXFE,
|
||||
sport->port.membase + UARTPFIFO);
|
||||
|
||||
/* explicitly clear RDRF */
|
||||
readb(sport->port.membase + UARTSR1);
|
||||
|
||||
/* flush Tx and Rx FIFO */
|
||||
writeb(UARTCFIFO_TXFLUSH | UARTCFIFO_RXFLUSH,
|
||||
sport->port.membase + UARTCFIFO);
|
||||
|
||||
@@ -383,6 +383,10 @@ static void xhci_clear_port_change_bit(struct xhci_hcd *xhci, u16 wValue,
|
||||
status = PORT_PLC;
|
||||
port_change_bit = "link state";
|
||||
break;
|
||||
case USB_PORT_FEAT_C_PORT_CONFIG_ERROR:
|
||||
status = PORT_CEC;
|
||||
port_change_bit = "config error";
|
||||
break;
|
||||
default:
|
||||
/* Should never happen */
|
||||
return;
|
||||
@@ -584,6 +588,8 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd,
|
||||
status |= USB_PORT_STAT_C_LINK_STATE << 16;
|
||||
if ((raw_port_status & PORT_WRC))
|
||||
status |= USB_PORT_STAT_C_BH_RESET << 16;
|
||||
if ((raw_port_status & PORT_CEC))
|
||||
status |= USB_PORT_STAT_C_CONFIG_ERROR << 16;
|
||||
}
|
||||
|
||||
if (hcd->speed != HCD_USB3) {
|
||||
@@ -999,6 +1005,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
||||
case USB_PORT_FEAT_C_OVER_CURRENT:
|
||||
case USB_PORT_FEAT_C_ENABLE:
|
||||
case USB_PORT_FEAT_C_PORT_LINK_STATE:
|
||||
case USB_PORT_FEAT_C_PORT_CONFIG_ERROR:
|
||||
xhci_clear_port_change_bit(xhci, wValue, wIndex,
|
||||
port_array[wIndex], temp);
|
||||
break;
|
||||
@@ -1063,7 +1070,7 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf)
|
||||
*/
|
||||
status = bus_state->resuming_ports;
|
||||
|
||||
mask = PORT_CSC | PORT_PEC | PORT_OCC | PORT_PLC | PORT_WRC;
|
||||
mask = PORT_CSC | PORT_PEC | PORT_OCC | PORT_PLC | PORT_WRC | PORT_CEC;
|
||||
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
/* For each port, did anything change? If so, set that bit in buf. */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user