This is the 5.4.237 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmQUF8AACgkQONu9yGCS aT7Ivg/9HDcZ73/ntBZYD5TCbUl8yEEFqaqhb6vBdzC/Uba8CJNgeM91ti0GB0x0 Zue4GNrlP7NQzYV+E9pnTXxagAKxtQfZJc/kJmBbbpXgisJWJlgQ4aqtoRoXnCE1 1NwRVQlyVjmPG/AvU7p1jGUdw6Or/OEhMz+kN89XtUiAI2uCuPxM7W02zWxCZtQy EHonZ4nqhE6mQpAvYpwJ9x11hnAmnJNMOJQI+S/aL6M2geZ6lIblOG7+D8F4Vbz6 nsNQ9LguJ89ffuZe7W3kXvLwqDBZingURxh4r70hNwcmDSNw0o3VpDfL+znUmixw g1TfuFR4zBp4vB9WOFQBlZs7XQUE+InQXm79CL62l5b01JgvoGxPBwguBsjyuBJI 9b/bWOcgRsDNKjLwhql3yj8SIN5a7csjofN5BqsZqihXSdoKc1mmHQHzf8NzS+HU 5juQGDtvFGqXj6L0N/PDTBH8cOhjqyao+1FPdIWlL1XNI0XekCVncakrx0HNxiPv YTXnETEIf13bfIjY88UcoigGTz/4rULO2G2ykwZQdP+F+r3U1BFHaxM9nd7aQaS6 LoabYP/mlIoYUN/Kc0FI+Pp6052+IU70LFAm0urYqJ7RBvRolWn/arpK2PbXdVO4 Z5D2fGuX/E5ZCBm4l5PSIQgfOEdRqQr9roIN0tfVjSQn6y+n3ww= =nqJu -----END PGP SIGNATURE----- Merge 5.4.237 into android11-5.4-lts Changes in 5.4.237 fs: prevent out-of-bounds array speculation when closing a file descriptor x86/CPU/AMD: Disable XSAVES on AMD family 0x17 drm/connector: print max_requested_bpc in state debugfs ext4: fix RENAME_WHITEOUT handling for inline directories ext4: fix another off-by-one fsmap error on 1k block filesystems ext4: move where set the MAY_INLINE_DATA flag is set ext4: fix WARNING in ext4_update_inline_data ext4: zero i_disksize when initializing the bootloader inode nfc: change order inside nfc_se_io error path iommu/amd: Add PCI segment support for ivrs_[ioapic/hpet/acpihid] commands iommu/amd: Fix ill-formed ivrs_ioapic, ivrs_hpet and ivrs_acpihid options iommu/amd: Add a length limitation for the ivrs_acpihid command-line parameter ipmi:ssif: make ssif_i2c_send() void ipmi:ssif: resend_msg() cannot fail ipmi:ssif: Remove rtc_us_timer ipmi:ssif: Increase the message retry time ipmi:ssif: Add a timer between request retries irqdomain: Change the type of 'size' in __irq_domain_add() to be consistent irqdomain: Fix domain registration race iommu/vt-d: Fix PASID directory pointer coherency SMB3: Backup intent flag missing from some more ops cifs: Fix uninitialized memory read in smb3_qfs_tcon() scsi: core: Remove the /proc/scsi/${proc_name} directory earlier ext4: Fix possible corruption when moving a directory drm/msm/a5xx: fix setting of the CP_PREEMPT_ENABLE_LOCAL register nfc: fdp: add null check of devm_kmalloc_array in fdp_nci_i2c_read_device_properties ila: do not generate empty messages in ila_xlat_nl_cmd_get_mapping() selftests: nft_nat: ensuring the listening side is up before starting the client net: usb: lan78xx: Remove lots of set but unused 'ret' variables net: lan78xx: fix accessing the LAN7800's internal phy specific registers from the MAC driver net: caif: Fix use-after-free in cfusbl_device_notify() bnxt_en: Avoid order-5 memory allocation for TPA data netfilter: tproxy: fix deadlock due to missing BH disable btf: fix resolving BTF_KIND_VAR after ARRAY, STRUCT, UNION, PTR scsi: megaraid_sas: Update max supported LD IDs to 240 net/smc: fix fallback failed while sendmsg with fastopen riscv: Use READ_ONCE_NOCHECK in imprecise unwinding stack mode ext4: Fix deadlock during directory rename MIPS: Fix a compilation issue alpha: fix R_ALPHA_LITERAL reloc for large modules macintosh: windfarm: Use unsigned type for 1-bit bitfields PCI: Add SolidRun vendor ID media: ov5640: Fix analogue gain control ipmi/watchdog: replace atomic_add() and atomic_sub() ipmi:watchdog: Set panic count to proper value on a panic drm/i915: Don't use BAR mappings for ring buffers with LLC x86, vmlinux.lds: Add RUNTIME_DISCARD_EXIT to generic DISCARDS arch: fix broken BuildID for arm64 and riscv powerpc/vmlinux.lds: Define RUNTIME_DISCARD_EXIT powerpc/vmlinux.lds: Don't discard .rela* for relocatable builds s390: define RUNTIME_DISCARD_EXIT to fix link error with GNU ld < 2.36 sh: define RUNTIME_DISCARD_EXIT UML: define RUNTIME_DISCARD_EXIT s390/dasd: add missing discipline function Linux 5.4.237 Change-Id: Ic3637e3e33d2e4e109773803306c3941219152d7 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
812963276d
@ -1944,24 +1944,57 @@
|
||||
|
||||
ivrs_ioapic [HW,X86_64]
|
||||
Provide an override to the IOAPIC-ID<->DEVICE-ID
|
||||
mapping provided in the IVRS ACPI table. For
|
||||
example, to map IOAPIC-ID decimal 10 to
|
||||
PCI device 00:14.0 write the parameter as:
|
||||
mapping provided in the IVRS ACPI table.
|
||||
By default, PCI segment is 0, and can be omitted.
|
||||
|
||||
For example, to map IOAPIC-ID decimal 10 to
|
||||
PCI segment 0x1 and PCI device 00:14.0,
|
||||
write the parameter as:
|
||||
ivrs_ioapic=10@0001:00:14.0
|
||||
|
||||
Deprecated formats:
|
||||
* To map IOAPIC-ID decimal 10 to PCI device 00:14.0
|
||||
write the parameter as:
|
||||
ivrs_ioapic[10]=00:14.0
|
||||
* To map IOAPIC-ID decimal 10 to PCI segment 0x1 and
|
||||
PCI device 00:14.0 write the parameter as:
|
||||
ivrs_ioapic[10]=0001:00:14.0
|
||||
|
||||
ivrs_hpet [HW,X86_64]
|
||||
Provide an override to the HPET-ID<->DEVICE-ID
|
||||
mapping provided in the IVRS ACPI table. For
|
||||
example, to map HPET-ID decimal 0 to
|
||||
PCI device 00:14.0 write the parameter as:
|
||||
mapping provided in the IVRS ACPI table.
|
||||
By default, PCI segment is 0, and can be omitted.
|
||||
|
||||
For example, to map HPET-ID decimal 10 to
|
||||
PCI segment 0x1 and PCI device 00:14.0,
|
||||
write the parameter as:
|
||||
ivrs_hpet=10@0001:00:14.0
|
||||
|
||||
Deprecated formats:
|
||||
* To map HPET-ID decimal 0 to PCI device 00:14.0
|
||||
write the parameter as:
|
||||
ivrs_hpet[0]=00:14.0
|
||||
* To map HPET-ID decimal 10 to PCI segment 0x1 and
|
||||
PCI device 00:14.0 write the parameter as:
|
||||
ivrs_ioapic[10]=0001:00:14.0
|
||||
|
||||
ivrs_acpihid [HW,X86_64]
|
||||
Provide an override to the ACPI-HID:UID<->DEVICE-ID
|
||||
mapping provided in the IVRS ACPI table. For
|
||||
example, to map UART-HID:UID AMD0020:0 to
|
||||
PCI device 00:14.5 write the parameter as:
|
||||
mapping provided in the IVRS ACPI table.
|
||||
By default, PCI segment is 0, and can be omitted.
|
||||
|
||||
For example, to map UART-HID:UID AMD0020:0 to
|
||||
PCI segment 0x1 and PCI device ID 00:14.5,
|
||||
write the parameter as:
|
||||
ivrs_acpihid=AMD0020:0@0001:00:14.5
|
||||
|
||||
Deprecated formats:
|
||||
* To map UART-HID:UID AMD0020:0 to PCI segment is 0,
|
||||
PCI device ID 00:14.5, write the parameter as:
|
||||
ivrs_acpihid[00:14.5]=AMD0020:0
|
||||
* To map UART-HID:UID AMD0020:0 to PCI segment 0x1 and
|
||||
PCI device ID 00:14.5, write the parameter as:
|
||||
ivrs_acpihid[0001:00:14.5]=AMD0020:0
|
||||
|
||||
js= [HW,JOY] Analog joystick
|
||||
See Documentation/input/joydev/joystick.rst.
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 236
|
||||
SUBLEVEL = 237
|
||||
EXTRAVERSION =
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
|
@ -146,10 +146,8 @@ apply_relocate_add(Elf64_Shdr *sechdrs, const char *strtab,
|
||||
base = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr;
|
||||
symtab = (Elf64_Sym *)sechdrs[symindex].sh_addr;
|
||||
|
||||
/* The small sections were sorted to the end of the segment.
|
||||
The following should definitely cover them. */
|
||||
gp = (u64)me->core_layout.base + me->core_layout.size - 0x8000;
|
||||
got = sechdrs[me->arch.gotsecindex].sh_addr;
|
||||
gp = got + 0x8000;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
unsigned long r_sym = ELF64_R_SYM (rela[i].r_info);
|
||||
|
@ -377,7 +377,7 @@ struct pci_msu {
|
||||
PCI_CFG04_STAT_SSE | \
|
||||
PCI_CFG04_STAT_PE)
|
||||
|
||||
#define KORINA_CNFG1 ((KORINA_STAT<<16)|KORINA_CMD)
|
||||
#define KORINA_CNFG1 (KORINA_STAT | KORINA_CMD)
|
||||
|
||||
#define KORINA_REVID 0
|
||||
#define KORINA_CLASS_CODE 0
|
||||
|
@ -6,6 +6,7 @@
|
||||
#endif
|
||||
|
||||
#define BSS_FIRST_SECTIONS *(.bss.prominit)
|
||||
#define RUNTIME_DISCARD_EXIT
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <asm-generic/vmlinux.lds.h>
|
||||
@ -394,9 +395,12 @@ SECTIONS
|
||||
DISCARDS
|
||||
/DISCARD/ : {
|
||||
*(*.EMB.apuinfo)
|
||||
*(.glink .iplt .plt .rela* .comment)
|
||||
*(.glink .iplt .plt .comment)
|
||||
*(.gnu.version*)
|
||||
*(.gnu.attributes)
|
||||
*(.eh_frame)
|
||||
#ifndef CONFIG_RELOCATABLE
|
||||
*(.rela*)
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -89,7 +89,7 @@ void notrace walk_stackframe(struct task_struct *task,
|
||||
while (!kstack_end(ksp)) {
|
||||
if (__kernel_text_address(pc) && unlikely(fn(pc, arg)))
|
||||
break;
|
||||
pc = (*ksp++) - 0x4;
|
||||
pc = READ_ONCE_NOCHECK(*ksp++) - 0x4;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -15,6 +15,8 @@
|
||||
/* Handle ro_after_init data on our own. */
|
||||
#define RO_AFTER_INIT_DATA
|
||||
|
||||
#define RUNTIME_DISCARD_EXIT
|
||||
|
||||
#include <asm-generic/vmlinux.lds.h>
|
||||
#include <asm/vmlinux.lds.h>
|
||||
|
||||
|
@ -10,6 +10,7 @@ OUTPUT_ARCH(sh:sh5)
|
||||
#define LOAD_OFFSET 0
|
||||
OUTPUT_ARCH(sh)
|
||||
#endif
|
||||
#define RUNTIME_DISCARD_EXIT
|
||||
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/cache.h>
|
||||
|
@ -1,4 +1,4 @@
|
||||
|
||||
#define RUNTIME_DISCARD_EXIT
|
||||
KERNEL_STACK_SIZE = 4096 * (1 << CONFIG_KERNEL_STACK_ORDER);
|
||||
|
||||
#ifdef CONFIG_LD_SCRIPT_STATIC
|
||||
|
@ -205,6 +205,15 @@ static void init_amd_k6(struct cpuinfo_x86 *c)
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* Work around Erratum 1386. The XSAVES instruction malfunctions in
|
||||
* certain circumstances on Zen1/2 uarch, and not all parts have had
|
||||
* updated microcode at the time of writing (March 2023).
|
||||
*
|
||||
* Affected parts all have no supervisor XSAVE states, meaning that
|
||||
* the XSAVEC instruction (which works fine) is equivalent.
|
||||
*/
|
||||
clear_cpu_cap(c, X86_FEATURE_XSAVES);
|
||||
}
|
||||
|
||||
static void init_amd_k7(struct cpuinfo_x86 *c)
|
||||
|
@ -21,6 +21,8 @@
|
||||
#define LOAD_OFFSET __START_KERNEL_map
|
||||
#endif
|
||||
|
||||
#define RUNTIME_DISCARD_EXIT
|
||||
|
||||
#include <asm-generic/vmlinux.lds.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/thread_info.h>
|
||||
|
@ -79,7 +79,8 @@
|
||||
/*
|
||||
* Timer values
|
||||
*/
|
||||
#define SSIF_MSG_USEC 20000 /* 20ms between message tries. */
|
||||
#define SSIF_MSG_USEC 60000 /* 60ms between message tries (T3). */
|
||||
#define SSIF_REQ_RETRY_USEC 60000 /* 60ms between send retries (T6). */
|
||||
#define SSIF_MSG_PART_USEC 5000 /* 5ms for a message part */
|
||||
|
||||
/* How many times to we retry sending/receiving the message. */
|
||||
@ -87,7 +88,9 @@
|
||||
#define SSIF_RECV_RETRIES 250
|
||||
|
||||
#define SSIF_MSG_MSEC (SSIF_MSG_USEC / 1000)
|
||||
#define SSIF_REQ_RETRY_MSEC (SSIF_REQ_RETRY_USEC / 1000)
|
||||
#define SSIF_MSG_JIFFIES ((SSIF_MSG_USEC * 1000) / TICK_NSEC)
|
||||
#define SSIF_REQ_RETRY_JIFFIES ((SSIF_REQ_RETRY_USEC * 1000) / TICK_NSEC)
|
||||
#define SSIF_MSG_PART_JIFFIES ((SSIF_MSG_PART_USEC * 1000) / TICK_NSEC)
|
||||
|
||||
/*
|
||||
@ -236,6 +239,9 @@ struct ssif_info {
|
||||
bool got_alert;
|
||||
bool waiting_alert;
|
||||
|
||||
/* Used to inform the timeout that it should do a resend. */
|
||||
bool do_resend;
|
||||
|
||||
/*
|
||||
* If set to true, this will request events the next time the
|
||||
* state machine is idle.
|
||||
@ -248,12 +254,6 @@ struct ssif_info {
|
||||
*/
|
||||
bool req_flags;
|
||||
|
||||
/*
|
||||
* Used to perform timer operations when run-to-completion
|
||||
* mode is on. This is a countdown timer.
|
||||
*/
|
||||
int rtc_us_timer;
|
||||
|
||||
/* Used for sending/receiving data. +1 for the length. */
|
||||
unsigned char data[IPMI_MAX_MSG_LENGTH + 1];
|
||||
unsigned int data_len;
|
||||
@ -515,7 +515,7 @@ static int ipmi_ssif_thread(void *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ssif_i2c_send(struct ssif_info *ssif_info,
|
||||
static void ssif_i2c_send(struct ssif_info *ssif_info,
|
||||
ssif_i2c_done handler,
|
||||
int read_write, int command,
|
||||
unsigned char *data, unsigned int size)
|
||||
@ -527,7 +527,6 @@ static int ssif_i2c_send(struct ssif_info *ssif_info,
|
||||
ssif_info->i2c_data = data;
|
||||
ssif_info->i2c_size = size;
|
||||
complete(&ssif_info->wake_thread);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -536,40 +535,35 @@ static void msg_done_handler(struct ssif_info *ssif_info, int result,
|
||||
|
||||
static void start_get(struct ssif_info *ssif_info)
|
||||
{
|
||||
int rv;
|
||||
|
||||
ssif_info->rtc_us_timer = 0;
|
||||
ssif_info->multi_pos = 0;
|
||||
|
||||
rv = ssif_i2c_send(ssif_info, msg_done_handler, I2C_SMBUS_READ,
|
||||
SSIF_IPMI_RESPONSE,
|
||||
ssif_info->recv, I2C_SMBUS_BLOCK_DATA);
|
||||
if (rv < 0) {
|
||||
/* request failed, just return the error. */
|
||||
if (ssif_info->ssif_debug & SSIF_DEBUG_MSG)
|
||||
dev_dbg(&ssif_info->client->dev,
|
||||
"Error from i2c_non_blocking_op(5)\n");
|
||||
|
||||
msg_done_handler(ssif_info, -EIO, NULL, 0);
|
||||
}
|
||||
ssif_i2c_send(ssif_info, msg_done_handler, I2C_SMBUS_READ,
|
||||
SSIF_IPMI_RESPONSE,
|
||||
ssif_info->recv, I2C_SMBUS_BLOCK_DATA);
|
||||
}
|
||||
|
||||
static void start_resend(struct ssif_info *ssif_info);
|
||||
|
||||
static void retry_timeout(struct timer_list *t)
|
||||
{
|
||||
struct ssif_info *ssif_info = from_timer(ssif_info, t, retry_timer);
|
||||
unsigned long oflags, *flags;
|
||||
bool waiting;
|
||||
bool waiting, resend;
|
||||
|
||||
if (ssif_info->stopping)
|
||||
return;
|
||||
|
||||
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
|
||||
resend = ssif_info->do_resend;
|
||||
ssif_info->do_resend = false;
|
||||
waiting = ssif_info->waiting_alert;
|
||||
ssif_info->waiting_alert = false;
|
||||
ipmi_ssif_unlock_cond(ssif_info, flags);
|
||||
|
||||
if (waiting)
|
||||
start_get(ssif_info);
|
||||
if (resend)
|
||||
start_resend(ssif_info);
|
||||
}
|
||||
|
||||
static void watch_timeout(struct timer_list *t)
|
||||
@ -618,14 +612,11 @@ static void ssif_alert(struct i2c_client *client, enum i2c_alert_protocol type,
|
||||
start_get(ssif_info);
|
||||
}
|
||||
|
||||
static int start_resend(struct ssif_info *ssif_info);
|
||||
|
||||
static void msg_done_handler(struct ssif_info *ssif_info, int result,
|
||||
unsigned char *data, unsigned int len)
|
||||
{
|
||||
struct ipmi_smi_msg *msg;
|
||||
unsigned long oflags, *flags;
|
||||
int rv;
|
||||
|
||||
/*
|
||||
* We are single-threaded here, so no need for a lock until we
|
||||
@ -639,7 +630,6 @@ static void msg_done_handler(struct ssif_info *ssif_info, int result,
|
||||
|
||||
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
|
||||
ssif_info->waiting_alert = true;
|
||||
ssif_info->rtc_us_timer = SSIF_MSG_USEC;
|
||||
if (!ssif_info->stopping)
|
||||
mod_timer(&ssif_info->retry_timer,
|
||||
jiffies + SSIF_MSG_JIFFIES);
|
||||
@ -671,17 +661,10 @@ static void msg_done_handler(struct ssif_info *ssif_info, int result,
|
||||
ssif_info->multi_len = len;
|
||||
ssif_info->multi_pos = 1;
|
||||
|
||||
rv = ssif_i2c_send(ssif_info, msg_done_handler, I2C_SMBUS_READ,
|
||||
SSIF_IPMI_MULTI_PART_RESPONSE_MIDDLE,
|
||||
ssif_info->recv, I2C_SMBUS_BLOCK_DATA);
|
||||
if (rv < 0) {
|
||||
if (ssif_info->ssif_debug & SSIF_DEBUG_MSG)
|
||||
dev_dbg(&ssif_info->client->dev,
|
||||
"Error from i2c_non_blocking_op(1)\n");
|
||||
|
||||
result = -EIO;
|
||||
} else
|
||||
return;
|
||||
ssif_i2c_send(ssif_info, msg_done_handler, I2C_SMBUS_READ,
|
||||
SSIF_IPMI_MULTI_PART_RESPONSE_MIDDLE,
|
||||
ssif_info->recv, I2C_SMBUS_BLOCK_DATA);
|
||||
return;
|
||||
} else if (ssif_info->multi_pos) {
|
||||
/* Middle of multi-part read. Start the next transaction. */
|
||||
int i;
|
||||
@ -743,19 +726,12 @@ static void msg_done_handler(struct ssif_info *ssif_info, int result,
|
||||
|
||||
ssif_info->multi_pos++;
|
||||
|
||||
rv = ssif_i2c_send(ssif_info, msg_done_handler,
|
||||
I2C_SMBUS_READ,
|
||||
SSIF_IPMI_MULTI_PART_RESPONSE_MIDDLE,
|
||||
ssif_info->recv,
|
||||
I2C_SMBUS_BLOCK_DATA);
|
||||
if (rv < 0) {
|
||||
if (ssif_info->ssif_debug & SSIF_DEBUG_MSG)
|
||||
dev_dbg(&ssif_info->client->dev,
|
||||
"Error from ssif_i2c_send\n");
|
||||
|
||||
result = -EIO;
|
||||
} else
|
||||
return;
|
||||
ssif_i2c_send(ssif_info, msg_done_handler,
|
||||
I2C_SMBUS_READ,
|
||||
SSIF_IPMI_MULTI_PART_RESPONSE_MIDDLE,
|
||||
ssif_info->recv,
|
||||
I2C_SMBUS_BLOCK_DATA);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@ -936,37 +912,27 @@ static void msg_done_handler(struct ssif_info *ssif_info, int result,
|
||||
static void msg_written_handler(struct ssif_info *ssif_info, int result,
|
||||
unsigned char *data, unsigned int len)
|
||||
{
|
||||
int rv;
|
||||
|
||||
/* We are single-threaded here, so no need for a lock. */
|
||||
if (result < 0) {
|
||||
ssif_info->retries_left--;
|
||||
if (ssif_info->retries_left > 0) {
|
||||
if (!start_resend(ssif_info)) {
|
||||
ssif_inc_stat(ssif_info, send_retries);
|
||||
return;
|
||||
}
|
||||
/* request failed, just return the error. */
|
||||
ssif_inc_stat(ssif_info, send_errors);
|
||||
|
||||
if (ssif_info->ssif_debug & SSIF_DEBUG_MSG)
|
||||
dev_dbg(&ssif_info->client->dev,
|
||||
"%s: Out of retries\n", __func__);
|
||||
msg_done_handler(ssif_info, -EIO, NULL, 0);
|
||||
/*
|
||||
* Wait the retry timeout time per the spec,
|
||||
* then redo the send.
|
||||
*/
|
||||
ssif_info->do_resend = true;
|
||||
mod_timer(&ssif_info->retry_timer,
|
||||
jiffies + SSIF_REQ_RETRY_JIFFIES);
|
||||
return;
|
||||
}
|
||||
|
||||
ssif_inc_stat(ssif_info, send_errors);
|
||||
|
||||
/*
|
||||
* Got an error on transmit, let the done routine
|
||||
* handle it.
|
||||
*/
|
||||
if (ssif_info->ssif_debug & SSIF_DEBUG_MSG)
|
||||
dev_dbg(&ssif_info->client->dev,
|
||||
"%s: Error %d\n", __func__, result);
|
||||
"%s: Out of retries\n", __func__);
|
||||
|
||||
msg_done_handler(ssif_info, result, NULL, 0);
|
||||
msg_done_handler(ssif_info, -EIO, NULL, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1000,18 +966,9 @@ static void msg_written_handler(struct ssif_info *ssif_info, int result,
|
||||
ssif_info->multi_data = NULL;
|
||||
}
|
||||
|
||||
rv = ssif_i2c_send(ssif_info, msg_written_handler,
|
||||
I2C_SMBUS_WRITE, cmd,
|
||||
data_to_send, I2C_SMBUS_BLOCK_DATA);
|
||||
if (rv < 0) {
|
||||
/* request failed, just return the error. */
|
||||
ssif_inc_stat(ssif_info, send_errors);
|
||||
|
||||
if (ssif_info->ssif_debug & SSIF_DEBUG_MSG)
|
||||
dev_dbg(&ssif_info->client->dev,
|
||||
"Error from i2c_non_blocking_op(3)\n");
|
||||
msg_done_handler(ssif_info, -EIO, NULL, 0);
|
||||
}
|
||||
ssif_i2c_send(ssif_info, msg_written_handler,
|
||||
I2C_SMBUS_WRITE, cmd,
|
||||
data_to_send, I2C_SMBUS_BLOCK_DATA);
|
||||
} else {
|
||||
/* Ready to request the result. */
|
||||
unsigned long oflags, *flags;
|
||||
@ -1029,7 +986,6 @@ static void msg_written_handler(struct ssif_info *ssif_info, int result,
|
||||
/* Wait a jiffie then request the next message */
|
||||
ssif_info->waiting_alert = true;
|
||||
ssif_info->retries_left = SSIF_RECV_RETRIES;
|
||||
ssif_info->rtc_us_timer = SSIF_MSG_PART_USEC;
|
||||
if (!ssif_info->stopping)
|
||||
mod_timer(&ssif_info->retry_timer,
|
||||
jiffies + SSIF_MSG_PART_JIFFIES);
|
||||
@ -1038,9 +994,8 @@ static void msg_written_handler(struct ssif_info *ssif_info, int result,
|
||||
}
|
||||
}
|
||||
|
||||
static int start_resend(struct ssif_info *ssif_info)
|
||||
static void start_resend(struct ssif_info *ssif_info)
|
||||
{
|
||||
int rv;
|
||||
int command;
|
||||
|
||||
ssif_info->got_alert = false;
|
||||
@ -1062,12 +1017,8 @@ static int start_resend(struct ssif_info *ssif_info)
|
||||
ssif_info->data[0] = ssif_info->data_len;
|
||||
}
|
||||
|
||||
rv = ssif_i2c_send(ssif_info, msg_written_handler, I2C_SMBUS_WRITE,
|
||||
command, ssif_info->data, I2C_SMBUS_BLOCK_DATA);
|
||||
if (rv && (ssif_info->ssif_debug & SSIF_DEBUG_MSG))
|
||||
dev_dbg(&ssif_info->client->dev,
|
||||
"Error from i2c_non_blocking_op(4)\n");
|
||||
return rv;
|
||||
ssif_i2c_send(ssif_info, msg_written_handler, I2C_SMBUS_WRITE,
|
||||
command, ssif_info->data, I2C_SMBUS_BLOCK_DATA);
|
||||
}
|
||||
|
||||
static int start_send(struct ssif_info *ssif_info,
|
||||
@ -1082,7 +1033,8 @@ static int start_send(struct ssif_info *ssif_info,
|
||||
ssif_info->retries_left = SSIF_SEND_RETRIES;
|
||||
memcpy(ssif_info->data + 1, data, len);
|
||||
ssif_info->data_len = len;
|
||||
return start_resend(ssif_info);
|
||||
start_resend(ssif_info);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Must be called with the message lock held. */
|
||||
@ -1382,8 +1334,10 @@ static int do_cmd(struct i2c_client *client, int len, unsigned char *msg,
|
||||
ret = i2c_smbus_write_block_data(client, SSIF_IPMI_REQUEST, len, msg);
|
||||
if (ret) {
|
||||
retry_cnt--;
|
||||
if (retry_cnt > 0)
|
||||
if (retry_cnt > 0) {
|
||||
msleep(SSIF_REQ_RETRY_MSEC);
|
||||
goto retry1;
|
||||
}
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@ -1523,8 +1477,10 @@ retry_write:
|
||||
32, msg);
|
||||
if (ret) {
|
||||
retry_cnt--;
|
||||
if (retry_cnt > 0)
|
||||
if (retry_cnt > 0) {
|
||||
msleep(SSIF_REQ_RETRY_MSEC);
|
||||
goto retry_write;
|
||||
}
|
||||
dev_err(&client->dev, "Could not write multi-part start, though the BMC said it could handle it. Just limit sends to one part.\n");
|
||||
return ret;
|
||||
}
|
||||
|
@ -498,7 +498,7 @@ static void panic_halt_ipmi_heartbeat(void)
|
||||
msg.cmd = IPMI_WDOG_RESET_TIMER;
|
||||
msg.data = NULL;
|
||||
msg.data_len = 0;
|
||||
atomic_add(1, &panic_done_count);
|
||||
atomic_add(2, &panic_done_count);
|
||||
rv = ipmi_request_supply_msgs(watchdog_user,
|
||||
(struct ipmi_addr *) &addr,
|
||||
0,
|
||||
@ -508,7 +508,7 @@ static void panic_halt_ipmi_heartbeat(void)
|
||||
&panic_halt_heartbeat_recv_msg,
|
||||
1);
|
||||
if (rv)
|
||||
atomic_sub(1, &panic_done_count);
|
||||
atomic_sub(2, &panic_done_count);
|
||||
}
|
||||
|
||||
static struct ipmi_smi_msg panic_halt_smi_msg = {
|
||||
@ -532,12 +532,12 @@ static void panic_halt_ipmi_set_timeout(void)
|
||||
/* Wait for the messages to be free. */
|
||||
while (atomic_read(&panic_done_count) != 0)
|
||||
ipmi_poll_interface(watchdog_user);
|
||||
atomic_add(1, &panic_done_count);
|
||||
atomic_add(2, &panic_done_count);
|
||||
rv = __ipmi_set_timeout(&panic_halt_smi_msg,
|
||||
&panic_halt_recv_msg,
|
||||
&send_heartbeat_now);
|
||||
if (rv) {
|
||||
atomic_sub(1, &panic_done_count);
|
||||
atomic_sub(2, &panic_done_count);
|
||||
pr_warn("Unable to extend the watchdog timeout\n");
|
||||
} else {
|
||||
if (send_heartbeat_now)
|
||||
|
@ -1006,6 +1006,7 @@ static void drm_atomic_connector_print_state(struct drm_printer *p,
|
||||
drm_printf(p, "connector[%u]: %s\n", connector->base.id, connector->name);
|
||||
drm_printf(p, "\tcrtc=%s\n", state->crtc ? state->crtc->name : "(null)");
|
||||
drm_printf(p, "\tself_refresh_aware=%d\n", state->self_refresh_aware);
|
||||
drm_printf(p, "\tmax_requested_bpc=%d\n", state->max_requested_bpc);
|
||||
|
||||
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
|
||||
if (state->writeback_job && state->writeback_job->fb)
|
||||
|
@ -1208,7 +1208,7 @@ int intel_ring_pin(struct intel_ring *ring)
|
||||
if (unlikely(ret))
|
||||
goto err_unpin;
|
||||
|
||||
if (i915_vma_is_map_and_fenceable(vma))
|
||||
if (i915_vma_is_map_and_fenceable(vma) && !HAS_LLC(vma->vm->i915))
|
||||
addr = (void __force *)i915_vma_pin_iomap(vma);
|
||||
else
|
||||
addr = i915_gem_object_pin_map(vma->obj,
|
||||
@ -1252,7 +1252,7 @@ void intel_ring_unpin(struct intel_ring *ring)
|
||||
intel_ring_reset(ring, ring->emit);
|
||||
|
||||
i915_vma_unset_ggtt_write(vma);
|
||||
if (i915_vma_is_map_and_fenceable(vma))
|
||||
if (i915_vma_is_map_and_fenceable(vma) && !HAS_LLC(vma->vm->i915))
|
||||
i915_vma_unpin_iomap(vma);
|
||||
else
|
||||
i915_gem_object_unpin_map(vma->obj);
|
||||
|
@ -135,8 +135,8 @@ static void a5xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
|
||||
OUT_RING(ring, 1);
|
||||
|
||||
/* Enable local preemption for finegrain preemption */
|
||||
OUT_PKT7(ring, CP_PREEMPT_ENABLE_GLOBAL, 1);
|
||||
OUT_RING(ring, 0x02);
|
||||
OUT_PKT7(ring, CP_PREEMPT_ENABLE_LOCAL, 1);
|
||||
OUT_RING(ring, 0x1);
|
||||
|
||||
/* Allow CP_CONTEXT_SWITCH_YIELD packets in the IB2 */
|
||||
OUT_PKT7(ring, CP_YIELD_ENABLE, 1);
|
||||
|
@ -84,6 +84,10 @@
|
||||
#define ACPI_DEVFLAG_ATSDIS 0x10000000
|
||||
|
||||
#define LOOP_TIMEOUT 2000000
|
||||
|
||||
#define IVRS_GET_SBDF_ID(seg, bus, dev, fd) (((seg & 0xffff) << 16) | ((bus & 0xff) << 8) \
|
||||
| ((dev & 0x1f) << 3) | (fn & 0x7))
|
||||
|
||||
/*
|
||||
* ACPI table definitions
|
||||
*
|
||||
@ -2971,24 +2975,32 @@ static int __init parse_amd_iommu_options(char *str)
|
||||
|
||||
static int __init parse_ivrs_ioapic(char *str)
|
||||
{
|
||||
unsigned int bus, dev, fn;
|
||||
int ret, id, i;
|
||||
u16 devid;
|
||||
u32 seg = 0, bus, dev, fn;
|
||||
int id, i;
|
||||
u32 devid;
|
||||
|
||||
ret = sscanf(str, "[%d]=%x:%x.%x", &id, &bus, &dev, &fn);
|
||||
if (sscanf(str, "=%d@%x:%x.%x", &id, &bus, &dev, &fn) == 4 ||
|
||||
sscanf(str, "=%d@%x:%x:%x.%x", &id, &seg, &bus, &dev, &fn) == 5)
|
||||
goto found;
|
||||
|
||||
if (ret != 4) {
|
||||
pr_err("Invalid command line: ivrs_ioapic%s\n", str);
|
||||
return 1;
|
||||
if (sscanf(str, "[%d]=%x:%x.%x", &id, &bus, &dev, &fn) == 4 ||
|
||||
sscanf(str, "[%d]=%x:%x:%x.%x", &id, &seg, &bus, &dev, &fn) == 5) {
|
||||
pr_warn("ivrs_ioapic%s option format deprecated; use ivrs_ioapic=%d@%04x:%02x:%02x.%d instead\n",
|
||||
str, id, seg, bus, dev, fn);
|
||||
goto found;
|
||||
}
|
||||
|
||||
pr_err("Invalid command line: ivrs_ioapic%s\n", str);
|
||||
return 1;
|
||||
|
||||
found:
|
||||
if (early_ioapic_map_size == EARLY_MAP_SIZE) {
|
||||
pr_err("Early IOAPIC map overflow - ignoring ivrs_ioapic%s\n",
|
||||
str);
|
||||
return 1;
|
||||
}
|
||||
|
||||
devid = ((bus & 0xff) << 8) | ((dev & 0x1f) << 3) | (fn & 0x7);
|
||||
devid = IVRS_GET_SBDF_ID(seg, bus, dev, fn);
|
||||
|
||||
cmdline_maps = true;
|
||||
i = early_ioapic_map_size++;
|
||||
@ -3001,24 +3013,32 @@ static int __init parse_ivrs_ioapic(char *str)
|
||||
|
||||
static int __init parse_ivrs_hpet(char *str)
|
||||
{
|
||||
unsigned int bus, dev, fn;
|
||||
int ret, id, i;
|
||||
u16 devid;
|
||||
u32 seg = 0, bus, dev, fn;
|
||||
int id, i;
|
||||
u32 devid;
|
||||
|
||||
ret = sscanf(str, "[%d]=%x:%x.%x", &id, &bus, &dev, &fn);
|
||||
if (sscanf(str, "=%d@%x:%x.%x", &id, &bus, &dev, &fn) == 4 ||
|
||||
sscanf(str, "=%d@%x:%x:%x.%x", &id, &seg, &bus, &dev, &fn) == 5)
|
||||
goto found;
|
||||
|
||||
if (ret != 4) {
|
||||
pr_err("Invalid command line: ivrs_hpet%s\n", str);
|
||||
return 1;
|
||||
if (sscanf(str, "[%d]=%x:%x.%x", &id, &bus, &dev, &fn) == 4 ||
|
||||
sscanf(str, "[%d]=%x:%x:%x.%x", &id, &seg, &bus, &dev, &fn) == 5) {
|
||||
pr_warn("ivrs_hpet%s option format deprecated; use ivrs_hpet=%d@%04x:%02x:%02x.%d instead\n",
|
||||
str, id, seg, bus, dev, fn);
|
||||
goto found;
|
||||
}
|
||||
|
||||
pr_err("Invalid command line: ivrs_hpet%s\n", str);
|
||||
return 1;
|
||||
|
||||
found:
|
||||
if (early_hpet_map_size == EARLY_MAP_SIZE) {
|
||||
pr_err("Early HPET map overflow - ignoring ivrs_hpet%s\n",
|
||||
str);
|
||||
return 1;
|
||||
}
|
||||
|
||||
devid = ((bus & 0xff) << 8) | ((dev & 0x1f) << 3) | (fn & 0x7);
|
||||
devid = IVRS_GET_SBDF_ID(seg, bus, dev, fn);
|
||||
|
||||
cmdline_maps = true;
|
||||
i = early_hpet_map_size++;
|
||||
@ -3029,19 +3049,53 @@ static int __init parse_ivrs_hpet(char *str)
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define ACPIID_LEN (ACPIHID_UID_LEN + ACPIHID_HID_LEN)
|
||||
|
||||
static int __init parse_ivrs_acpihid(char *str)
|
||||
{
|
||||
u32 bus, dev, fn;
|
||||
char *hid, *uid, *p;
|
||||
char acpiid[ACPIHID_UID_LEN + ACPIHID_HID_LEN] = {0};
|
||||
int ret, i;
|
||||
u32 seg = 0, bus, dev, fn;
|
||||
char *hid, *uid, *p, *addr;
|
||||
char acpiid[ACPIID_LEN] = {0};
|
||||
int i;
|
||||
|
||||
ret = sscanf(str, "[%x:%x.%x]=%s", &bus, &dev, &fn, acpiid);
|
||||
if (ret != 4) {
|
||||
pr_err("Invalid command line: ivrs_acpihid(%s)\n", str);
|
||||
return 1;
|
||||
addr = strchr(str, '@');
|
||||
if (!addr) {
|
||||
addr = strchr(str, '=');
|
||||
if (!addr)
|
||||
goto not_found;
|
||||
|
||||
++addr;
|
||||
|
||||
if (strlen(addr) > ACPIID_LEN)
|
||||
goto not_found;
|
||||
|
||||
if (sscanf(str, "[%x:%x.%x]=%s", &bus, &dev, &fn, acpiid) == 4 ||
|
||||
sscanf(str, "[%x:%x:%x.%x]=%s", &seg, &bus, &dev, &fn, acpiid) == 5) {
|
||||
pr_warn("ivrs_acpihid%s option format deprecated; use ivrs_acpihid=%s@%04x:%02x:%02x.%d instead\n",
|
||||
str, acpiid, seg, bus, dev, fn);
|
||||
goto found;
|
||||
}
|
||||
goto not_found;
|
||||
}
|
||||
|
||||
/* We have the '@', make it the terminator to get just the acpiid */
|
||||
*addr++ = 0;
|
||||
|
||||
if (strlen(str) > ACPIID_LEN + 1)
|
||||
goto not_found;
|
||||
|
||||
if (sscanf(str, "=%s", acpiid) != 1)
|
||||
goto not_found;
|
||||
|
||||
if (sscanf(addr, "%x:%x.%x", &bus, &dev, &fn) == 3 ||
|
||||
sscanf(addr, "%x:%x:%x.%x", &seg, &bus, &dev, &fn) == 4)
|
||||
goto found;
|
||||
|
||||
not_found:
|
||||
pr_err("Invalid command line: ivrs_acpihid%s\n", str);
|
||||
return 1;
|
||||
|
||||
found:
|
||||
p = acpiid;
|
||||
hid = strsep(&p, ":");
|
||||
uid = p;
|
||||
@ -3061,8 +3115,7 @@ static int __init parse_ivrs_acpihid(char *str)
|
||||
i = early_acpihid_map_size++;
|
||||
memcpy(early_acpihid_map[i].hid, hid, strlen(hid));
|
||||
memcpy(early_acpihid_map[i].uid, uid, strlen(uid));
|
||||
early_acpihid_map[i].devid =
|
||||
((bus & 0xff) << 8) | ((dev & 0x1f) << 3) | (fn & 0x7);
|
||||
early_acpihid_map[i].devid = IVRS_GET_SBDF_ID(seg, bus, dev, fn);
|
||||
early_acpihid_map[i].cmd_line = true;
|
||||
|
||||
return 1;
|
||||
|
@ -166,6 +166,9 @@ int intel_pasid_alloc_table(struct device *dev)
|
||||
attach_out:
|
||||
device_attach_pasid_table(info, pasid_table);
|
||||
|
||||
if (!ecap_coherent(info->iommu->ecap))
|
||||
clflush_cache_range(pasid_table->table, size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -250,6 +253,10 @@ struct pasid_entry *intel_pasid_get_entry(struct device *dev, int pasid)
|
||||
|
||||
WRITE_ONCE(dir[dir_index].val,
|
||||
(u64)virt_to_phys(entries) | PASID_PTE_PRESENT);
|
||||
if (!ecap_coherent(info->iommu->ecap)) {
|
||||
clflush_cache_range(entries, VTD_PAGE_SIZE);
|
||||
clflush_cache_range(&dir[dir_index].val, sizeof(*dir));
|
||||
}
|
||||
}
|
||||
spin_unlock(&pasid_lock);
|
||||
|
||||
|
@ -34,8 +34,8 @@
|
||||
#endif
|
||||
|
||||
struct wf_lm75_sensor {
|
||||
int ds1775 : 1;
|
||||
int inited : 1;
|
||||
unsigned int ds1775 : 1;
|
||||
unsigned int inited : 1;
|
||||
struct i2c_client *i2c;
|
||||
struct wf_sensor sens;
|
||||
};
|
||||
|
@ -273,8 +273,8 @@ struct smu_cpu_power_sensor {
|
||||
struct list_head link;
|
||||
struct wf_sensor *volts;
|
||||
struct wf_sensor *amps;
|
||||
int fake_volts : 1;
|
||||
int quadratic : 1;
|
||||
unsigned int fake_volts : 1;
|
||||
unsigned int quadratic : 1;
|
||||
struct wf_sensor sens;
|
||||
};
|
||||
#define to_smu_cpu_power(c) container_of(c, struct smu_cpu_power_sensor, sens)
|
||||
|
@ -2704,7 +2704,7 @@ static int ov5640_init_controls(struct ov5640_dev *sensor)
|
||||
/* Auto/manual gain */
|
||||
ctrls->auto_gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_AUTOGAIN,
|
||||
0, 1, 1, 1);
|
||||
ctrls->gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_GAIN,
|
||||
ctrls->gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_ANALOGUE_GAIN,
|
||||
0, 1023, 1, 0);
|
||||
|
||||
ctrls->saturation = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_SATURATION,
|
||||
|
@ -2747,7 +2747,7 @@ static int bnxt_alloc_ring(struct bnxt *bp, struct bnxt_ring_mem_info *rmem)
|
||||
|
||||
static void bnxt_free_tpa_info(struct bnxt *bp)
|
||||
{
|
||||
int i;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < bp->rx_nr_rings; i++) {
|
||||
struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
|
||||
@ -2755,8 +2755,10 @@ static void bnxt_free_tpa_info(struct bnxt *bp)
|
||||
kfree(rxr->rx_tpa_idx_map);
|
||||
rxr->rx_tpa_idx_map = NULL;
|
||||
if (rxr->rx_tpa) {
|
||||
kfree(rxr->rx_tpa[0].agg_arr);
|
||||
rxr->rx_tpa[0].agg_arr = NULL;
|
||||
for (j = 0; j < bp->max_tpa; j++) {
|
||||
kfree(rxr->rx_tpa[j].agg_arr);
|
||||
rxr->rx_tpa[j].agg_arr = NULL;
|
||||
}
|
||||
}
|
||||
kfree(rxr->rx_tpa);
|
||||
rxr->rx_tpa = NULL;
|
||||
@ -2765,14 +2767,13 @@ static void bnxt_free_tpa_info(struct bnxt *bp)
|
||||
|
||||
static int bnxt_alloc_tpa_info(struct bnxt *bp)
|
||||
{
|
||||
int i, j, total_aggs = 0;
|
||||
int i, j;
|
||||
|
||||
bp->max_tpa = MAX_TPA;
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P5) {
|
||||
if (!bp->max_tpa_v2)
|
||||
return 0;
|
||||
bp->max_tpa = max_t(u16, bp->max_tpa_v2, MAX_TPA_P5);
|
||||
total_aggs = bp->max_tpa * MAX_SKB_FRAGS;
|
||||
}
|
||||
|
||||
for (i = 0; i < bp->rx_nr_rings; i++) {
|
||||
@ -2786,12 +2787,12 @@ static int bnxt_alloc_tpa_info(struct bnxt *bp)
|
||||
|
||||
if (!(bp->flags & BNXT_FLAG_CHIP_P5))
|
||||
continue;
|
||||
agg = kcalloc(total_aggs, sizeof(*agg), GFP_KERNEL);
|
||||
rxr->rx_tpa[0].agg_arr = agg;
|
||||
if (!agg)
|
||||
return -ENOMEM;
|
||||
for (j = 1; j < bp->max_tpa; j++)
|
||||
rxr->rx_tpa[j].agg_arr = agg + j * MAX_SKB_FRAGS;
|
||||
for (j = 0; j < bp->max_tpa; j++) {
|
||||
agg = kcalloc(MAX_SKB_FRAGS, sizeof(*agg), GFP_KERNEL);
|
||||
if (!agg)
|
||||
return -ENOMEM;
|
||||
rxr->rx_tpa[j].agg_arr = agg;
|
||||
}
|
||||
rxr->rx_tpa_idx_map = kzalloc(sizeof(*rxr->rx_tpa_idx_map),
|
||||
GFP_KERNEL);
|
||||
if (!rxr->rx_tpa_idx_map)
|
||||
|
@ -326,6 +326,37 @@ static int lan88xx_config_aneg(struct phy_device *phydev)
|
||||
return genphy_config_aneg(phydev);
|
||||
}
|
||||
|
||||
static void lan88xx_link_change_notify(struct phy_device *phydev)
|
||||
{
|
||||
int temp;
|
||||
|
||||
/* At forced 100 F/H mode, chip may fail to set mode correctly
|
||||
* when cable is switched between long(~50+m) and short one.
|
||||
* As workaround, set to 10 before setting to 100
|
||||
* at forced 100 F/H mode.
|
||||
*/
|
||||
if (!phydev->autoneg && phydev->speed == 100) {
|
||||
/* disable phy interrupt */
|
||||
temp = phy_read(phydev, LAN88XX_INT_MASK);
|
||||
temp &= ~LAN88XX_INT_MASK_MDINTPIN_EN_;
|
||||
phy_write(phydev, LAN88XX_INT_MASK, temp);
|
||||
|
||||
temp = phy_read(phydev, MII_BMCR);
|
||||
temp &= ~(BMCR_SPEED100 | BMCR_SPEED1000);
|
||||
phy_write(phydev, MII_BMCR, temp); /* set to 10 first */
|
||||
temp |= BMCR_SPEED100;
|
||||
phy_write(phydev, MII_BMCR, temp); /* set to 100 later */
|
||||
|
||||
/* clear pending interrupt generated while workaround */
|
||||
temp = phy_read(phydev, LAN88XX_INT_STS);
|
||||
|
||||
/* enable phy interrupt back */
|
||||
temp = phy_read(phydev, LAN88XX_INT_MASK);
|
||||
temp |= LAN88XX_INT_MASK_MDINTPIN_EN_;
|
||||
phy_write(phydev, LAN88XX_INT_MASK, temp);
|
||||
}
|
||||
}
|
||||
|
||||
static struct phy_driver microchip_phy_driver[] = {
|
||||
{
|
||||
.phy_id = 0x0007c130,
|
||||
@ -339,6 +370,7 @@ static struct phy_driver microchip_phy_driver[] = {
|
||||
|
||||
.config_init = lan88xx_config_init,
|
||||
.config_aneg = lan88xx_config_aneg,
|
||||
.link_change_notify = lan88xx_link_change_notify,
|
||||
|
||||
.ack_interrupt = lan88xx_phy_ack_interrupt,
|
||||
.config_intr = lan88xx_phy_config_intr,
|
||||
|
@ -824,20 +824,19 @@ static int lan78xx_read_raw_otp(struct lan78xx_net *dev, u32 offset,
|
||||
u32 length, u8 *data)
|
||||
{
|
||||
int i;
|
||||
int ret;
|
||||
u32 buf;
|
||||
unsigned long timeout;
|
||||
|
||||
ret = lan78xx_read_reg(dev, OTP_PWR_DN, &buf);
|
||||
lan78xx_read_reg(dev, OTP_PWR_DN, &buf);
|
||||
|
||||
if (buf & OTP_PWR_DN_PWRDN_N_) {
|
||||
/* clear it and wait to be cleared */
|
||||
ret = lan78xx_write_reg(dev, OTP_PWR_DN, 0);
|
||||
lan78xx_write_reg(dev, OTP_PWR_DN, 0);
|
||||
|
||||
timeout = jiffies + HZ;
|
||||
do {
|
||||
usleep_range(1, 10);
|
||||
ret = lan78xx_read_reg(dev, OTP_PWR_DN, &buf);
|
||||
lan78xx_read_reg(dev, OTP_PWR_DN, &buf);
|
||||
if (time_after(jiffies, timeout)) {
|
||||
netdev_warn(dev->net,
|
||||
"timeout on OTP_PWR_DN");
|
||||
@ -847,18 +846,18 @@ static int lan78xx_read_raw_otp(struct lan78xx_net *dev, u32 offset,
|
||||
}
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
ret = lan78xx_write_reg(dev, OTP_ADDR1,
|
||||
lan78xx_write_reg(dev, OTP_ADDR1,
|
||||
((offset + i) >> 8) & OTP_ADDR1_15_11);
|
||||
ret = lan78xx_write_reg(dev, OTP_ADDR2,
|
||||
lan78xx_write_reg(dev, OTP_ADDR2,
|
||||
((offset + i) & OTP_ADDR2_10_3));
|
||||
|
||||
ret = lan78xx_write_reg(dev, OTP_FUNC_CMD, OTP_FUNC_CMD_READ_);
|
||||
ret = lan78xx_write_reg(dev, OTP_CMD_GO, OTP_CMD_GO_GO_);
|
||||
lan78xx_write_reg(dev, OTP_FUNC_CMD, OTP_FUNC_CMD_READ_);
|
||||
lan78xx_write_reg(dev, OTP_CMD_GO, OTP_CMD_GO_GO_);
|
||||
|
||||
timeout = jiffies + HZ;
|
||||
do {
|
||||
udelay(1);
|
||||
ret = lan78xx_read_reg(dev, OTP_STATUS, &buf);
|
||||
lan78xx_read_reg(dev, OTP_STATUS, &buf);
|
||||
if (time_after(jiffies, timeout)) {
|
||||
netdev_warn(dev->net,
|
||||
"timeout on OTP_STATUS");
|
||||
@ -866,7 +865,7 @@ static int lan78xx_read_raw_otp(struct lan78xx_net *dev, u32 offset,
|
||||
}
|
||||
} while (buf & OTP_STATUS_BUSY_);
|
||||
|
||||
ret = lan78xx_read_reg(dev, OTP_RD_DATA, &buf);
|
||||
lan78xx_read_reg(dev, OTP_RD_DATA, &buf);
|
||||
|
||||
data[i] = (u8)(buf & 0xFF);
|
||||
}
|
||||
@ -878,20 +877,19 @@ static int lan78xx_write_raw_otp(struct lan78xx_net *dev, u32 offset,
|
||||
u32 length, u8 *data)
|
||||
{
|
||||
int i;
|
||||
int ret;
|
||||
u32 buf;
|
||||
unsigned long timeout;
|
||||
|
||||
ret = lan78xx_read_reg(dev, OTP_PWR_DN, &buf);
|
||||
lan78xx_read_reg(dev, OTP_PWR_DN, &buf);
|
||||
|
||||
if (buf & OTP_PWR_DN_PWRDN_N_) {
|
||||
/* clear it and wait to be cleared */
|
||||
ret = lan78xx_write_reg(dev, OTP_PWR_DN, 0);
|
||||
lan78xx_write_reg(dev, OTP_PWR_DN, 0);
|
||||
|
||||
timeout = jiffies + HZ;
|
||||
do {
|
||||
udelay(1);
|
||||
ret = lan78xx_read_reg(dev, OTP_PWR_DN, &buf);
|
||||
lan78xx_read_reg(dev, OTP_PWR_DN, &buf);
|
||||
if (time_after(jiffies, timeout)) {
|
||||
netdev_warn(dev->net,
|
||||
"timeout on OTP_PWR_DN completion");
|
||||
@ -901,21 +899,21 @@ static int lan78xx_write_raw_otp(struct lan78xx_net *dev, u32 offset,
|
||||
}
|
||||
|
||||
/* set to BYTE program mode */
|
||||
ret = lan78xx_write_reg(dev, OTP_PRGM_MODE, OTP_PRGM_MODE_BYTE_);
|
||||
lan78xx_write_reg(dev, OTP_PRGM_MODE, OTP_PRGM_MODE_BYTE_);
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
ret = lan78xx_write_reg(dev, OTP_ADDR1,
|
||||
lan78xx_write_reg(dev, OTP_ADDR1,
|
||||
((offset + i) >> 8) & OTP_ADDR1_15_11);
|
||||
ret = lan78xx_write_reg(dev, OTP_ADDR2,
|
||||
lan78xx_write_reg(dev, OTP_ADDR2,
|
||||
((offset + i) & OTP_ADDR2_10_3));
|
||||
ret = lan78xx_write_reg(dev, OTP_PRGM_DATA, data[i]);
|
||||
ret = lan78xx_write_reg(dev, OTP_TST_CMD, OTP_TST_CMD_PRGVRFY_);
|
||||
ret = lan78xx_write_reg(dev, OTP_CMD_GO, OTP_CMD_GO_GO_);
|
||||
lan78xx_write_reg(dev, OTP_PRGM_DATA, data[i]);
|
||||
lan78xx_write_reg(dev, OTP_TST_CMD, OTP_TST_CMD_PRGVRFY_);
|
||||
lan78xx_write_reg(dev, OTP_CMD_GO, OTP_CMD_GO_GO_);
|
||||
|
||||
timeout = jiffies + HZ;
|
||||
do {
|
||||
udelay(1);
|
||||
ret = lan78xx_read_reg(dev, OTP_STATUS, &buf);
|
||||
lan78xx_read_reg(dev, OTP_STATUS, &buf);
|
||||
if (time_after(jiffies, timeout)) {
|
||||
netdev_warn(dev->net,
|
||||
"Timeout on OTP_STATUS completion");
|
||||
@ -1040,7 +1038,6 @@ static void lan78xx_deferred_multicast_write(struct work_struct *param)
|
||||
container_of(param, struct lan78xx_priv, set_multicast);
|
||||
struct lan78xx_net *dev = pdata->dev;
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
netif_dbg(dev, drv, dev->net, "deferred multicast write 0x%08x\n",
|
||||
pdata->rfe_ctl);
|
||||
@ -1049,14 +1046,14 @@ static void lan78xx_deferred_multicast_write(struct work_struct *param)
|
||||
DP_SEL_VHF_HASH_LEN, pdata->mchash_table);
|
||||
|
||||
for (i = 1; i < NUM_OF_MAF; i++) {
|
||||
ret = lan78xx_write_reg(dev, MAF_HI(i), 0);
|
||||
ret = lan78xx_write_reg(dev, MAF_LO(i),
|
||||
lan78xx_write_reg(dev, MAF_HI(i), 0);
|
||||
lan78xx_write_reg(dev, MAF_LO(i),
|
||||
pdata->pfilter_table[i][1]);
|
||||
ret = lan78xx_write_reg(dev, MAF_HI(i),
|
||||
lan78xx_write_reg(dev, MAF_HI(i),
|
||||
pdata->pfilter_table[i][0]);
|
||||
}
|
||||
|
||||
ret = lan78xx_write_reg(dev, RFE_CTL, pdata->rfe_ctl);
|
||||
lan78xx_write_reg(dev, RFE_CTL, pdata->rfe_ctl);
|
||||
}
|
||||
|
||||
static void lan78xx_set_multicast(struct net_device *netdev)
|
||||
@ -1126,7 +1123,6 @@ static int lan78xx_update_flowcontrol(struct lan78xx_net *dev, u8 duplex,
|
||||
u16 lcladv, u16 rmtadv)
|
||||
{
|
||||
u32 flow = 0, fct_flow = 0;
|
||||
int ret;
|
||||
u8 cap;
|
||||
|
||||
if (dev->fc_autoneg)
|
||||
@ -1149,10 +1145,10 @@ static int lan78xx_update_flowcontrol(struct lan78xx_net *dev, u8 duplex,
|
||||
(cap & FLOW_CTRL_RX ? "enabled" : "disabled"),
|
||||
(cap & FLOW_CTRL_TX ? "enabled" : "disabled"));
|
||||
|
||||
ret = lan78xx_write_reg(dev, FCT_FLOW, fct_flow);
|
||||
lan78xx_write_reg(dev, FCT_FLOW, fct_flow);
|
||||
|
||||
/* threshold value should be set before enabling flow */
|
||||
ret = lan78xx_write_reg(dev, FLOW, flow);
|
||||
lan78xx_write_reg(dev, FLOW, flow);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1681,11 +1677,10 @@ static int lan78xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
|
||||
static void lan78xx_init_mac_address(struct lan78xx_net *dev)
|
||||
{
|
||||
u32 addr_lo, addr_hi;
|
||||
int ret;
|
||||
u8 addr[6];
|
||||
|
||||
ret = lan78xx_read_reg(dev, RX_ADDRL, &addr_lo);
|
||||
ret = lan78xx_read_reg(dev, RX_ADDRH, &addr_hi);
|
||||
lan78xx_read_reg(dev, RX_ADDRL, &addr_lo);
|
||||
lan78xx_read_reg(dev, RX_ADDRH, &addr_hi);
|
||||
|
||||
addr[0] = addr_lo & 0xFF;
|
||||
addr[1] = (addr_lo >> 8) & 0xFF;
|
||||
@ -1718,12 +1713,12 @@ static void lan78xx_init_mac_address(struct lan78xx_net *dev)
|
||||
(addr[2] << 16) | (addr[3] << 24);
|
||||
addr_hi = addr[4] | (addr[5] << 8);
|
||||
|
||||
ret = lan78xx_write_reg(dev, RX_ADDRL, addr_lo);
|
||||
ret = lan78xx_write_reg(dev, RX_ADDRH, addr_hi);
|
||||
lan78xx_write_reg(dev, RX_ADDRL, addr_lo);
|
||||
lan78xx_write_reg(dev, RX_ADDRH, addr_hi);
|
||||
}
|
||||
|
||||
ret = lan78xx_write_reg(dev, MAF_LO(0), addr_lo);
|
||||
ret = lan78xx_write_reg(dev, MAF_HI(0), addr_hi | MAF_HI_VALID_);
|
||||
lan78xx_write_reg(dev, MAF_LO(0), addr_lo);
|
||||
lan78xx_write_reg(dev, MAF_HI(0), addr_hi | MAF_HI_VALID_);
|
||||
|
||||
ether_addr_copy(dev->net->dev_addr, addr);
|
||||
}
|
||||
@ -1856,33 +1851,8 @@ static void lan78xx_remove_mdio(struct lan78xx_net *dev)
|
||||
static void lan78xx_link_status_change(struct net_device *net)
|
||||
{
|
||||
struct phy_device *phydev = net->phydev;
|
||||
int ret, temp;
|
||||
|
||||
/* At forced 100 F/H mode, chip may fail to set mode correctly
|
||||
* when cable is switched between long(~50+m) and short one.
|
||||
* As workaround, set to 10 before setting to 100
|
||||
* at forced 100 F/H mode.
|
||||
*/
|
||||
if (!phydev->autoneg && (phydev->speed == 100)) {
|
||||
/* disable phy interrupt */
|
||||
temp = phy_read(phydev, LAN88XX_INT_MASK);
|
||||
temp &= ~LAN88XX_INT_MASK_MDINTPIN_EN_;
|
||||
ret = phy_write(phydev, LAN88XX_INT_MASK, temp);
|
||||
|
||||
temp = phy_read(phydev, MII_BMCR);
|
||||
temp &= ~(BMCR_SPEED100 | BMCR_SPEED1000);
|
||||
phy_write(phydev, MII_BMCR, temp); /* set to 10 first */
|
||||
temp |= BMCR_SPEED100;
|
||||
phy_write(phydev, MII_BMCR, temp); /* set to 100 later */
|
||||
|
||||
/* clear pending interrupt generated while workaround */
|
||||
temp = phy_read(phydev, LAN88XX_INT_STS);
|
||||
|
||||
/* enable phy interrupt back */
|
||||
temp = phy_read(phydev, LAN88XX_INT_MASK);
|
||||
temp |= LAN88XX_INT_MASK_MDINTPIN_EN_;
|
||||
ret = phy_write(phydev, LAN88XX_INT_MASK, temp);
|
||||
}
|
||||
phy_print_status(phydev);
|
||||
}
|
||||
|
||||
static int irq_map(struct irq_domain *d, unsigned int irq,
|
||||
@ -1935,14 +1905,13 @@ static void lan78xx_irq_bus_sync_unlock(struct irq_data *irqd)
|
||||
struct lan78xx_net *dev =
|
||||
container_of(data, struct lan78xx_net, domain_data);
|
||||
u32 buf;
|
||||
int ret;
|
||||
|
||||
/* call register access here because irq_bus_lock & irq_bus_sync_unlock
|
||||
* are only two callbacks executed in non-atomic contex.
|
||||
*/
|
||||
ret = lan78xx_read_reg(dev, INT_EP_CTL, &buf);
|
||||
lan78xx_read_reg(dev, INT_EP_CTL, &buf);
|
||||
if (buf != data->irqenable)
|
||||
ret = lan78xx_write_reg(dev, INT_EP_CTL, data->irqenable);
|
||||
lan78xx_write_reg(dev, INT_EP_CTL, data->irqenable);
|
||||
|
||||
mutex_unlock(&data->irq_lock);
|
||||
}
|
||||
@ -2009,7 +1978,6 @@ static void lan78xx_remove_irq_domain(struct lan78xx_net *dev)
|
||||
static int lan8835_fixup(struct phy_device *phydev)
|
||||
{
|
||||
int buf;
|
||||
int ret;
|
||||
struct lan78xx_net *dev = netdev_priv(phydev->attached_dev);
|
||||
|
||||
/* LED2/PME_N/IRQ_N/RGMII_ID pin to IRQ_N mode */
|
||||
@ -2019,11 +1987,11 @@ static int lan8835_fixup(struct phy_device *phydev)
|
||||
phy_write_mmd(phydev, MDIO_MMD_PCS, 0x8010, buf);
|
||||
|
||||
/* RGMII MAC TXC Delay Enable */
|
||||
ret = lan78xx_write_reg(dev, MAC_RGMII_ID,
|
||||
lan78xx_write_reg(dev, MAC_RGMII_ID,
|
||||
MAC_RGMII_ID_TXC_DELAY_EN_);
|
||||
|
||||
/* RGMII TX DLL Tune Adjust */
|
||||
ret = lan78xx_write_reg(dev, RGMII_TX_BYP_DLL, 0x3D00);
|
||||
lan78xx_write_reg(dev, RGMII_TX_BYP_DLL, 0x3D00);
|
||||
|
||||
dev->interface = PHY_INTERFACE_MODE_RGMII_TXID;
|
||||
|
||||
@ -2207,28 +2175,27 @@ static int lan78xx_phy_init(struct lan78xx_net *dev)
|
||||
|
||||
static int lan78xx_set_rx_max_frame_length(struct lan78xx_net *dev, int size)
|
||||
{
|
||||
int ret = 0;
|
||||
u32 buf;
|
||||
bool rxenabled;
|
||||
|
||||
ret = lan78xx_read_reg(dev, MAC_RX, &buf);
|
||||
lan78xx_read_reg(dev, MAC_RX, &buf);
|
||||
|
||||
rxenabled = ((buf & MAC_RX_RXEN_) != 0);
|
||||
|
||||
if (rxenabled) {
|
||||
buf &= ~MAC_RX_RXEN_;
|
||||
ret = lan78xx_write_reg(dev, MAC_RX, buf);
|
||||
lan78xx_write_reg(dev, MAC_RX, buf);
|
||||
}
|
||||
|
||||
/* add 4 to size for FCS */
|
||||
buf &= ~MAC_RX_MAX_SIZE_MASK_;
|
||||
buf |= (((size + 4) << MAC_RX_MAX_SIZE_SHIFT_) & MAC_RX_MAX_SIZE_MASK_);
|
||||
|
||||
ret = lan78xx_write_reg(dev, MAC_RX, buf);
|
||||
lan78xx_write_reg(dev, MAC_RX, buf);
|
||||
|
||||
if (rxenabled) {
|
||||
buf |= MAC_RX_RXEN_;
|
||||
ret = lan78xx_write_reg(dev, MAC_RX, buf);
|
||||
lan78xx_write_reg(dev, MAC_RX, buf);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -2285,13 +2252,12 @@ static int lan78xx_change_mtu(struct net_device *netdev, int new_mtu)
|
||||
int ll_mtu = new_mtu + netdev->hard_header_len;
|
||||
int old_hard_mtu = dev->hard_mtu;
|
||||
int old_rx_urb_size = dev->rx_urb_size;
|
||||
int ret;
|
||||
|
||||
/* no second zero-length packet read wanted after mtu-sized packets */
|
||||
if ((ll_mtu % dev->maxpacket) == 0)
|
||||
return -EDOM;
|
||||
|
||||
ret = lan78xx_set_rx_max_frame_length(dev, new_mtu + VLAN_ETH_HLEN);
|
||||
lan78xx_set_rx_max_frame_length(dev, new_mtu + VLAN_ETH_HLEN);
|
||||
|
||||
netdev->mtu = new_mtu;
|
||||
|
||||
@ -2314,7 +2280,6 @@ static int lan78xx_set_mac_addr(struct net_device *netdev, void *p)
|
||||
struct lan78xx_net *dev = netdev_priv(netdev);
|
||||
struct sockaddr *addr = p;
|
||||
u32 addr_lo, addr_hi;
|
||||
int ret;
|
||||
|
||||
if (netif_running(netdev))
|
||||
return -EBUSY;
|
||||
@ -2331,12 +2296,12 @@ static int lan78xx_set_mac_addr(struct net_device *netdev, void *p)
|
||||
addr_hi = netdev->dev_addr[4] |
|
||||
netdev->dev_addr[5] << 8;
|
||||
|
||||
ret = lan78xx_write_reg(dev, RX_ADDRL, addr_lo);
|
||||
ret = lan78xx_write_reg(dev, RX_ADDRH, addr_hi);
|
||||
lan78xx_write_reg(dev, RX_ADDRL, addr_lo);
|
||||
lan78xx_write_reg(dev, RX_ADDRH, addr_hi);
|
||||
|
||||
/* Added to support MAC address changes */
|
||||
ret = lan78xx_write_reg(dev, MAF_LO(0), addr_lo);
|
||||
ret = lan78xx_write_reg(dev, MAF_HI(0), addr_hi | MAF_HI_VALID_);
|
||||
lan78xx_write_reg(dev, MAF_LO(0), addr_lo);
|
||||
lan78xx_write_reg(dev, MAF_HI(0), addr_hi | MAF_HI_VALID_);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -2348,7 +2313,6 @@ static int lan78xx_set_features(struct net_device *netdev,
|
||||
struct lan78xx_net *dev = netdev_priv(netdev);
|
||||
struct lan78xx_priv *pdata = (struct lan78xx_priv *)(dev->data[0]);
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&pdata->rfe_ctl_lock, flags);
|
||||
|
||||
@ -2372,7 +2336,7 @@ static int lan78xx_set_features(struct net_device *netdev,
|
||||
|
||||
spin_unlock_irqrestore(&pdata->rfe_ctl_lock, flags);
|
||||
|
||||
ret = lan78xx_write_reg(dev, RFE_CTL, pdata->rfe_ctl);
|
||||
lan78xx_write_reg(dev, RFE_CTL, pdata->rfe_ctl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -3828,7 +3792,6 @@ static u16 lan78xx_wakeframe_crc16(const u8 *buf, int len)
|
||||
static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
|
||||
{
|
||||
u32 buf;
|
||||
int ret;
|
||||
int mask_index;
|
||||
u16 crc;
|
||||
u32 temp_wucsr;
|
||||
@ -3837,26 +3800,26 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
|
||||
const u8 ipv6_multicast[3] = { 0x33, 0x33 };
|
||||
const u8 arp_type[2] = { 0x08, 0x06 };
|
||||
|
||||
ret = lan78xx_read_reg(dev, MAC_TX, &buf);
|
||||
lan78xx_read_reg(dev, MAC_TX, &buf);
|
||||
buf &= ~MAC_TX_TXEN_;
|
||||
ret = lan78xx_write_reg(dev, MAC_TX, buf);
|
||||
ret = lan78xx_read_reg(dev, MAC_RX, &buf);
|
||||
lan78xx_write_reg(dev, MAC_TX, buf);
|
||||
lan78xx_read_reg(dev, MAC_RX, &buf);
|
||||
buf &= ~MAC_RX_RXEN_;
|
||||
ret = lan78xx_write_reg(dev, MAC_RX, buf);
|
||||
lan78xx_write_reg(dev, MAC_RX, buf);
|
||||
|
||||
ret = lan78xx_write_reg(dev, WUCSR, 0);
|
||||
ret = lan78xx_write_reg(dev, WUCSR2, 0);
|
||||
ret = lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL);
|
||||
lan78xx_write_reg(dev, WUCSR, 0);
|
||||
lan78xx_write_reg(dev, WUCSR2, 0);
|
||||
lan78xx_write_reg(dev, WK_SRC, 0xFFF1FF1FUL);
|
||||
|
||||
temp_wucsr = 0;
|
||||
|
||||
temp_pmt_ctl = 0;
|
||||
ret = lan78xx_read_reg(dev, PMT_CTL, &temp_pmt_ctl);
|
||||
lan78xx_read_reg(dev, PMT_CTL, &temp_pmt_ctl);
|
||||
temp_pmt_ctl &= ~PMT_CTL_RES_CLR_WKP_EN_;
|
||||
temp_pmt_ctl |= PMT_CTL_RES_CLR_WKP_STS_;
|
||||
|
||||
for (mask_index = 0; mask_index < NUM_OF_WUF_CFG; mask_index++)
|
||||
ret = lan78xx_write_reg(dev, WUF_CFG(mask_index), 0);
|
||||
lan78xx_write_reg(dev, WUF_CFG(mask_index), 0);
|
||||
|
||||
mask_index = 0;
|
||||
if (wol & WAKE_PHY) {
|
||||
@ -3885,30 +3848,30 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
|
||||
|
||||
/* set WUF_CFG & WUF_MASK for IPv4 Multicast */
|
||||
crc = lan78xx_wakeframe_crc16(ipv4_multicast, 3);
|
||||
ret = lan78xx_write_reg(dev, WUF_CFG(mask_index),
|
||||
lan78xx_write_reg(dev, WUF_CFG(mask_index),
|
||||
WUF_CFGX_EN_ |
|
||||
WUF_CFGX_TYPE_MCAST_ |
|
||||
(0 << WUF_CFGX_OFFSET_SHIFT_) |
|
||||
(crc & WUF_CFGX_CRC16_MASK_));
|
||||
|
||||
ret = lan78xx_write_reg(dev, WUF_MASK0(mask_index), 7);
|
||||
ret = lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0);
|
||||
ret = lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0);
|
||||
ret = lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0);
|
||||
lan78xx_write_reg(dev, WUF_MASK0(mask_index), 7);
|
||||
lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0);
|
||||
lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0);
|
||||
lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0);
|
||||
mask_index++;
|
||||
|
||||
/* for IPv6 Multicast */
|
||||
crc = lan78xx_wakeframe_crc16(ipv6_multicast, 2);
|
||||
ret = lan78xx_write_reg(dev, WUF_CFG(mask_index),
|
||||
lan78xx_write_reg(dev, WUF_CFG(mask_index),
|
||||
WUF_CFGX_EN_ |
|
||||
WUF_CFGX_TYPE_MCAST_ |
|
||||
(0 << WUF_CFGX_OFFSET_SHIFT_) |
|
||||
(crc & WUF_CFGX_CRC16_MASK_));
|
||||
|
||||
ret = lan78xx_write_reg(dev, WUF_MASK0(mask_index), 3);
|
||||
ret = lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0);
|
||||
ret = lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0);
|
||||
ret = lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0);
|
||||
lan78xx_write_reg(dev, WUF_MASK0(mask_index), 3);
|
||||
lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0);
|
||||
lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0);
|
||||
lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0);
|
||||
mask_index++;
|
||||
|
||||
temp_pmt_ctl |= PMT_CTL_WOL_EN_;
|
||||
@ -3929,16 +3892,16 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
|
||||
* for packettype (offset 12,13) = ARP (0x0806)
|
||||
*/
|
||||
crc = lan78xx_wakeframe_crc16(arp_type, 2);
|
||||
ret = lan78xx_write_reg(dev, WUF_CFG(mask_index),
|
||||
lan78xx_write_reg(dev, WUF_CFG(mask_index),
|
||||
WUF_CFGX_EN_ |
|
||||
WUF_CFGX_TYPE_ALL_ |
|
||||
(0 << WUF_CFGX_OFFSET_SHIFT_) |
|
||||
(crc & WUF_CFGX_CRC16_MASK_));
|
||||
|
||||
ret = lan78xx_write_reg(dev, WUF_MASK0(mask_index), 0x3000);
|
||||
ret = lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0);
|
||||
ret = lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0);
|
||||
ret = lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0);
|
||||
lan78xx_write_reg(dev, WUF_MASK0(mask_index), 0x3000);
|
||||
lan78xx_write_reg(dev, WUF_MASK1(mask_index), 0);
|
||||
lan78xx_write_reg(dev, WUF_MASK2(mask_index), 0);
|
||||
lan78xx_write_reg(dev, WUF_MASK3(mask_index), 0);
|
||||
mask_index++;
|
||||
|
||||
temp_pmt_ctl |= PMT_CTL_WOL_EN_;
|
||||
@ -3946,7 +3909,7 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
|
||||
temp_pmt_ctl |= PMT_CTL_SUS_MODE_0_;
|
||||
}
|
||||
|
||||
ret = lan78xx_write_reg(dev, WUCSR, temp_wucsr);
|
||||
lan78xx_write_reg(dev, WUCSR, temp_wucsr);
|
||||
|
||||
/* when multiple WOL bits are set */
|
||||
if (hweight_long((unsigned long)wol) > 1) {
|
||||
@ -3954,16 +3917,16 @@ static int lan78xx_set_suspend(struct lan78xx_net *dev, u32 wol)
|
||||
temp_pmt_ctl &= ~PMT_CTL_SUS_MODE_MASK_;
|
||||
temp_pmt_ctl |= PMT_CTL_SUS_MODE_0_;
|
||||
}
|
||||
ret = lan78xx_write_reg(dev, PMT_CTL, temp_pmt_ctl);
|
||||
lan78xx_write_reg(dev, PMT_CTL, temp_pmt_ctl);
|
||||
|
||||
/* clear WUPS */
|
||||
ret = lan78xx_read_reg(dev, PMT_CTL, &buf);
|
||||
lan78xx_read_reg(dev, PMT_CTL, &buf);
|
||||
buf |= PMT_CTL_WUPS_MASK_;
|
||||
ret = lan78xx_write_reg(dev, PMT_CTL, buf);
|
||||
lan78xx_write_reg(dev, PMT_CTL, buf);
|
||||
|
||||
ret = lan78xx_read_reg(dev, MAC_RX, &buf);
|
||||
lan78xx_read_reg(dev, MAC_RX, &buf);
|
||||
buf |= MAC_RX_RXEN_;
|
||||
ret = lan78xx_write_reg(dev, MAC_RX, buf);
|
||||
lan78xx_write_reg(dev, MAC_RX, buf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -255,6 +255,9 @@ static void fdp_nci_i2c_read_device_properties(struct device *dev,
|
||||
len, sizeof(**fw_vsc_cfg),
|
||||
GFP_KERNEL);
|
||||
|
||||
if (!*fw_vsc_cfg)
|
||||
goto alloc_err;
|
||||
|
||||
r = device_property_read_u8_array(dev, FDP_DP_FW_VSC_CFG_NAME,
|
||||
*fw_vsc_cfg, len);
|
||||
|
||||
@ -268,6 +271,7 @@ vsc_read_err:
|
||||
*fw_vsc_cfg = NULL;
|
||||
}
|
||||
|
||||
alloc_err:
|
||||
dev_dbg(dev, "Clock type: %d, clock frequency: %d, VSC: %s",
|
||||
*clock_type, *clock_freq, *fw_vsc_cfg != NULL ? "yes" : "no");
|
||||
}
|
||||
|
@ -644,12 +644,17 @@ static void dasd_diag_setup_blk_queue(struct dasd_block *block)
|
||||
blk_queue_segment_boundary(q, PAGE_SIZE - 1);
|
||||
}
|
||||
|
||||
static int dasd_diag_pe_handler(struct dasd_device *device, __u8 tbvpm)
|
||||
{
|
||||
return dasd_generic_verify_path(device, tbvpm);
|
||||
}
|
||||
|
||||
static struct dasd_discipline dasd_diag_discipline = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "DIAG",
|
||||
.ebcname = "DIAG",
|
||||
.check_device = dasd_diag_check_device,
|
||||
.verify_path = dasd_generic_verify_path,
|
||||
.pe_handler = dasd_diag_pe_handler,
|
||||
.fill_geometry = dasd_diag_fill_geometry,
|
||||
.setup_blk_queue = dasd_diag_setup_blk_queue,
|
||||
.start_IO = dasd_start_diag,
|
||||
|
@ -803,13 +803,18 @@ static void dasd_fba_setup_blk_queue(struct dasd_block *block)
|
||||
blk_queue_flag_set(QUEUE_FLAG_DISCARD, q);
|
||||
}
|
||||
|
||||
static int dasd_fba_pe_handler(struct dasd_device *device, __u8 tbvpm)
|
||||
{
|
||||
return dasd_generic_verify_path(device, tbvpm);
|
||||
}
|
||||
|
||||
static struct dasd_discipline dasd_fba_discipline = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "FBA ",
|
||||
.ebcname = "FBA ",
|
||||
.check_device = dasd_fba_check_characteristics,
|
||||
.do_analysis = dasd_fba_do_analysis,
|
||||
.verify_path = dasd_generic_verify_path,
|
||||
.pe_handler = dasd_fba_pe_handler,
|
||||
.setup_blk_queue = dasd_fba_setup_blk_queue,
|
||||
.fill_geometry = dasd_fba_fill_geometry,
|
||||
.start_IO = dasd_start_IO,
|
||||
|
@ -298,7 +298,6 @@ struct dasd_discipline {
|
||||
* e.g. verify that new path is compatible with the current
|
||||
* configuration.
|
||||
*/
|
||||
int (*verify_path)(struct dasd_device *, __u8);
|
||||
int (*pe_handler)(struct dasd_device *, __u8);
|
||||
|
||||
/*
|
||||
|
@ -179,6 +179,7 @@ void scsi_remove_host(struct Scsi_Host *shost)
|
||||
scsi_forget_host(shost);
|
||||
mutex_unlock(&shost->scan_mutex);
|
||||
scsi_proc_host_rm(shost);
|
||||
scsi_proc_hostdir_rm(shost->hostt);
|
||||
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
if (scsi_host_set_state(shost, SHOST_DEL))
|
||||
@ -318,6 +319,7 @@ static void scsi_host_dev_release(struct device *dev)
|
||||
struct Scsi_Host *shost = dev_to_shost(dev);
|
||||
struct device *parent = dev->parent;
|
||||
|
||||
/* In case scsi_remove_host() has not been called. */
|
||||
scsi_proc_hostdir_rm(shost->hostt);
|
||||
|
||||
/* Wait for functions invoked through call_rcu(&shost->rcu, ...) */
|
||||
|
@ -1515,6 +1515,8 @@ struct megasas_ctrl_info {
|
||||
#define MEGASAS_MAX_LD_IDS (MEGASAS_MAX_LD_CHANNELS * \
|
||||
MEGASAS_MAX_DEV_PER_CHANNEL)
|
||||
|
||||
#define MEGASAS_MAX_SUPPORTED_LD_IDS 240
|
||||
|
||||
#define MEGASAS_MAX_SECTORS (2*1024)
|
||||
#define MEGASAS_MAX_SECTORS_IEEE (2*128)
|
||||
#define MEGASAS_DBG_LVL 1
|
||||
|
@ -359,7 +359,7 @@ u8 MR_ValidateMapInfo(struct megasas_instance *instance, u64 map_id)
|
||||
ld = MR_TargetIdToLdGet(i, drv_map);
|
||||
|
||||
/* For non existing VDs, iterate to next VD*/
|
||||
if (ld >= (MAX_LOGICAL_DRIVES_EXT - 1))
|
||||
if (ld >= MEGASAS_MAX_SUPPORTED_LD_IDS)
|
||||
continue;
|
||||
|
||||
raid = MR_LdRaidGet(ld, drv_map);
|
||||
|
@ -1056,7 +1056,7 @@ static struct cifs_ntsd *get_cifs_acl_by_path(struct cifs_sb_info *cifs_sb,
|
||||
struct cifs_ntsd *pntsd = NULL;
|
||||
int oplock = 0;
|
||||
unsigned int xid;
|
||||
int rc, create_options = 0;
|
||||
int rc;
|
||||
struct cifs_tcon *tcon;
|
||||
struct tcon_link *tlink = cifs_sb_tlink(cifs_sb);
|
||||
struct cifs_fid fid;
|
||||
@ -1068,13 +1068,10 @@ static struct cifs_ntsd *get_cifs_acl_by_path(struct cifs_sb_info *cifs_sb,
|
||||
tcon = tlink_tcon(tlink);
|
||||
xid = get_xid();
|
||||
|
||||
if (backup_cred(cifs_sb))
|
||||
create_options |= CREATE_OPEN_BACKUP_INTENT;
|
||||
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = READ_CONTROL;
|
||||
oparms.create_options = create_options;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, 0);
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.path = path;
|
||||
oparms.fid = &fid;
|
||||
@ -1119,7 +1116,7 @@ int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
|
||||
{
|
||||
int oplock = 0;
|
||||
unsigned int xid;
|
||||
int rc, access_flags, create_options = 0;
|
||||
int rc, access_flags;
|
||||
struct cifs_tcon *tcon;
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
|
||||
struct tcon_link *tlink = cifs_sb_tlink(cifs_sb);
|
||||
@ -1132,9 +1129,6 @@ int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
|
||||
tcon = tlink_tcon(tlink);
|
||||
xid = get_xid();
|
||||
|
||||
if (backup_cred(cifs_sb))
|
||||
create_options |= CREATE_OPEN_BACKUP_INTENT;
|
||||
|
||||
if (aclflag == CIFS_ACL_OWNER || aclflag == CIFS_ACL_GROUP)
|
||||
access_flags = WRITE_OWNER;
|
||||
else
|
||||
@ -1143,7 +1137,7 @@ int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = access_flags;
|
||||
oparms.create_options = create_options;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, 0);
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.path = path;
|
||||
oparms.fid = &fid;
|
||||
|
@ -275,7 +275,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||
buf->f_ffree = 0; /* unlimited */
|
||||
|
||||
if (server->ops->queryfs)
|
||||
rc = server->ops->queryfs(xid, tcon, buf);
|
||||
rc = server->ops->queryfs(xid, tcon, cifs_sb, buf);
|
||||
|
||||
free_xid(xid);
|
||||
return rc;
|
||||
|
@ -300,7 +300,8 @@ struct smb_version_operations {
|
||||
const char *, struct dfs_info3_param **,
|
||||
unsigned int *, const struct nls_table *, int);
|
||||
/* informational QFS call */
|
||||
void (*qfs_tcon)(const unsigned int, struct cifs_tcon *);
|
||||
void (*qfs_tcon)(const unsigned int, struct cifs_tcon *,
|
||||
struct cifs_sb_info *);
|
||||
/* check if a path is accessible or not */
|
||||
int (*is_path_accessible)(const unsigned int, struct cifs_tcon *,
|
||||
struct cifs_sb_info *, const char *);
|
||||
@ -408,7 +409,7 @@ struct smb_version_operations {
|
||||
struct cifsInodeInfo *);
|
||||
/* query remote filesystem */
|
||||
int (*queryfs)(const unsigned int, struct cifs_tcon *,
|
||||
struct kstatfs *);
|
||||
struct cifs_sb_info *, struct kstatfs *);
|
||||
/* send mandatory brlock to the server */
|
||||
int (*mand_lock)(const unsigned int, struct cifsFileInfo *, __u64,
|
||||
__u64, __u32, int, int, bool);
|
||||
@ -489,6 +490,7 @@ struct smb_version_operations {
|
||||
/* ioctl passthrough for query_info */
|
||||
int (*ioctl_query_info)(const unsigned int xid,
|
||||
struct cifs_tcon *tcon,
|
||||
struct cifs_sb_info *cifs_sb,
|
||||
__le16 *path, int is_dir,
|
||||
unsigned long p);
|
||||
/* make unix special files (block, char, fifo, socket) */
|
||||
|
@ -600,4 +600,12 @@ static inline int get_dfs_path(const unsigned int xid, struct cifs_ses *ses,
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int cifs_create_options(struct cifs_sb_info *cifs_sb, int options)
|
||||
{
|
||||
if (backup_cred(cifs_sb))
|
||||
return options | CREATE_OPEN_BACKUP_INTENT;
|
||||
else
|
||||
return options;
|
||||
}
|
||||
|
||||
#endif /* _CIFSPROTO_H */
|
||||
|
@ -4319,7 +4319,7 @@ static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
|
||||
|
||||
/* do not care if a following call succeed - informational */
|
||||
if (!tcon->pipe && server->ops->qfs_tcon) {
|
||||
server->ops->qfs_tcon(*xid, tcon);
|
||||
server->ops->qfs_tcon(*xid, tcon, cifs_sb);
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
|
||||
if (tcon->fsDevInfo.DeviceCharacteristics &
|
||||
cpu_to_le32(FILE_READ_ONLY_DEVICE))
|
||||
|
@ -357,13 +357,10 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid,
|
||||
if (!tcon->unix_ext && (mode & S_IWUGO) == 0)
|
||||
create_options |= CREATE_OPTION_READONLY;
|
||||
|
||||
if (backup_cred(cifs_sb))
|
||||
create_options |= CREATE_OPEN_BACKUP_INTENT;
|
||||
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = desired_access;
|
||||
oparms.create_options = create_options;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, create_options);
|
||||
oparms.disposition = disposition;
|
||||
oparms.path = full_path;
|
||||
oparms.fid = fid;
|
||||
|
@ -223,9 +223,6 @@ cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb,
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
if (backup_cred(cifs_sb))
|
||||
create_options |= CREATE_OPEN_BACKUP_INTENT;
|
||||
|
||||
/* O_SYNC also has bit for O_DSYNC so following check picks up either */
|
||||
if (f_flags & O_SYNC)
|
||||
create_options |= CREATE_WRITE_THROUGH;
|
||||
@ -236,7 +233,7 @@ cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb,
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = desired_access;
|
||||
oparms.create_options = create_options;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, create_options);
|
||||
oparms.disposition = disposition;
|
||||
oparms.path = full_path;
|
||||
oparms.fid = fid;
|
||||
@ -751,9 +748,6 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush)
|
||||
|
||||
desired_access = cifs_convert_flags(cfile->f_flags);
|
||||
|
||||
if (backup_cred(cifs_sb))
|
||||
create_options |= CREATE_OPEN_BACKUP_INTENT;
|
||||
|
||||
/* O_SYNC also has bit for O_DSYNC so following check picks up either */
|
||||
if (cfile->f_flags & O_SYNC)
|
||||
create_options |= CREATE_WRITE_THROUGH;
|
||||
@ -767,7 +761,7 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush)
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = desired_access;
|
||||
oparms.create_options = create_options;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, create_options);
|
||||
oparms.disposition = disposition;
|
||||
oparms.path = full_path;
|
||||
oparms.fid = &cfile->fid;
|
||||
|
@ -472,9 +472,7 @@ cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = GENERIC_READ;
|
||||
oparms.create_options = CREATE_NOT_DIR;
|
||||
if (backup_cred(cifs_sb))
|
||||
oparms.create_options |= CREATE_OPEN_BACKUP_INTENT;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.path = path;
|
||||
oparms.fid = &fid;
|
||||
@ -1225,7 +1223,7 @@ cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = DELETE | FILE_WRITE_ATTRIBUTES;
|
||||
oparms.create_options = CREATE_NOT_DIR;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.path = full_path;
|
||||
oparms.fid = &fid;
|
||||
@ -1763,7 +1761,7 @@ cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
/* open the file to be renamed -- we need DELETE perms */
|
||||
oparms.desired_access = DELETE;
|
||||
oparms.create_options = CREATE_NOT_DIR;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.path = from_path;
|
||||
oparms.fid = &fid;
|
||||
|
@ -65,7 +65,7 @@ static long cifs_ioctl_query_info(unsigned int xid, struct file *filep,
|
||||
|
||||
if (tcon->ses->server->ops->ioctl_query_info)
|
||||
rc = tcon->ses->server->ops->ioctl_query_info(
|
||||
xid, tcon, utf16_path,
|
||||
xid, tcon, cifs_sb, utf16_path,
|
||||
filep->private_data ? 0 : 1, p);
|
||||
else
|
||||
rc = -EOPNOTSUPP;
|
||||
|
@ -318,7 +318,7 @@ cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = GENERIC_READ;
|
||||
oparms.create_options = CREATE_NOT_DIR;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.path = path;
|
||||
oparms.fid = &fid;
|
||||
@ -356,15 +356,11 @@ cifs_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
|
||||
struct cifs_fid fid;
|
||||
struct cifs_open_parms oparms;
|
||||
struct cifs_io_parms io_parms;
|
||||
int create_options = CREATE_NOT_DIR;
|
||||
|
||||
if (backup_cred(cifs_sb))
|
||||
create_options |= CREATE_OPEN_BACKUP_INTENT;
|
||||
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = GENERIC_WRITE;
|
||||
oparms.create_options = create_options;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
|
||||
oparms.disposition = FILE_CREATE;
|
||||
oparms.path = path;
|
||||
oparms.fid = &fid;
|
||||
@ -405,9 +401,7 @@ smb3_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = GENERIC_READ;
|
||||
oparms.create_options = CREATE_NOT_DIR;
|
||||
if (backup_cred(cifs_sb))
|
||||
oparms.create_options |= CREATE_OPEN_BACKUP_INTENT;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.fid = &fid;
|
||||
oparms.reconnect = false;
|
||||
@ -460,14 +454,10 @@ smb3_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
|
||||
struct cifs_fid fid;
|
||||
struct cifs_open_parms oparms;
|
||||
struct cifs_io_parms io_parms;
|
||||
int create_options = CREATE_NOT_DIR;
|
||||
__le16 *utf16_path;
|
||||
__u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
|
||||
struct kvec iov[2];
|
||||
|
||||
if (backup_cred(cifs_sb))
|
||||
create_options |= CREATE_OPEN_BACKUP_INTENT;
|
||||
|
||||
cifs_dbg(FYI, "%s: path: %s\n", __func__, path);
|
||||
|
||||
utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
|
||||
@ -477,7 +467,7 @@ smb3_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = GENERIC_WRITE;
|
||||
oparms.create_options = create_options;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
|
||||
oparms.disposition = FILE_CREATE;
|
||||
oparms.fid = &fid;
|
||||
oparms.reconnect = false;
|
||||
|
@ -504,7 +504,8 @@ cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
|
||||
}
|
||||
|
||||
static void
|
||||
cifs_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
|
||||
cifs_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
struct cifs_sb_info *cifs_sb)
|
||||
{
|
||||
CIFSSMBQFSDeviceInfo(xid, tcon);
|
||||
CIFSSMBQFSAttributeInfo(xid, tcon);
|
||||
@ -565,7 +566,7 @@ cifs_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = FILE_READ_ATTRIBUTES;
|
||||
oparms.create_options = 0;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, 0);
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.path = full_path;
|
||||
oparms.fid = &fid;
|
||||
@ -793,7 +794,7 @@ smb_set_file_info(struct inode *inode, const char *full_path,
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = SYNCHRONIZE | FILE_WRITE_ATTRIBUTES;
|
||||
oparms.create_options = CREATE_NOT_DIR;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.path = full_path;
|
||||
oparms.fid = &fid;
|
||||
@ -872,7 +873,7 @@ cifs_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid,
|
||||
|
||||
static int
|
||||
cifs_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
struct kstatfs *buf)
|
||||
struct cifs_sb_info *cifs_sb, struct kstatfs *buf)
|
||||
{
|
||||
int rc = -EOPNOTSUPP;
|
||||
|
||||
@ -970,7 +971,8 @@ cifs_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = FILE_READ_ATTRIBUTES;
|
||||
oparms.create_options = OPEN_REPARSE_POINT;
|
||||
oparms.create_options = cifs_create_options(cifs_sb,
|
||||
OPEN_REPARSE_POINT);
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.path = full_path;
|
||||
oparms.fid = &fid;
|
||||
@ -1029,7 +1031,6 @@ cifs_make_node(unsigned int xid, struct inode *inode,
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
|
||||
struct inode *newinode = NULL;
|
||||
int rc = -EPERM;
|
||||
int create_options = CREATE_NOT_DIR | CREATE_OPTION_SPECIAL;
|
||||
FILE_ALL_INFO *buf = NULL;
|
||||
struct cifs_io_parms io_parms;
|
||||
__u32 oplock = 0;
|
||||
@ -1090,13 +1091,11 @@ cifs_make_node(unsigned int xid, struct inode *inode,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (backup_cred(cifs_sb))
|
||||
create_options |= CREATE_OPEN_BACKUP_INTENT;
|
||||
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = GENERIC_WRITE;
|
||||
oparms.create_options = create_options;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR |
|
||||
CREATE_OPTION_SPECIAL);
|
||||
oparms.disposition = FILE_CREATE;
|
||||
oparms.path = full_path;
|
||||
oparms.fid = &fid;
|
||||
|
@ -98,9 +98,7 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
oparms.tcon = tcon;
|
||||
oparms.desired_access = desired_access;
|
||||
oparms.disposition = create_disposition;
|
||||
oparms.create_options = create_options;
|
||||
if (backup_cred(cifs_sb))
|
||||
oparms.create_options |= CREATE_OPEN_BACKUP_INTENT;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, create_options);
|
||||
oparms.fid = &fid;
|
||||
oparms.reconnect = false;
|
||||
oparms.mode = mode;
|
||||
@ -456,7 +454,7 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
|
||||
/* If it is a root and its handle is cached then use it */
|
||||
if (!strlen(full_path) && !no_cached_open) {
|
||||
rc = open_shroot(xid, tcon, &fid);
|
||||
rc = open_shroot(xid, tcon, cifs_sb, &fid);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
@ -473,9 +471,6 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (backup_cred(cifs_sb))
|
||||
create_options |= CREATE_OPEN_BACKUP_INTENT;
|
||||
|
||||
cifs_get_readable_path(tcon, full_path, &cfile);
|
||||
rc = smb2_compound_op(xid, tcon, cifs_sb, full_path,
|
||||
FILE_READ_ATTRIBUTES, FILE_OPEN, create_options,
|
||||
|
@ -644,7 +644,8 @@ smb2_cached_lease_break(struct work_struct *work)
|
||||
/*
|
||||
* Open the directory at the root of a share
|
||||
*/
|
||||
int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid)
|
||||
int open_shroot(unsigned int xid, struct cifs_tcon *tcon,
|
||||
struct cifs_sb_info *cifs_sb, struct cifs_fid *pfid)
|
||||
{
|
||||
struct cifs_ses *ses = tcon->ses;
|
||||
struct TCP_Server_Info *server = ses->server;
|
||||
@ -696,7 +697,7 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid)
|
||||
rqst[0].rq_nvec = SMB2_CREATE_IOV_SIZE;
|
||||
|
||||
oparms.tcon = tcon;
|
||||
oparms.create_options = 0;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, 0);
|
||||
oparms.desired_access = FILE_READ_ATTRIBUTES;
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.fid = pfid;
|
||||
@ -812,7 +813,8 @@ oshr_free:
|
||||
}
|
||||
|
||||
static void
|
||||
smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
|
||||
smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
struct cifs_sb_info *cifs_sb)
|
||||
{
|
||||
int rc;
|
||||
__le16 srch_path = 0; /* Null - open root of share */
|
||||
@ -821,18 +823,19 @@ smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
|
||||
struct cifs_fid fid;
|
||||
bool no_cached_open = tcon->nohandlecache;
|
||||
|
||||
oparms.tcon = tcon;
|
||||
oparms.desired_access = FILE_READ_ATTRIBUTES;
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.create_options = 0;
|
||||
oparms.fid = &fid;
|
||||
oparms.reconnect = false;
|
||||
oparms = (struct cifs_open_parms) {
|
||||
.tcon = tcon,
|
||||
.desired_access = FILE_READ_ATTRIBUTES,
|
||||
.disposition = FILE_OPEN,
|
||||
.create_options = cifs_create_options(cifs_sb, 0),
|
||||
.fid = &fid,
|
||||
};
|
||||
|
||||
if (no_cached_open)
|
||||
rc = SMB2_open(xid, &oparms, &srch_path, &oplock, NULL, NULL,
|
||||
NULL);
|
||||
else
|
||||
rc = open_shroot(xid, tcon, &fid);
|
||||
rc = open_shroot(xid, tcon, cifs_sb, &fid);
|
||||
|
||||
if (rc)
|
||||
return;
|
||||
@ -854,7 +857,8 @@ smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
|
||||
}
|
||||
|
||||
static void
|
||||
smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
|
||||
smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
struct cifs_sb_info *cifs_sb)
|
||||
{
|
||||
int rc;
|
||||
__le16 srch_path = 0; /* Null - open root of share */
|
||||
@ -865,7 +869,7 @@ smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
|
||||
oparms.tcon = tcon;
|
||||
oparms.desired_access = FILE_READ_ATTRIBUTES;
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.create_options = 0;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, 0);
|
||||
oparms.fid = &fid;
|
||||
oparms.reconnect = false;
|
||||
|
||||
@ -900,10 +904,7 @@ smb2_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
oparms.tcon = tcon;
|
||||
oparms.desired_access = FILE_READ_ATTRIBUTES;
|
||||
oparms.disposition = FILE_OPEN;
|
||||
if (backup_cred(cifs_sb))
|
||||
oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
|
||||
else
|
||||
oparms.create_options = 0;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, 0);
|
||||
oparms.fid = &fid;
|
||||
oparms.reconnect = false;
|
||||
|
||||
@ -1179,10 +1180,7 @@ smb2_set_ea(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
oparms.tcon = tcon;
|
||||
oparms.desired_access = FILE_WRITE_EA;
|
||||
oparms.disposition = FILE_OPEN;
|
||||
if (backup_cred(cifs_sb))
|
||||
oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
|
||||
else
|
||||
oparms.create_options = 0;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, 0);
|
||||
oparms.fid = &fid;
|
||||
oparms.reconnect = false;
|
||||
|
||||
@ -1414,6 +1412,7 @@ req_res_key_exit:
|
||||
static int
|
||||
smb2_ioctl_query_info(const unsigned int xid,
|
||||
struct cifs_tcon *tcon,
|
||||
struct cifs_sb_info *cifs_sb,
|
||||
__le16 *path, int is_dir,
|
||||
unsigned long p)
|
||||
{
|
||||
@ -1439,6 +1438,7 @@ smb2_ioctl_query_info(const unsigned int xid,
|
||||
struct kvec close_iov[1];
|
||||
unsigned int size[2];
|
||||
void *data[2];
|
||||
int create_options = is_dir ? CREATE_NOT_FILE : CREATE_NOT_DIR;
|
||||
|
||||
memset(rqst, 0, sizeof(rqst));
|
||||
resp_buftype[0] = resp_buftype[1] = resp_buftype[2] = CIFS_NO_BUFFER;
|
||||
@ -1474,10 +1474,7 @@ smb2_ioctl_query_info(const unsigned int xid,
|
||||
memset(&oparms, 0, sizeof(oparms));
|
||||
oparms.tcon = tcon;
|
||||
oparms.disposition = FILE_OPEN;
|
||||
if (is_dir)
|
||||
oparms.create_options = CREATE_NOT_FILE;
|
||||
else
|
||||
oparms.create_options = CREATE_NOT_DIR;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, create_options);
|
||||
oparms.fid = &fid;
|
||||
oparms.reconnect = false;
|
||||
|
||||
@ -2074,10 +2071,7 @@ smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
oparms.tcon = tcon;
|
||||
oparms.desired_access = FILE_READ_ATTRIBUTES | FILE_READ_DATA;
|
||||
oparms.disposition = FILE_OPEN;
|
||||
if (backup_cred(cifs_sb))
|
||||
oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
|
||||
else
|
||||
oparms.create_options = 0;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, 0);
|
||||
oparms.fid = fid;
|
||||
oparms.reconnect = false;
|
||||
|
||||
@ -2278,10 +2272,7 @@ smb2_query_info_compound(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
oparms.tcon = tcon;
|
||||
oparms.desired_access = desired_access;
|
||||
oparms.disposition = FILE_OPEN;
|
||||
if (cifs_sb && backup_cred(cifs_sb))
|
||||
oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
|
||||
else
|
||||
oparms.create_options = 0;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, 0);
|
||||
oparms.fid = &fid;
|
||||
oparms.reconnect = false;
|
||||
|
||||
@ -2337,7 +2328,7 @@ smb2_query_info_compound(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
|
||||
static int
|
||||
smb2_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
struct kstatfs *buf)
|
||||
struct cifs_sb_info *cifs_sb, struct kstatfs *buf)
|
||||
{
|
||||
struct smb2_query_info_rsp *rsp;
|
||||
struct smb2_fs_full_size_info *info = NULL;
|
||||
@ -2374,7 +2365,7 @@ qfs_exit:
|
||||
|
||||
static int
|
||||
smb311_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
struct kstatfs *buf)
|
||||
struct cifs_sb_info *cifs_sb, struct kstatfs *buf)
|
||||
{
|
||||
int rc;
|
||||
__le16 srch_path = 0; /* Null - open root of share */
|
||||
@ -2383,12 +2374,12 @@ smb311_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
struct cifs_fid fid;
|
||||
|
||||
if (!tcon->posix_extensions)
|
||||
return smb2_queryfs(xid, tcon, buf);
|
||||
return smb2_queryfs(xid, tcon, cifs_sb, buf);
|
||||
|
||||
oparms.tcon = tcon;
|
||||
oparms.desired_access = FILE_READ_ATTRIBUTES;
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.create_options = 0;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, 0);
|
||||
oparms.fid = &fid;
|
||||
oparms.reconnect = false;
|
||||
|
||||
@ -2657,6 +2648,7 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
struct smb2_create_rsp *create_rsp;
|
||||
struct smb2_ioctl_rsp *ioctl_rsp;
|
||||
struct reparse_data_buffer *reparse_buf;
|
||||
int create_options = is_reparse_point ? OPEN_REPARSE_POINT : 0;
|
||||
u32 plen;
|
||||
|
||||
cifs_dbg(FYI, "%s: path: %s\n", __func__, full_path);
|
||||
@ -2683,14 +2675,7 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
oparms.tcon = tcon;
|
||||
oparms.desired_access = FILE_READ_ATTRIBUTES;
|
||||
oparms.disposition = FILE_OPEN;
|
||||
|
||||
if (backup_cred(cifs_sb))
|
||||
oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
|
||||
else
|
||||
oparms.create_options = 0;
|
||||
if (is_reparse_point)
|
||||
oparms.create_options = OPEN_REPARSE_POINT;
|
||||
|
||||
oparms.create_options = cifs_create_options(cifs_sb, create_options);
|
||||
oparms.fid = &fid;
|
||||
oparms.reconnect = false;
|
||||
|
||||
@ -2869,11 +2854,6 @@ get_smb2_acl_by_path(struct cifs_sb_info *cifs_sb,
|
||||
tcon = tlink_tcon(tlink);
|
||||
xid = get_xid();
|
||||
|
||||
if (backup_cred(cifs_sb))
|
||||
oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
|
||||
else
|
||||
oparms.create_options = 0;
|
||||
|
||||
utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
|
||||
if (!utf16_path) {
|
||||
rc = -ENOMEM;
|
||||
@ -2884,6 +2864,7 @@ get_smb2_acl_by_path(struct cifs_sb_info *cifs_sb,
|
||||
oparms.tcon = tcon;
|
||||
oparms.desired_access = READ_CONTROL;
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, 0);
|
||||
oparms.fid = &fid;
|
||||
oparms.reconnect = false;
|
||||
|
||||
@ -2925,11 +2906,6 @@ set_smb2_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
|
||||
tcon = tlink_tcon(tlink);
|
||||
xid = get_xid();
|
||||
|
||||
if (backup_cred(cifs_sb))
|
||||
oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
|
||||
else
|
||||
oparms.create_options = 0;
|
||||
|
||||
if (aclflag == CIFS_ACL_OWNER || aclflag == CIFS_ACL_GROUP)
|
||||
access_flags = WRITE_OWNER;
|
||||
else
|
||||
@ -2944,6 +2920,7 @@ set_smb2_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
|
||||
|
||||
oparms.tcon = tcon;
|
||||
oparms.desired_access = access_flags;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, 0);
|
||||
oparms.disposition = FILE_OPEN;
|
||||
oparms.path = path;
|
||||
oparms.fid = &fid;
|
||||
@ -4481,7 +4458,6 @@ smb2_make_node(unsigned int xid, struct inode *inode,
|
||||
{
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
|
||||
int rc = -EPERM;
|
||||
int create_options = CREATE_NOT_DIR | CREATE_OPTION_SPECIAL;
|
||||
FILE_ALL_INFO *buf = NULL;
|
||||
struct cifs_io_parms io_parms;
|
||||
__u32 oplock = 0;
|
||||
@ -4517,13 +4493,11 @@ smb2_make_node(unsigned int xid, struct inode *inode,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (backup_cred(cifs_sb))
|
||||
create_options |= CREATE_OPEN_BACKUP_INTENT;
|
||||
|
||||
oparms.tcon = tcon;
|
||||
oparms.cifs_sb = cifs_sb;
|
||||
oparms.desired_access = GENERIC_WRITE;
|
||||
oparms.create_options = create_options;
|
||||
oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR |
|
||||
CREATE_OPTION_SPECIAL);
|
||||
oparms.disposition = FILE_CREATE;
|
||||
oparms.path = full_path;
|
||||
oparms.fid = &fid;
|
||||
|
@ -67,7 +67,7 @@ extern int smb3_handle_read_data(struct TCP_Server_Info *server,
|
||||
struct mid_q_entry *mid);
|
||||
|
||||
extern int open_shroot(unsigned int xid, struct cifs_tcon *tcon,
|
||||
struct cifs_fid *pfid);
|
||||
struct cifs_sb_info *cifs_sb, struct cifs_fid *pfid);
|
||||
extern void close_shroot(struct cached_fid *cfid);
|
||||
extern void move_smb2_info_to_cifs(FILE_ALL_INFO *dst,
|
||||
struct smb2_file_all_info *src);
|
||||
|
@ -486,6 +486,8 @@ static int ext4_getfsmap_datadev(struct super_block *sb,
|
||||
keys[0].fmr_physical = bofs;
|
||||
if (keys[1].fmr_physical >= eofs)
|
||||
keys[1].fmr_physical = eofs - 1;
|
||||
if (keys[1].fmr_physical < keys[0].fmr_physical)
|
||||
return 0;
|
||||
start_fsb = keys[0].fmr_physical;
|
||||
end_fsb = keys[1].fmr_physical;
|
||||
|
||||
|
@ -158,7 +158,6 @@ int ext4_find_inline_data_nolock(struct inode *inode)
|
||||
(void *)ext4_raw_inode(&is.iloc));
|
||||
EXT4_I(inode)->i_inline_size = EXT4_MIN_INLINE_DATA_SIZE +
|
||||
le32_to_cpu(is.s.here->e_value_size);
|
||||
ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA);
|
||||
}
|
||||
out:
|
||||
brelse(is.iloc.bh);
|
||||
|
@ -4916,8 +4916,13 @@ static inline int ext4_iget_extra_inode(struct inode *inode,
|
||||
|
||||
if (EXT4_INODE_HAS_XATTR_SPACE(inode) &&
|
||||
*magic == cpu_to_le32(EXT4_XATTR_MAGIC)) {
|
||||
int err;
|
||||
|
||||
ext4_set_inode_state(inode, EXT4_STATE_XATTR);
|
||||
return ext4_find_inline_data_nolock(inode);
|
||||
err = ext4_find_inline_data_nolock(inode);
|
||||
if (!err && ext4_has_inline_data(inode))
|
||||
ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA);
|
||||
return err;
|
||||
} else
|
||||
EXT4_I(inode)->i_inline_off = 0;
|
||||
return 0;
|
||||
|
@ -179,6 +179,7 @@ static long swap_inode_boot_loader(struct super_block *sb,
|
||||
ei_bl->i_flags = 0;
|
||||
inode_set_iversion(inode_bl, 1);
|
||||
i_size_write(inode_bl, 0);
|
||||
EXT4_I(inode_bl)->i_disksize = inode_bl->i_size;
|
||||
inode_bl->i_mode = S_IFREG;
|
||||
if (ext4_has_feature_extents(sb)) {
|
||||
ext4_set_inode_flag(inode_bl, EXT4_INODE_EXTENTS);
|
||||
|
@ -1579,11 +1579,10 @@ static struct buffer_head *__ext4_find_entry(struct inode *dir,
|
||||
int has_inline_data = 1;
|
||||
ret = ext4_find_inline_entry(dir, fname, res_dir,
|
||||
&has_inline_data);
|
||||
if (has_inline_data) {
|
||||
if (inlined)
|
||||
*inlined = 1;
|
||||
if (inlined)
|
||||
*inlined = has_inline_data;
|
||||
if (has_inline_data)
|
||||
goto cleanup_and_exit;
|
||||
}
|
||||
}
|
||||
|
||||
if ((namelen <= 2) && (name[0] == '.') &&
|
||||
@ -3728,7 +3727,8 @@ static void ext4_resetent(handle_t *handle, struct ext4_renament *ent,
|
||||
* so the old->de may no longer valid and need to find it again
|
||||
* before reset old inode info.
|
||||
*/
|
||||
old.bh = ext4_find_entry(old.dir, &old.dentry->d_name, &old.de, NULL);
|
||||
old.bh = ext4_find_entry(old.dir, &old.dentry->d_name, &old.de,
|
||||
&old.inlined);
|
||||
if (IS_ERR(old.bh))
|
||||
retval = PTR_ERR(old.bh);
|
||||
if (!old.bh)
|
||||
@ -3893,9 +3893,20 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
return retval;
|
||||
}
|
||||
|
||||
old.bh = ext4_find_entry(old.dir, &old.dentry->d_name, &old.de, NULL);
|
||||
if (IS_ERR(old.bh))
|
||||
return PTR_ERR(old.bh);
|
||||
/*
|
||||
* We need to protect against old.inode directory getting converted
|
||||
* from inline directory format into a normal one.
|
||||
*/
|
||||
if (S_ISDIR(old.inode->i_mode))
|
||||
inode_lock_nested(old.inode, I_MUTEX_NONDIR2);
|
||||
|
||||
old.bh = ext4_find_entry(old.dir, &old.dentry->d_name, &old.de,
|
||||
&old.inlined);
|
||||
if (IS_ERR(old.bh)) {
|
||||
retval = PTR_ERR(old.bh);
|
||||
goto unlock_moved_dir;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for inode number is _not_ due to possible IO errors.
|
||||
* We might rmdir the source, keep it as pwd of some process
|
||||
@ -3953,8 +3964,10 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
goto end_rename;
|
||||
}
|
||||
retval = ext4_rename_dir_prepare(handle, &old);
|
||||
if (retval)
|
||||
if (retval) {
|
||||
inode_unlock(old.inode);
|
||||
goto end_rename;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* If we're renaming a file within an inline_data dir and adding or
|
||||
@ -4054,6 +4067,11 @@ release_bh:
|
||||
brelse(old.dir_bh);
|
||||
brelse(old.bh);
|
||||
brelse(new.bh);
|
||||
|
||||
unlock_moved_dir:
|
||||
if (S_ISDIR(old.inode->i_mode))
|
||||
inode_unlock(old.inode);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
@ -2819,6 +2819,9 @@ shift:
|
||||
(void *)header, total_ino);
|
||||
EXT4_I(inode)->i_extra_isize = new_extra_isize;
|
||||
|
||||
if (ext4_has_inline_data(inode))
|
||||
error = ext4_find_inline_data_nolock(inode);
|
||||
|
||||
cleanup:
|
||||
if (error && (mnt_count != le16_to_cpu(sbi->s_es->s_mnt_count))) {
|
||||
ext4_warning(inode->i_sb, "Unable to expand inode %lu. Delete some EAs or run e2fsck.",
|
||||
|
@ -654,6 +654,7 @@ int __close_fd_get_file(unsigned int fd, struct file **res)
|
||||
fdt = files_fdtable(files);
|
||||
if (fd >= fdt->max_fds)
|
||||
goto out_unlock;
|
||||
fd = array_index_nospec(fd, fdt->max_fds);
|
||||
file = fdt->fd[fd];
|
||||
if (!file)
|
||||
goto out_unlock;
|
||||
|
@ -832,7 +832,12 @@
|
||||
#define TRACEDATA
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Discard .note.GNU-stack, which is emitted as PROGBITS by the compiler.
|
||||
* Otherwise, the type of .notes section would become PROGBITS instead of NOTES.
|
||||
*/
|
||||
#define NOTES \
|
||||
/DISCARD/ : { *(.note.GNU-stack) } \
|
||||
.notes : AT(ADDR(.notes) - LOAD_OFFSET) { \
|
||||
__start_notes = .; \
|
||||
KEEP(*(.note.*)) \
|
||||
@ -907,10 +912,17 @@
|
||||
* section definitions so that such archs put those in earlier section
|
||||
* definitions.
|
||||
*/
|
||||
#ifdef RUNTIME_DISCARD_EXIT
|
||||
#define EXIT_DISCARDS
|
||||
#else
|
||||
#define EXIT_DISCARDS \
|
||||
EXIT_TEXT \
|
||||
EXIT_DATA
|
||||
#endif
|
||||
|
||||
#define DISCARDS \
|
||||
/DISCARD/ : { \
|
||||
EXIT_TEXT \
|
||||
EXIT_DATA \
|
||||
EXIT_DISCARDS \
|
||||
EXIT_CALL \
|
||||
*(.discard) \
|
||||
*(.discard.*) \
|
||||
|
@ -261,7 +261,7 @@ static inline struct fwnode_handle *irq_domain_alloc_fwnode(phys_addr_t *pa)
|
||||
}
|
||||
|
||||
void irq_domain_free_fwnode(struct fwnode_handle *fwnode);
|
||||
struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size,
|
||||
struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, unsigned int size,
|
||||
irq_hw_number_t hwirq_max, int direct_max,
|
||||
const struct irq_domain_ops *ops,
|
||||
void *host_data);
|
||||
|
@ -3108,6 +3108,8 @@
|
||||
|
||||
#define PCI_VENDOR_ID_3COM_2 0xa727
|
||||
|
||||
#define PCI_VENDOR_ID_SOLIDRUN 0xd063
|
||||
|
||||
#define PCI_VENDOR_ID_DIGIUM 0xd161
|
||||
#define PCI_DEVICE_ID_DIGIUM_HFC4S 0xb410
|
||||
|
||||
|
@ -17,6 +17,13 @@ static inline bool nf_tproxy_sk_is_transparent(struct sock *sk)
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void nf_tproxy_twsk_deschedule_put(struct inet_timewait_sock *tw)
|
||||
{
|
||||
local_bh_disable();
|
||||
inet_twsk_deschedule_put(tw);
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
/* assign a socket to the skb -- consumes sk */
|
||||
static inline void nf_tproxy_assign_sock(struct sk_buff *skb, struct sock *sk)
|
||||
{
|
||||
|
@ -2719,6 +2719,7 @@ static int btf_datasec_resolve(struct btf_verifier_env *env,
|
||||
struct btf *btf = env->btf;
|
||||
u16 i;
|
||||
|
||||
env->resolve_mode = RESOLVE_TBD;
|
||||
for_each_vsi_from(i, v->next_member, v->t, vsi) {
|
||||
u32 var_type_id = vsi->type, type_id, type_size = 0;
|
||||
const struct btf_type *var_type = btf_type_by_id(env->btf,
|
||||
|
@ -114,23 +114,12 @@ void irq_domain_free_fwnode(struct fwnode_handle *fwnode)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(irq_domain_free_fwnode);
|
||||
|
||||
/**
|
||||
* __irq_domain_add() - Allocate a new irq_domain data structure
|
||||
* @fwnode: firmware node for the interrupt controller
|
||||
* @size: Size of linear map; 0 for radix mapping only
|
||||
* @hwirq_max: Maximum number of interrupts supported by controller
|
||||
* @direct_max: Maximum value of direct maps; Use ~0 for no limit; 0 for no
|
||||
* direct mapping
|
||||
* @ops: domain callbacks
|
||||
* @host_data: Controller private data pointer
|
||||
*
|
||||
* Allocates and initializes an irq_domain structure.
|
||||
* Returns pointer to IRQ domain, or NULL on failure.
|
||||
*/
|
||||
struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size,
|
||||
irq_hw_number_t hwirq_max, int direct_max,
|
||||
const struct irq_domain_ops *ops,
|
||||
void *host_data)
|
||||
static struct irq_domain *__irq_domain_create(struct fwnode_handle *fwnode,
|
||||
unsigned int size,
|
||||
irq_hw_number_t hwirq_max,
|
||||
int direct_max,
|
||||
const struct irq_domain_ops *ops,
|
||||
void *host_data)
|
||||
{
|
||||
struct device_node *of_node = to_of_node(fwnode);
|
||||
struct irqchip_fwid *fwid;
|
||||
@ -222,12 +211,44 @@ struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size,
|
||||
domain->revmap_direct_max_irq = direct_max;
|
||||
irq_domain_check_hierarchy(domain);
|
||||
|
||||
return domain;
|
||||
}
|
||||
|
||||
static void __irq_domain_publish(struct irq_domain *domain)
|
||||
{
|
||||
mutex_lock(&irq_domain_mutex);
|
||||
debugfs_add_domain_dir(domain);
|
||||
list_add(&domain->link, &irq_domain_list);
|
||||
mutex_unlock(&irq_domain_mutex);
|
||||
|
||||
pr_debug("Added domain %s\n", domain->name);
|
||||
}
|
||||
|
||||
/**
|
||||
* __irq_domain_add() - Allocate a new irq_domain data structure
|
||||
* @fwnode: firmware node for the interrupt controller
|
||||
* @size: Size of linear map; 0 for radix mapping only
|
||||
* @hwirq_max: Maximum number of interrupts supported by controller
|
||||
* @direct_max: Maximum value of direct maps; Use ~0 for no limit; 0 for no
|
||||
* direct mapping
|
||||
* @ops: domain callbacks
|
||||
* @host_data: Controller private data pointer
|
||||
*
|
||||
* Allocates and initializes an irq_domain structure.
|
||||
* Returns pointer to IRQ domain, or NULL on failure.
|
||||
*/
|
||||
struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, unsigned int size,
|
||||
irq_hw_number_t hwirq_max, int direct_max,
|
||||
const struct irq_domain_ops *ops,
|
||||
void *host_data)
|
||||
{
|
||||
struct irq_domain *domain;
|
||||
|
||||
domain = __irq_domain_create(fwnode, size, hwirq_max, direct_max,
|
||||
ops, host_data);
|
||||
if (domain)
|
||||
__irq_domain_publish(domain);
|
||||
|
||||
return domain;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__irq_domain_add);
|
||||
@ -1075,12 +1096,15 @@ struct irq_domain *irq_domain_create_hierarchy(struct irq_domain *parent,
|
||||
struct irq_domain *domain;
|
||||
|
||||
if (size)
|
||||
domain = irq_domain_create_linear(fwnode, size, ops, host_data);
|
||||
domain = __irq_domain_create(fwnode, size, size, 0, ops, host_data);
|
||||
else
|
||||
domain = irq_domain_create_tree(fwnode, ops, host_data);
|
||||
domain = __irq_domain_create(fwnode, 0, ~0, 0, ops, host_data);
|
||||
|
||||
if (domain) {
|
||||
domain->parent = parent;
|
||||
domain->flags |= flags;
|
||||
|
||||
__irq_domain_publish(domain);
|
||||
}
|
||||
|
||||
return domain;
|
||||
|
@ -134,6 +134,9 @@ static int cfusbl_device_notify(struct notifier_block *me, unsigned long what,
|
||||
struct usb_device *usbdev;
|
||||
int res;
|
||||
|
||||
if (what == NETDEV_UNREGISTER && dev->reg_state >= NETREG_UNREGISTERED)
|
||||
return 0;
|
||||
|
||||
/* Check whether we have a NCM device, and find its VID/PID. */
|
||||
if (!(dev->dev.parent && dev->dev.parent->driver &&
|
||||
strcmp(dev->dev.parent->driver->name, "cdc_ncm") == 0))
|
||||
|
@ -38,7 +38,7 @@ nf_tproxy_handle_time_wait4(struct net *net, struct sk_buff *skb,
|
||||
hp->source, lport ? lport : hp->dest,
|
||||
skb->dev, NF_TPROXY_LOOKUP_LISTENER);
|
||||
if (sk2) {
|
||||
inet_twsk_deschedule_put(inet_twsk(sk));
|
||||
nf_tproxy_twsk_deschedule_put(inet_twsk(sk));
|
||||
sk = sk2;
|
||||
}
|
||||
}
|
||||
|
@ -477,6 +477,7 @@ int ila_xlat_nl_cmd_get_mapping(struct sk_buff *skb, struct genl_info *info)
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
ret = -ESRCH;
|
||||
ila = ila_lookup_by_params(&xp, ilan);
|
||||
if (ila) {
|
||||
ret = ila_dump_info(ila,
|
||||
|
@ -63,7 +63,7 @@ nf_tproxy_handle_time_wait6(struct sk_buff *skb, int tproto, int thoff,
|
||||
lport ? lport : hp->dest,
|
||||
skb->dev, NF_TPROXY_LOOKUP_LISTENER);
|
||||
if (sk2) {
|
||||
inet_twsk_deschedule_put(inet_twsk(sk));
|
||||
nf_tproxy_twsk_deschedule_put(inet_twsk(sk));
|
||||
sk = sk2;
|
||||
}
|
||||
}
|
||||
|
@ -1454,8 +1454,8 @@ static int nfc_se_io(struct nfc_dev *dev, u32 se_idx,
|
||||
return rc;
|
||||
|
||||
error:
|
||||
kfree(cb_context);
|
||||
device_unlock(&dev->dev);
|
||||
kfree(cb_context);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -1542,16 +1542,14 @@ static int smc_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct smc_sock *smc;
|
||||
int rc = -EPIPE;
|
||||
int rc;
|
||||
|
||||
smc = smc_sk(sk);
|
||||
lock_sock(sk);
|
||||
if ((sk->sk_state != SMC_ACTIVE) &&
|
||||
(sk->sk_state != SMC_APPCLOSEWAIT1) &&
|
||||
(sk->sk_state != SMC_INIT))
|
||||
goto out;
|
||||
|
||||
/* SMC does not support connect with fastopen */
|
||||
if (msg->msg_flags & MSG_FASTOPEN) {
|
||||
/* not connected yet, fallback */
|
||||
if (sk->sk_state == SMC_INIT && !smc->connect_nonblock) {
|
||||
smc_switch_to_fallback(smc);
|
||||
smc->fallback_rsn = SMC_CLC_DECL_OPTUNSUPP;
|
||||
@ -1559,6 +1557,11 @@ static int smc_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
|
||||
rc = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
} else if ((sk->sk_state != SMC_ACTIVE) &&
|
||||
(sk->sk_state != SMC_APPCLOSEWAIT1) &&
|
||||
(sk->sk_state != SMC_INIT)) {
|
||||
rc = -EPIPE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (smc->use_fallback)
|
||||
|
@ -404,6 +404,8 @@ EOF
|
||||
echo SERVER-$family | ip netns exec "$ns1" timeout 5 socat -u STDIN TCP-LISTEN:2000 &
|
||||
sc_s=$!
|
||||
|
||||
sleep 1
|
||||
|
||||
result=$(ip netns exec "$ns0" timeout 1 socat TCP:$daddr:2000 STDOUT)
|
||||
|
||||
if [ "$result" = "SERVER-inet" ];then
|
||||
|
Loading…
Reference in New Issue
Block a user