mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-11 13:27:06 +09:00
Merge bdefb8ce7c ("tty: rp2: Fix reset with non forgiving PCIe host bridges") into android14-6.1-lts
Steps on the way to 6.1.113 Resolves merge conflicts: fs/f2fs/file.c include/linux/sbitmap.h include/linux/usb/usbnet.h lib/sbitmap.c Change-Id: Idb91c8878c10a6dbde9e27b0ad8194a2b1625ec2 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -133,7 +133,6 @@ GTAGS
|
||||
# id-utils files
|
||||
ID
|
||||
|
||||
*.orig
|
||||
*~
|
||||
\#*#
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ KernelVersion:
|
||||
Contact: linux-iio@vger.kernel.org
|
||||
Description:
|
||||
Reading this returns the valid values that can be written to the
|
||||
on_altvoltage0_mode attribute:
|
||||
filter_mode attribute:
|
||||
|
||||
- auto -> Adjust bandpass filter to track changes in input clock rate.
|
||||
- manual -> disable/unregister the clock rate notifier / input clock tracking.
|
||||
|
||||
@@ -23,7 +23,6 @@ properties:
|
||||
- ak8963
|
||||
- ak09911
|
||||
- ak09912
|
||||
- ak09916
|
||||
deprecated: true
|
||||
|
||||
reg:
|
||||
|
||||
@@ -359,7 +359,7 @@ static unsigned long ep93xx_div_recalc_rate(struct clk_hw *hw,
|
||||
u32 val = __raw_readl(psc->reg);
|
||||
u8 index = (val & psc->mask) >> psc->shift;
|
||||
|
||||
if (index > psc->num_div)
|
||||
if (index >= psc->num_div)
|
||||
return 0;
|
||||
|
||||
return DIV_ROUND_UP_ULL(parent_rate, psc->div[index]);
|
||||
|
||||
@@ -922,6 +922,7 @@
|
||||
usb2-lpm-disable;
|
||||
vusb33-supply = <&mt6359_vusb_ldo_reg>;
|
||||
vbus-supply = <&usb_vbus>;
|
||||
mediatek,u3p-dis-msk = <1>;
|
||||
};
|
||||
|
||||
#include <arm/cros-ec-keyboard.dtsi>
|
||||
|
||||
@@ -62,7 +62,7 @@ void perf_callchain_user(struct perf_callchain_entry_ctx *entry,
|
||||
perf_callchain_store(entry, regs->epc);
|
||||
|
||||
fp = user_backtrace(entry, fp, regs->ra);
|
||||
while (fp && !(fp & 0x3) && entry->nr < entry->max_stack)
|
||||
while (fp && !(fp & 0x7) && entry->nr < entry->max_stack)
|
||||
fp = user_backtrace(entry, fp, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -2297,6 +2297,29 @@ void kvm_lapic_set_eoi(struct kvm_vcpu *vcpu)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(kvm_lapic_set_eoi);
|
||||
|
||||
#define X2APIC_ICR_RESERVED_BITS (GENMASK_ULL(31, 20) | GENMASK_ULL(17, 16) | BIT(13))
|
||||
|
||||
int kvm_x2apic_icr_write(struct kvm_lapic *apic, u64 data)
|
||||
{
|
||||
if (data & X2APIC_ICR_RESERVED_BITS)
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* The BUSY bit is reserved on both Intel and AMD in x2APIC mode, but
|
||||
* only AMD requires it to be zero, Intel essentially just ignores the
|
||||
* bit. And if IPI virtualization (Intel) or x2AVIC (AMD) is enabled,
|
||||
* the CPU performs the reserved bits checks, i.e. the underlying CPU
|
||||
* behavior will "win". Arbitrarily clear the BUSY bit, as there is no
|
||||
* sane way to provide consistent behavior with respect to hardware.
|
||||
*/
|
||||
data &= ~APIC_ICR_BUSY;
|
||||
|
||||
kvm_apic_send_ipi(apic, (u32)data, (u32)(data >> 32));
|
||||
kvm_lapic_set_reg64(apic, APIC_ICR, data);
|
||||
trace_kvm_apic_write(APIC_ICR, data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* emulate APIC access in a trap manner */
|
||||
void kvm_apic_write_nodecode(struct kvm_vcpu *vcpu, u32 offset)
|
||||
{
|
||||
@@ -2314,7 +2337,7 @@ void kvm_apic_write_nodecode(struct kvm_vcpu *vcpu, u32 offset)
|
||||
* maybe-unecessary write, and both are in the noise anyways.
|
||||
*/
|
||||
if (apic_x2apic_mode(apic) && offset == APIC_ICR)
|
||||
kvm_x2apic_icr_write(apic, kvm_lapic_get_reg64(apic, APIC_ICR));
|
||||
WARN_ON_ONCE(kvm_x2apic_icr_write(apic, kvm_lapic_get_reg64(apic, APIC_ICR)));
|
||||
else
|
||||
kvm_lapic_reg_write(apic, offset, kvm_lapic_get_reg(apic, offset));
|
||||
}
|
||||
@@ -2936,16 +2959,6 @@ int kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kvm_x2apic_icr_write(struct kvm_lapic *apic, u64 data)
|
||||
{
|
||||
data &= ~APIC_ICR_BUSY;
|
||||
|
||||
kvm_apic_send_ipi(apic, (u32)data, (u32)(data >> 32));
|
||||
kvm_lapic_set_reg64(apic, APIC_ICR, data);
|
||||
trace_kvm_apic_write(APIC_ICR, data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kvm_lapic_msr_read(struct kvm_lapic *apic, u32 reg, u64 *data)
|
||||
{
|
||||
u32 low;
|
||||
|
||||
@@ -61,17 +61,18 @@ struct key *find_asymmetric_key(struct key *keyring,
|
||||
char *req, *p;
|
||||
int len;
|
||||
|
||||
WARN_ON(!id_0 && !id_1 && !id_2);
|
||||
|
||||
if (id_0) {
|
||||
lookup = id_0->data;
|
||||
len = id_0->len;
|
||||
} else if (id_1) {
|
||||
lookup = id_1->data;
|
||||
len = id_1->len;
|
||||
} else {
|
||||
} else if (id_2) {
|
||||
lookup = id_2->data;
|
||||
len = id_2->len;
|
||||
} else {
|
||||
WARN_ON(1);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
/* Construct an identifier "id:<keyid>". */
|
||||
|
||||
@@ -852,6 +852,26 @@ static void fw_abort_batch_reqs(struct firmware *fw)
|
||||
mutex_unlock(&fw_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* Reject firmware file names with ".." path components.
|
||||
* There are drivers that construct firmware file names from device-supplied
|
||||
* strings, and we don't want some device to be able to tell us "I would like to
|
||||
* be sent my firmware from ../../../etc/shadow, please".
|
||||
*
|
||||
* Search for ".." surrounded by either '/' or start/end of string.
|
||||
*
|
||||
* This intentionally only looks at the firmware name, not at the firmware base
|
||||
* directory or at symlink contents.
|
||||
*/
|
||||
static bool name_contains_dotdot(const char *name)
|
||||
{
|
||||
size_t name_len = strlen(name);
|
||||
|
||||
return strcmp(name, "..") == 0 || strncmp(name, "../", 3) == 0 ||
|
||||
strstr(name, "/../") != NULL ||
|
||||
(name_len >= 3 && strcmp(name+name_len-3, "/..") == 0);
|
||||
}
|
||||
|
||||
/* called from request_firmware() and request_firmware_work_func() */
|
||||
static int
|
||||
_request_firmware(const struct firmware **firmware_p, const char *name,
|
||||
@@ -872,6 +892,14 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (name_contains_dotdot(name)) {
|
||||
dev_warn(device,
|
||||
"Firmware load for '%s' refused, path contains '..' component\n",
|
||||
name);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = _request_firmware_prepare(&fw, name, device, buf, size,
|
||||
offset, opt_flags);
|
||||
if (ret <= 0) /* error or already assigned */
|
||||
@@ -947,6 +975,8 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
|
||||
* @name will be used as $FIRMWARE in the uevent environment and
|
||||
* should be distinctive enough not to be confused with any other
|
||||
* firmware image for this or any other device.
|
||||
* It must not contain any ".." path components - "foo/bar..bin" is
|
||||
* allowed, but "foo/../bar.bin" is not.
|
||||
*
|
||||
* Caller must hold the reference count of @device.
|
||||
*
|
||||
|
||||
@@ -85,6 +85,7 @@ static int integrator_ap_lm_probe(struct platform_device *pdev)
|
||||
return -ENODEV;
|
||||
}
|
||||
map = syscon_node_to_regmap(syscon);
|
||||
of_node_put(syscon);
|
||||
if (IS_ERR(map)) {
|
||||
dev_err(dev,
|
||||
"could not find Integrator/AP system controller\n");
|
||||
|
||||
@@ -538,6 +538,15 @@ static const struct mhi_pci_dev_info mhi_telit_fn990_info = {
|
||||
.mru_default = 32768,
|
||||
};
|
||||
|
||||
static const struct mhi_pci_dev_info mhi_telit_fe990a_info = {
|
||||
.name = "telit-fe990a",
|
||||
.config = &modem_telit_fn990_config,
|
||||
.bar_num = MHI_PCI_DEFAULT_BAR_NUM,
|
||||
.dma_data_width = 32,
|
||||
.sideband_wake = false,
|
||||
.mru_default = 32768,
|
||||
};
|
||||
|
||||
/* Keep the list sorted based on the PID. New VID should be added as the last entry */
|
||||
static const struct pci_device_id mhi_pci_id_table[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0304),
|
||||
@@ -553,9 +562,9 @@ static const struct pci_device_id mhi_pci_id_table[] = {
|
||||
/* Telit FN990 */
|
||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, 0x1c5d, 0x2010),
|
||||
.driver_data = (kernel_ulong_t) &mhi_telit_fn990_info },
|
||||
/* Telit FE990 */
|
||||
/* Telit FE990A */
|
||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, 0x1c5d, 0x2015),
|
||||
.driver_data = (kernel_ulong_t) &mhi_telit_fn990_info },
|
||||
.driver_data = (kernel_ulong_t) &mhi_telit_fe990a_info },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0308),
|
||||
.driver_data = (kernel_ulong_t) &mhi_qcom_sdx65_info },
|
||||
{ PCI_DEVICE(0x1eac, 0x1001), /* EM120R-GL (sdx24) */
|
||||
|
||||
@@ -250,6 +250,7 @@ static int of_dra7_atl_clk_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
clk = of_clk_get_from_provider(&clkspec);
|
||||
of_node_put(clkspec.np);
|
||||
if (IS_ERR(clk)) {
|
||||
pr_err("%s: failed to get atl clock %d from provider\n",
|
||||
__func__, i);
|
||||
|
||||
@@ -211,11 +211,10 @@ int cxl_await_media_ready(struct cxl_dev_state *cxlds)
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(cxl_await_media_ready, CXL);
|
||||
|
||||
static int wait_for_valid(struct cxl_dev_state *cxlds)
|
||||
static int wait_for_valid(struct pci_dev *pdev, int d)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(cxlds->dev);
|
||||
int d = cxlds->cxl_dvsec, rc;
|
||||
u32 val;
|
||||
int rc;
|
||||
|
||||
/*
|
||||
* Memory_Info_Valid: When set, indicates that the CXL Range 1 Size high
|
||||
@@ -404,20 +403,11 @@ static bool __cxl_hdm_decode_init(struct cxl_dev_state *cxlds,
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* cxl_hdm_decode_init() - Setup HDM decoding for the endpoint
|
||||
* @cxlds: Device state
|
||||
* @cxlhdm: Mapped HDM decoder Capability
|
||||
*
|
||||
* Try to enable the endpoint's HDM Decoder Capability
|
||||
*/
|
||||
int cxl_hdm_decode_init(struct cxl_dev_state *cxlds, struct cxl_hdm *cxlhdm)
|
||||
static int cxl_dvsec_rr_decode(struct device *dev, int d,
|
||||
struct cxl_endpoint_dvsec_info *info)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(cxlds->dev);
|
||||
struct cxl_endpoint_dvsec_info info = { 0 };
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
int hdm_count, rc, i, ranges = 0;
|
||||
struct device *dev = &pdev->dev;
|
||||
int d = cxlds->cxl_dvsec;
|
||||
u16 cap, ctrl;
|
||||
|
||||
if (!d) {
|
||||
@@ -448,7 +438,7 @@ int cxl_hdm_decode_init(struct cxl_dev_state *cxlds, struct cxl_hdm *cxlhdm)
|
||||
if (!hdm_count || hdm_count > 2)
|
||||
return -EINVAL;
|
||||
|
||||
rc = wait_for_valid(cxlds);
|
||||
rc = wait_for_valid(pdev, d);
|
||||
if (rc) {
|
||||
dev_dbg(dev, "Failure awaiting MEM_INFO_VALID (%d)\n", rc);
|
||||
return rc;
|
||||
@@ -459,9 +449,9 @@ int cxl_hdm_decode_init(struct cxl_dev_state *cxlds, struct cxl_hdm *cxlhdm)
|
||||
* disabled, and they will remain moot after the HDM Decoder
|
||||
* capability is enabled.
|
||||
*/
|
||||
info.mem_enabled = FIELD_GET(CXL_DVSEC_MEM_ENABLE, ctrl);
|
||||
if (!info.mem_enabled)
|
||||
goto hdm_init;
|
||||
info->mem_enabled = FIELD_GET(CXL_DVSEC_MEM_ENABLE, ctrl);
|
||||
if (!info->mem_enabled)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < hdm_count; i++) {
|
||||
u64 base, size;
|
||||
@@ -480,6 +470,9 @@ int cxl_hdm_decode_init(struct cxl_dev_state *cxlds, struct cxl_hdm *cxlhdm)
|
||||
return rc;
|
||||
|
||||
size |= temp & CXL_DVSEC_MEM_SIZE_LOW_MASK;
|
||||
if (!size) {
|
||||
continue;
|
||||
}
|
||||
|
||||
rc = pci_read_config_dword(
|
||||
pdev, d + CXL_DVSEC_RANGE_BASE_HIGH(i), &temp);
|
||||
@@ -495,22 +488,39 @@ int cxl_hdm_decode_init(struct cxl_dev_state *cxlds, struct cxl_hdm *cxlhdm)
|
||||
|
||||
base |= temp & CXL_DVSEC_MEM_BASE_LOW_MASK;
|
||||
|
||||
info.dvsec_range[i] = (struct range) {
|
||||
info->dvsec_range[ranges++] = (struct range) {
|
||||
.start = base,
|
||||
.end = base + size - 1
|
||||
};
|
||||
|
||||
if (size)
|
||||
ranges++;
|
||||
}
|
||||
|
||||
info.ranges = ranges;
|
||||
info->ranges = ranges;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* cxl_hdm_decode_init() - Setup HDM decoding for the endpoint
|
||||
* @cxlds: Device state
|
||||
* @cxlhdm: Mapped HDM decoder Capability
|
||||
*
|
||||
* Try to enable the endpoint's HDM Decoder Capability
|
||||
*/
|
||||
int cxl_hdm_decode_init(struct cxl_dev_state *cxlds, struct cxl_hdm *cxlhdm)
|
||||
{
|
||||
struct cxl_endpoint_dvsec_info info = { 0 };
|
||||
struct device *dev = cxlds->dev;
|
||||
int d = cxlds->cxl_dvsec;
|
||||
int rc;
|
||||
|
||||
rc = cxl_dvsec_rr_decode(dev, d, &info);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
/*
|
||||
* If DVSEC ranges are being used instead of HDM decoder registers there
|
||||
* is no use in trying to manage those.
|
||||
*/
|
||||
hdm_init:
|
||||
if (!__cxl_hdm_decode_init(cxlds, cxlhdm, &info)) {
|
||||
dev_err(dev,
|
||||
"Legacy range registers configuration prevents HDM operation.\n");
|
||||
|
||||
@@ -4050,6 +4050,7 @@ static int amdgpu_dm_mode_config_init(struct amdgpu_device *adev)
|
||||
|
||||
#define AMDGPU_DM_DEFAULT_MIN_BACKLIGHT 12
|
||||
#define AMDGPU_DM_DEFAULT_MAX_BACKLIGHT 255
|
||||
#define AMDGPU_DM_MIN_SPREAD ((AMDGPU_DM_DEFAULT_MAX_BACKLIGHT - AMDGPU_DM_DEFAULT_MIN_BACKLIGHT) / 2)
|
||||
#define AUX_BL_DEFAULT_TRANSITION_TIME_MS 50
|
||||
|
||||
static void amdgpu_dm_update_backlight_caps(struct amdgpu_display_manager *dm,
|
||||
@@ -4064,6 +4065,21 @@ static void amdgpu_dm_update_backlight_caps(struct amdgpu_display_manager *dm,
|
||||
return;
|
||||
|
||||
amdgpu_acpi_get_backlight_caps(&caps);
|
||||
|
||||
/* validate the firmware value is sane */
|
||||
if (caps.caps_valid) {
|
||||
int spread = caps.max_input_signal - caps.min_input_signal;
|
||||
|
||||
if (caps.max_input_signal > AMDGPU_DM_DEFAULT_MAX_BACKLIGHT ||
|
||||
caps.min_input_signal < AMDGPU_DM_DEFAULT_MIN_BACKLIGHT ||
|
||||
spread > AMDGPU_DM_DEFAULT_MAX_BACKLIGHT ||
|
||||
spread < AMDGPU_DM_MIN_SPREAD) {
|
||||
DRM_DEBUG_KMS("DM: Invalid backlight caps: min=%d, max=%d\n",
|
||||
caps.min_input_signal, caps.max_input_signal);
|
||||
caps.caps_valid = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (caps.caps_valid) {
|
||||
dm->backlight_caps[bl_idx].caps_valid = true;
|
||||
if (caps.aux_support)
|
||||
|
||||
@@ -251,7 +251,7 @@ static bool validate_dsc_caps_on_connector(struct amdgpu_dm_connector *aconnecto
|
||||
aconnector->dsc_aux = &aconnector->mst_port->dm_dp_aux.aux;
|
||||
|
||||
/* synaptics cascaded MST hub case */
|
||||
if (!aconnector->dsc_aux && is_synaptics_cascaded_panamera(aconnector->dc_link, port))
|
||||
if (is_synaptics_cascaded_panamera(aconnector->dc_link, port))
|
||||
aconnector->dsc_aux = port->mgr->aux;
|
||||
|
||||
if (!aconnector->dsc_aux)
|
||||
@@ -1255,6 +1255,9 @@ static bool is_dsc_need_re_compute(
|
||||
}
|
||||
}
|
||||
|
||||
if (new_stream_on_link_num == 0)
|
||||
return false;
|
||||
|
||||
if (new_stream_on_link_num == 0)
|
||||
return false;
|
||||
|
||||
|
||||
@@ -133,7 +133,7 @@ unsigned int mod_freesync_calc_v_total_from_refresh(
|
||||
|
||||
v_total = div64_u64(div64_u64(((unsigned long long)(
|
||||
frame_duration_in_ns) * (stream->timing.pix_clk_100hz / 10)),
|
||||
stream->timing.h_total), 1000000);
|
||||
stream->timing.h_total) + 500000, 1000000);
|
||||
|
||||
/* v_total cannot be less than nominal */
|
||||
if (v_total < stream->timing.v_total) {
|
||||
|
||||
@@ -348,6 +348,8 @@ void *vmw_bo_map_and_cache(struct vmw_buffer_object *vbo)
|
||||
void *virtual;
|
||||
int ret;
|
||||
|
||||
atomic_inc(&vbo->map_count);
|
||||
|
||||
virtual = ttm_kmap_obj_virtual(&vbo->map, ¬_used);
|
||||
if (virtual)
|
||||
return virtual;
|
||||
@@ -370,10 +372,17 @@ void *vmw_bo_map_and_cache(struct vmw_buffer_object *vbo)
|
||||
*/
|
||||
void vmw_bo_unmap(struct vmw_buffer_object *vbo)
|
||||
{
|
||||
int map_count;
|
||||
|
||||
if (vbo->map.bo == NULL)
|
||||
return;
|
||||
|
||||
ttm_bo_kunmap(&vbo->map);
|
||||
map_count = atomic_dec_return(&vbo->map_count);
|
||||
|
||||
if (!map_count) {
|
||||
ttm_bo_kunmap(&vbo->map);
|
||||
vbo->map.bo = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -510,6 +519,7 @@ int vmw_bo_init(struct vmw_private *dev_priv,
|
||||
BUILD_BUG_ON(TTM_MAX_BO_PRIORITY <= 3);
|
||||
vmw_bo->base.priority = 3;
|
||||
vmw_bo->res_tree = RB_ROOT;
|
||||
atomic_set(&vmw_bo->map_count, 0);
|
||||
|
||||
size = ALIGN(size, PAGE_SIZE);
|
||||
drm_gem_private_object_init(vdev, &vmw_bo->base.base, size);
|
||||
|
||||
@@ -116,6 +116,8 @@ struct vmwgfx_hash_item {
|
||||
* @base: The TTM buffer object
|
||||
* @res_tree: RB tree of resources using this buffer object as a backing MOB
|
||||
* @base_mapped_count: ttm BO mapping count; used by KMS atomic helpers.
|
||||
* @map_count: The number of currently active maps. Will differ from the
|
||||
* cpu_writers because it includes kernel maps.
|
||||
* @cpu_writers: Number of synccpu write grabs. Protected by reservation when
|
||||
* increased. May be decreased without reservation.
|
||||
* @dx_query_ctx: DX context if this buffer object is used as a DX query MOB
|
||||
@@ -129,6 +131,7 @@ struct vmw_buffer_object {
|
||||
/* For KMS atomic helpers: ttm bo mapping count */
|
||||
atomic_t base_mapped_count;
|
||||
|
||||
atomic_t map_count;
|
||||
atomic_t cpu_writers;
|
||||
/* Not ref-counted. Protected by binding_mutex */
|
||||
struct vmw_resource *dx_query_ctx;
|
||||
|
||||
@@ -255,6 +255,7 @@ void tmc_free_sg_table(struct tmc_sg_table *sg_table)
|
||||
{
|
||||
tmc_free_table_pages(sg_table);
|
||||
tmc_free_data_pages(sg_table);
|
||||
kfree(sg_table);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tmc_free_sg_table);
|
||||
|
||||
@@ -336,7 +337,6 @@ struct tmc_sg_table *tmc_alloc_sg_table(struct device *dev,
|
||||
rc = tmc_alloc_table_pages(sg_table);
|
||||
if (rc) {
|
||||
tmc_free_sg_table(sg_table);
|
||||
kfree(sg_table);
|
||||
return ERR_PTR(rc);
|
||||
}
|
||||
|
||||
|
||||
@@ -215,9 +215,9 @@ static int ad7606_write_os_hw(struct iio_dev *indio_dev, int val)
|
||||
struct ad7606_state *st = iio_priv(indio_dev);
|
||||
DECLARE_BITMAP(values, 3);
|
||||
|
||||
values[0] = val;
|
||||
values[0] = val & GENMASK(2, 0);
|
||||
|
||||
gpiod_set_array_value(ARRAY_SIZE(values), st->gpio_os->desc,
|
||||
gpiod_set_array_value(st->gpio_os->ndescs, st->gpio_os->desc,
|
||||
st->gpio_os->info, values);
|
||||
|
||||
/* AD7616 requires a reset to update value */
|
||||
@@ -422,7 +422,7 @@ static int ad7606_request_gpios(struct ad7606_state *st)
|
||||
return PTR_ERR(st->gpio_range);
|
||||
|
||||
st->gpio_standby = devm_gpiod_get_optional(dev, "standby",
|
||||
GPIOD_OUT_HIGH);
|
||||
GPIOD_OUT_LOW);
|
||||
if (IS_ERR(st->gpio_standby))
|
||||
return PTR_ERR(st->gpio_standby);
|
||||
|
||||
@@ -681,7 +681,7 @@ static int ad7606_suspend(struct device *dev)
|
||||
|
||||
if (st->gpio_standby) {
|
||||
gpiod_set_value(st->gpio_range, 1);
|
||||
gpiod_set_value(st->gpio_standby, 0);
|
||||
gpiod_set_value(st->gpio_standby, 1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -249,8 +249,9 @@ static int ad7616_sw_mode_config(struct iio_dev *indio_dev)
|
||||
static int ad7606B_sw_mode_config(struct iio_dev *indio_dev)
|
||||
{
|
||||
struct ad7606_state *st = iio_priv(indio_dev);
|
||||
unsigned long os[3] = {1};
|
||||
DECLARE_BITMAP(os, 3);
|
||||
|
||||
bitmap_fill(os, 3);
|
||||
/*
|
||||
* Software mode is enabled when all three oversampling
|
||||
* pins are set to high. If oversampling gpios are defined
|
||||
@@ -258,7 +259,7 @@ static int ad7606B_sw_mode_config(struct iio_dev *indio_dev)
|
||||
* otherwise, they must be hardwired to VDD
|
||||
*/
|
||||
if (st->gpio_os) {
|
||||
gpiod_set_array_value(ARRAY_SIZE(os),
|
||||
gpiod_set_array_value(st->gpio_os->ndescs,
|
||||
st->gpio_os->desc, st->gpio_os->info, os);
|
||||
}
|
||||
/* OS of 128 and 256 are available only in software mode */
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
*/
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/cleanup.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/module.h>
|
||||
@@ -52,6 +53,7 @@ struct bme680_calib {
|
||||
struct bme680_data {
|
||||
struct regmap *regmap;
|
||||
struct bme680_calib bme680;
|
||||
struct mutex lock; /* Protect multiple serial R/W ops to device. */
|
||||
u8 oversampling_temp;
|
||||
u8 oversampling_press;
|
||||
u8 oversampling_humid;
|
||||
@@ -827,6 +829,8 @@ static int bme680_read_raw(struct iio_dev *indio_dev,
|
||||
{
|
||||
struct bme680_data *data = iio_priv(indio_dev);
|
||||
|
||||
guard(mutex)(&data->lock);
|
||||
|
||||
switch (mask) {
|
||||
case IIO_CHAN_INFO_PROCESSED:
|
||||
switch (chan->type) {
|
||||
@@ -871,6 +875,8 @@ static int bme680_write_raw(struct iio_dev *indio_dev,
|
||||
{
|
||||
struct bme680_data *data = iio_priv(indio_dev);
|
||||
|
||||
guard(mutex)(&data->lock);
|
||||
|
||||
if (val2 != 0)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -967,6 +973,7 @@ int bme680_core_probe(struct device *dev, struct regmap *regmap,
|
||||
name = bme680_match_acpi_device(dev);
|
||||
|
||||
data = iio_priv(indio_dev);
|
||||
mutex_init(&data->lock);
|
||||
dev_set_drvdata(dev, indio_dev);
|
||||
data->regmap = regmap;
|
||||
indio_dev->name = name;
|
||||
|
||||
@@ -813,13 +813,13 @@ static const struct iio_info ak8975_info = {
|
||||
};
|
||||
|
||||
static const struct acpi_device_id ak_acpi_match[] = {
|
||||
{"AK8975", AK8975},
|
||||
{"AK8963", AK8963},
|
||||
{"INVN6500", AK8963},
|
||||
{"AK009911", AK09911},
|
||||
{"AK09911", AK09911},
|
||||
{"AKM9911", AK09911},
|
||||
{"AK09912", AK09912},
|
||||
{"AK8975", (kernel_ulong_t)&ak_def_array[AK8975] },
|
||||
{"AK8963", (kernel_ulong_t)&ak_def_array[AK8963] },
|
||||
{"INVN6500", (kernel_ulong_t)&ak_def_array[AK8963] },
|
||||
{"AK009911", (kernel_ulong_t)&ak_def_array[AK09911] },
|
||||
{"AK09911", (kernel_ulong_t)&ak_def_array[AK09911] },
|
||||
{"AKM9911", (kernel_ulong_t)&ak_def_array[AK09911] },
|
||||
{"AK09912", (kernel_ulong_t)&ak_def_array[AK09912] },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, ak_acpi_match);
|
||||
@@ -883,10 +883,7 @@ static int ak8975_probe(struct i2c_client *client,
|
||||
struct iio_dev *indio_dev;
|
||||
struct gpio_desc *eoc_gpiod;
|
||||
struct gpio_desc *reset_gpiod;
|
||||
const void *match;
|
||||
unsigned int i;
|
||||
int err;
|
||||
enum asahi_compass_chipset chipset;
|
||||
const char *name = NULL;
|
||||
|
||||
/*
|
||||
@@ -928,27 +925,15 @@ static int ak8975_probe(struct i2c_client *client,
|
||||
return err;
|
||||
|
||||
/* id will be NULL when enumerated via ACPI */
|
||||
match = device_get_match_data(&client->dev);
|
||||
if (match) {
|
||||
chipset = (uintptr_t)match;
|
||||
name = dev_name(&client->dev);
|
||||
} else if (id) {
|
||||
chipset = (enum asahi_compass_chipset)(id->driver_data);
|
||||
name = id->name;
|
||||
} else
|
||||
return -ENOSYS;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ak_def_array); i++)
|
||||
if (ak_def_array[i].type == chipset)
|
||||
break;
|
||||
|
||||
if (i == ARRAY_SIZE(ak_def_array)) {
|
||||
dev_err(&client->dev, "AKM device type unsupported: %d\n",
|
||||
chipset);
|
||||
data->def = i2c_get_match_data(client);
|
||||
if (!data->def)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
data->def = &ak_def_array[i];
|
||||
/* If enumerated via firmware node, fix the ABI */
|
||||
if (dev_fwnode(&client->dev))
|
||||
name = dev_name(&client->dev);
|
||||
else
|
||||
name = id->name;
|
||||
|
||||
/* Fetch the regulators */
|
||||
data->vdd = devm_regulator_get(&client->dev, "vdd");
|
||||
@@ -1077,28 +1062,27 @@ static DEFINE_RUNTIME_DEV_PM_OPS(ak8975_dev_pm_ops, ak8975_runtime_suspend,
|
||||
ak8975_runtime_resume, NULL);
|
||||
|
||||
static const struct i2c_device_id ak8975_id[] = {
|
||||
{"ak8975", AK8975},
|
||||
{"ak8963", AK8963},
|
||||
{"AK8963", AK8963},
|
||||
{"ak09911", AK09911},
|
||||
{"ak09912", AK09912},
|
||||
{"ak09916", AK09916},
|
||||
{"ak8975", (kernel_ulong_t)&ak_def_array[AK8975] },
|
||||
{"ak8963", (kernel_ulong_t)&ak_def_array[AK8963] },
|
||||
{"AK8963", (kernel_ulong_t)&ak_def_array[AK8963] },
|
||||
{"ak09911", (kernel_ulong_t)&ak_def_array[AK09911] },
|
||||
{"ak09912", (kernel_ulong_t)&ak_def_array[AK09912] },
|
||||
{"ak09916", (kernel_ulong_t)&ak_def_array[AK09916] },
|
||||
{}
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(i2c, ak8975_id);
|
||||
|
||||
static const struct of_device_id ak8975_of_match[] = {
|
||||
{ .compatible = "asahi-kasei,ak8975", },
|
||||
{ .compatible = "ak8975", },
|
||||
{ .compatible = "asahi-kasei,ak8963", },
|
||||
{ .compatible = "ak8963", },
|
||||
{ .compatible = "asahi-kasei,ak09911", },
|
||||
{ .compatible = "ak09911", },
|
||||
{ .compatible = "asahi-kasei,ak09912", },
|
||||
{ .compatible = "ak09912", },
|
||||
{ .compatible = "asahi-kasei,ak09916", },
|
||||
{ .compatible = "ak09916", },
|
||||
{ .compatible = "asahi-kasei,ak8975", .data = &ak_def_array[AK8975] },
|
||||
{ .compatible = "ak8975", .data = &ak_def_array[AK8975] },
|
||||
{ .compatible = "asahi-kasei,ak8963", .data = &ak_def_array[AK8963] },
|
||||
{ .compatible = "ak8963", .data = &ak_def_array[AK8963] },
|
||||
{ .compatible = "asahi-kasei,ak09911", .data = &ak_def_array[AK09911] },
|
||||
{ .compatible = "ak09911", .data = &ak_def_array[AK09911] },
|
||||
{ .compatible = "asahi-kasei,ak09912", .data = &ak_def_array[AK09912] },
|
||||
{ .compatible = "ak09912", .data = &ak_def_array[AK09912] },
|
||||
{ .compatible = "asahi-kasei,ak09916", .data = &ak_def_array[AK09916] },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ak8975_of_match);
|
||||
|
||||
@@ -1629,8 +1629,10 @@ int ib_cache_setup_one(struct ib_device *device)
|
||||
|
||||
rdma_for_each_port (device, p) {
|
||||
err = ib_cache_update(device, p, true, true, true);
|
||||
if (err)
|
||||
if (err) {
|
||||
gid_table_cleanup_one(device);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1222,6 +1222,8 @@ static int act_establish(struct c4iw_dev *dev, struct sk_buff *skb)
|
||||
int ret;
|
||||
|
||||
ep = lookup_atid(t, atid);
|
||||
if (!ep)
|
||||
return -EINVAL;
|
||||
|
||||
pr_debug("ep %p tid %u snd_isn %u rcv_isn %u\n", ep, tid,
|
||||
be32_to_cpu(req->snd_isn), be32_to_cpu(req->rcv_isn));
|
||||
@@ -2279,6 +2281,9 @@ static int act_open_rpl(struct c4iw_dev *dev, struct sk_buff *skb)
|
||||
int ret = 0;
|
||||
|
||||
ep = lookup_atid(t, atid);
|
||||
if (!ep)
|
||||
return -EINVAL;
|
||||
|
||||
la = (struct sockaddr_in *)&ep->com.local_addr;
|
||||
ra = (struct sockaddr_in *)&ep->com.remote_addr;
|
||||
la6 = (struct sockaddr_in6 *)&ep->com.local_addr;
|
||||
|
||||
@@ -1292,11 +1292,31 @@ int erdma_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static enum ib_qp_state query_qp_state(struct erdma_qp *qp)
|
||||
{
|
||||
switch (qp->attrs.state) {
|
||||
case ERDMA_QP_STATE_IDLE:
|
||||
return IB_QPS_INIT;
|
||||
case ERDMA_QP_STATE_RTR:
|
||||
return IB_QPS_RTR;
|
||||
case ERDMA_QP_STATE_RTS:
|
||||
return IB_QPS_RTS;
|
||||
case ERDMA_QP_STATE_CLOSING:
|
||||
return IB_QPS_ERR;
|
||||
case ERDMA_QP_STATE_TERMINATE:
|
||||
return IB_QPS_ERR;
|
||||
case ERDMA_QP_STATE_ERROR:
|
||||
return IB_QPS_ERR;
|
||||
default:
|
||||
return IB_QPS_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
int erdma_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
|
||||
int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr)
|
||||
{
|
||||
struct erdma_qp *qp;
|
||||
struct erdma_dev *dev;
|
||||
struct erdma_qp *qp;
|
||||
|
||||
if (ibqp && qp_attr && qp_init_attr) {
|
||||
qp = to_eqp(ibqp);
|
||||
@@ -1323,6 +1343,9 @@ int erdma_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
|
||||
|
||||
qp_init_attr->cap = qp_attr->cap;
|
||||
|
||||
qp_attr->qp_state = query_qp_state(qp);
|
||||
qp_attr->cur_qp_state = query_qp_state(qp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1082,9 +1082,9 @@ static bool hem_list_is_bottom_bt(int hopnum, int bt_level)
|
||||
* @bt_level: base address table level
|
||||
* @unit: ba entries per bt page
|
||||
*/
|
||||
static u32 hem_list_calc_ba_range(int hopnum, int bt_level, int unit)
|
||||
static u64 hem_list_calc_ba_range(int hopnum, int bt_level, int unit)
|
||||
{
|
||||
u32 step;
|
||||
u64 step;
|
||||
int max;
|
||||
int i;
|
||||
|
||||
@@ -1120,7 +1120,7 @@ int hns_roce_hem_list_calc_root_ba(const struct hns_roce_buf_region *regions,
|
||||
{
|
||||
struct hns_roce_buf_region *r;
|
||||
int total = 0;
|
||||
int step;
|
||||
u64 step;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < region_cnt; i++) {
|
||||
@@ -1151,7 +1151,7 @@ static int hem_list_alloc_mid_bt(struct hns_roce_dev *hr_dev,
|
||||
int ret = 0;
|
||||
int max_ofs;
|
||||
int level;
|
||||
u32 step;
|
||||
u64 step;
|
||||
int end;
|
||||
|
||||
if (hopnum <= 1)
|
||||
@@ -1175,10 +1175,12 @@ static int hem_list_alloc_mid_bt(struct hns_roce_dev *hr_dev,
|
||||
|
||||
/* config L1 bt to last bt and link them to corresponding parent */
|
||||
for (level = 1; level < hopnum; level++) {
|
||||
cur = hem_list_search_item(&mid_bt[level], offset);
|
||||
if (cur) {
|
||||
hem_ptrs[level] = cur;
|
||||
continue;
|
||||
if (!hem_list_is_bottom_bt(hopnum, level)) {
|
||||
cur = hem_list_search_item(&mid_bt[level], offset);
|
||||
if (cur) {
|
||||
hem_ptrs[level] = cur;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
step = hem_list_calc_ba_range(hopnum, level, unit);
|
||||
@@ -1188,7 +1190,7 @@ static int hem_list_alloc_mid_bt(struct hns_roce_dev *hr_dev,
|
||||
}
|
||||
|
||||
start_aligned = (distance / step) * step + r->offset;
|
||||
end = min_t(int, start_aligned + step - 1, max_ofs);
|
||||
end = min_t(u64, start_aligned + step - 1, max_ofs);
|
||||
cur = hem_list_alloc_item(hr_dev, start_aligned, end, unit,
|
||||
true);
|
||||
if (!cur) {
|
||||
@@ -1277,7 +1279,7 @@ static int setup_middle_bt(struct hns_roce_dev *hr_dev, void *cpu_base,
|
||||
struct hns_roce_hem_item *hem, *temp_hem;
|
||||
int total = 0;
|
||||
int offset;
|
||||
int step;
|
||||
u64 step;
|
||||
|
||||
step = hem_list_calc_ba_range(r->hopnum, 1, unit);
|
||||
if (step < 1)
|
||||
|
||||
@@ -3058,6 +3058,9 @@ err_llm_init_failed:
|
||||
|
||||
static void hns_roce_v2_exit(struct hns_roce_dev *hr_dev)
|
||||
{
|
||||
if (hr_dev->pci_dev->revision == PCI_REVISION_ID_HIP08)
|
||||
free_mr_exit(hr_dev);
|
||||
|
||||
hns_roce_function_clear(hr_dev);
|
||||
|
||||
if (!hr_dev->is_vf)
|
||||
@@ -4572,12 +4575,14 @@ static int config_qp_rq_buf(struct hns_roce_dev *hr_dev,
|
||||
upper_32_bits(to_hr_hw_page_addr(mtts[0])));
|
||||
hr_reg_clear(qpc_mask, QPC_RQ_CUR_BLK_ADDR_H);
|
||||
|
||||
context->rq_nxt_blk_addr = cpu_to_le32(to_hr_hw_page_addr(mtts[1]));
|
||||
qpc_mask->rq_nxt_blk_addr = 0;
|
||||
|
||||
hr_reg_write(context, QPC_RQ_NXT_BLK_ADDR_H,
|
||||
upper_32_bits(to_hr_hw_page_addr(mtts[1])));
|
||||
hr_reg_clear(qpc_mask, QPC_RQ_NXT_BLK_ADDR_H);
|
||||
if (hr_dev->pci_dev->revision == PCI_REVISION_ID_HIP08) {
|
||||
context->rq_nxt_blk_addr =
|
||||
cpu_to_le32(to_hr_hw_page_addr(mtts[1]));
|
||||
qpc_mask->rq_nxt_blk_addr = 0;
|
||||
hr_reg_write(context, QPC_RQ_NXT_BLK_ADDR_H,
|
||||
upper_32_bits(to_hr_hw_page_addr(mtts[1])));
|
||||
hr_reg_clear(qpc_mask, QPC_RQ_NXT_BLK_ADDR_H);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -6222,6 +6227,7 @@ static irqreturn_t abnormal_interrupt_basic(struct hns_roce_dev *hr_dev,
|
||||
struct pci_dev *pdev = hr_dev->pci_dev;
|
||||
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev);
|
||||
const struct hnae3_ae_ops *ops = ae_dev->ops;
|
||||
enum hnae3_reset_type reset_type;
|
||||
irqreturn_t int_work = IRQ_NONE;
|
||||
u32 int_en;
|
||||
|
||||
@@ -6233,10 +6239,12 @@ static irqreturn_t abnormal_interrupt_basic(struct hns_roce_dev *hr_dev,
|
||||
roce_write(hr_dev, ROCEE_VF_ABN_INT_ST_REG,
|
||||
1 << HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S);
|
||||
|
||||
reset_type = hr_dev->is_vf ?
|
||||
HNAE3_VF_FUNC_RESET : HNAE3_FUNC_RESET;
|
||||
|
||||
/* Set reset level for reset_event() */
|
||||
if (ops->set_default_reset_request)
|
||||
ops->set_default_reset_request(ae_dev,
|
||||
HNAE3_FUNC_RESET);
|
||||
ops->set_default_reset_request(ae_dev, reset_type);
|
||||
if (ops->reset_event)
|
||||
ops->reset_event(pdev, NULL);
|
||||
|
||||
@@ -6306,7 +6314,7 @@ static u64 fmea_get_ram_res_addr(u32 res_type, __le64 *data)
|
||||
res_type == ECC_RESOURCE_SCCC)
|
||||
return le64_to_cpu(*data);
|
||||
|
||||
return le64_to_cpu(*data) << PAGE_SHIFT;
|
||||
return le64_to_cpu(*data) << HNS_HW_PAGE_SHIFT;
|
||||
}
|
||||
|
||||
static int fmea_recover_others(struct hns_roce_dev *hr_dev, u32 res_type,
|
||||
@@ -6933,9 +6941,6 @@ static void __hns_roce_hw_v2_uninit_instance(struct hnae3_handle *handle,
|
||||
hr_dev->state = HNS_ROCE_DEVICE_STATE_UNINIT;
|
||||
hns_roce_handle_device_err(hr_dev);
|
||||
|
||||
if (hr_dev->pci_dev->revision == PCI_REVISION_ID_HIP08)
|
||||
free_mr_exit(hr_dev);
|
||||
|
||||
hns_roce_exit(hr_dev);
|
||||
kfree(hr_dev->priv);
|
||||
ib_dealloc_device(&hr_dev->ib_dev);
|
||||
|
||||
@@ -1443,19 +1443,19 @@ void hns_roce_lock_cqs(struct hns_roce_cq *send_cq, struct hns_roce_cq *recv_cq)
|
||||
__acquire(&send_cq->lock);
|
||||
__acquire(&recv_cq->lock);
|
||||
} else if (unlikely(send_cq != NULL && recv_cq == NULL)) {
|
||||
spin_lock_irq(&send_cq->lock);
|
||||
spin_lock(&send_cq->lock);
|
||||
__acquire(&recv_cq->lock);
|
||||
} else if (unlikely(send_cq == NULL && recv_cq != NULL)) {
|
||||
spin_lock_irq(&recv_cq->lock);
|
||||
spin_lock(&recv_cq->lock);
|
||||
__acquire(&send_cq->lock);
|
||||
} else if (send_cq == recv_cq) {
|
||||
spin_lock_irq(&send_cq->lock);
|
||||
spin_lock(&send_cq->lock);
|
||||
__acquire(&recv_cq->lock);
|
||||
} else if (send_cq->cqn < recv_cq->cqn) {
|
||||
spin_lock_irq(&send_cq->lock);
|
||||
spin_lock(&send_cq->lock);
|
||||
spin_lock_nested(&recv_cq->lock, SINGLE_DEPTH_NESTING);
|
||||
} else {
|
||||
spin_lock_irq(&recv_cq->lock);
|
||||
spin_lock(&recv_cq->lock);
|
||||
spin_lock_nested(&send_cq->lock, SINGLE_DEPTH_NESTING);
|
||||
}
|
||||
}
|
||||
@@ -1475,13 +1475,13 @@ void hns_roce_unlock_cqs(struct hns_roce_cq *send_cq,
|
||||
spin_unlock(&recv_cq->lock);
|
||||
} else if (send_cq == recv_cq) {
|
||||
__release(&recv_cq->lock);
|
||||
spin_unlock_irq(&send_cq->lock);
|
||||
spin_unlock(&send_cq->lock);
|
||||
} else if (send_cq->cqn < recv_cq->cqn) {
|
||||
spin_unlock(&recv_cq->lock);
|
||||
spin_unlock_irq(&send_cq->lock);
|
||||
spin_unlock(&send_cq->lock);
|
||||
} else {
|
||||
spin_unlock(&send_cq->lock);
|
||||
spin_unlock_irq(&recv_cq->lock);
|
||||
spin_unlock(&recv_cq->lock);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1324,7 +1324,7 @@ int irdma_modify_qp_roce(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||
if (attr->max_dest_rd_atomic > dev->hw_attrs.max_hw_ird) {
|
||||
ibdev_err(&iwdev->ibdev,
|
||||
"rd_atomic = %d, above max_hw_ird=%d\n",
|
||||
attr->max_rd_atomic,
|
||||
attr->max_dest_rd_atomic,
|
||||
dev->hw_attrs.max_hw_ird);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -627,7 +627,7 @@ static int adp5588_setup(struct adp5588_kpad *kpad)
|
||||
|
||||
for (i = 0; i < KEYP_MAX_EVENT; i++) {
|
||||
ret = adp5588_read(client, KEY_EVENTA);
|
||||
if (ret)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -1120,6 +1120,43 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOLOOP)
|
||||
},
|
||||
/*
|
||||
* Some TongFang barebones have touchpad and/or keyboard issues after
|
||||
* suspend fixable with nomux + reset + noloop + nopnp. Luckily, none of
|
||||
* them have an external PS/2 port so this can safely be set for all of
|
||||
* them.
|
||||
* TongFang barebones come with board_vendor and/or system_vendor set to
|
||||
* a different value for each individual reseller. The only somewhat
|
||||
* universal way to identify them is by board_name.
|
||||
*/
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "GM6XGxX"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "GMxXGxx"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "GMxXGxX"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "GMxHGxx"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
},
|
||||
/*
|
||||
* A lot of modern Clevo barebones have touchpad and/or keyboard issues
|
||||
* after suspend fixable with nomux + reset + noloop + nopnp. Luckily,
|
||||
|
||||
@@ -493,8 +493,10 @@ static blk_status_t dm_mq_queue_rq(struct blk_mq_hw_ctx *hctx,
|
||||
|
||||
map = dm_get_live_table(md, &srcu_idx);
|
||||
if (unlikely(!map)) {
|
||||
DMERR_LIMIT("%s: mapping table unavailable, erroring io",
|
||||
dm_device_name(md));
|
||||
dm_put_live_table(md, srcu_idx);
|
||||
return BLK_STS_RESOURCE;
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
ti = dm_table_find_target(map, 0);
|
||||
dm_put_live_table(md, srcu_idx);
|
||||
|
||||
@@ -1789,10 +1789,15 @@ static void dm_submit_bio(struct bio *bio)
|
||||
struct dm_table *map;
|
||||
|
||||
map = dm_get_live_table(md, &srcu_idx);
|
||||
if (unlikely(!map)) {
|
||||
DMERR_LIMIT("%s: mapping table unavailable, erroring io",
|
||||
dm_device_name(md));
|
||||
bio_io_error(bio);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* If suspended, or map not yet available, queue this IO for later */
|
||||
if (unlikely(test_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags)) ||
|
||||
unlikely(!map)) {
|
||||
/* If suspended, queue this IO for later */
|
||||
if (unlikely(test_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags))) {
|
||||
if (bio->bi_opf & REQ_NOWAIT)
|
||||
bio_wouldblock_error(bio);
|
||||
else if (bio->bi_opf & REQ_RAHEAD)
|
||||
|
||||
@@ -133,10 +133,8 @@ static inline int tuner_i2c_xfer_send_recv(struct tuner_i2c_props *props,
|
||||
} \
|
||||
if (0 == __ret) { \
|
||||
state = kzalloc(sizeof(type), GFP_KERNEL); \
|
||||
if (!state) { \
|
||||
__ret = -ENOMEM; \
|
||||
if (NULL == state) \
|
||||
goto __fail; \
|
||||
} \
|
||||
state->i2c_props.addr = i2caddr; \
|
||||
state->i2c_props.adap = i2cadap; \
|
||||
state->i2c_props.name = devname; \
|
||||
|
||||
@@ -5538,9 +5538,9 @@ bond_xdp_get_xmit_slave(struct net_device *bond_dev, struct xdp_buff *xdp)
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Should never happen. Mode guarded by bond_xdp_check() */
|
||||
netdev_err(bond_dev, "Unknown bonding mode %d for xdp xmit\n", BOND_MODE(bond));
|
||||
WARN_ON_ONCE(1);
|
||||
if (net_ratelimit())
|
||||
netdev_err(bond_dev, "Unknown bonding mode %d for xdp xmit\n",
|
||||
BOND_MODE(bond));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -847,9 +847,11 @@ static void ether3_remove(struct expansion_card *ec)
|
||||
{
|
||||
struct net_device *dev = ecard_get_drvdata(ec);
|
||||
|
||||
ether3_outw(priv(dev)->regs.config2 |= CFG2_CTRLO, REG_CONFIG2);
|
||||
ecard_set_drvdata(ec, NULL);
|
||||
|
||||
unregister_netdev(dev);
|
||||
del_timer_sync(&priv(dev)->timer);
|
||||
free_netdev(dev);
|
||||
ecard_release_resources(ec);
|
||||
}
|
||||
|
||||
@@ -2015,7 +2015,7 @@ static int __alloc_dma_rx_desc_resources(struct stmmac_priv *priv,
|
||||
rx_q->queue_index = queue;
|
||||
rx_q->priv_data = priv;
|
||||
|
||||
pp_params.flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV;
|
||||
pp_params.flags = PP_FLAG_DMA_MAP | (xdp_prog ? PP_FLAG_DMA_SYNC_DEV : 0);
|
||||
pp_params.pool_size = dma_conf->dma_rx_size;
|
||||
num_pages = DIV_ROUND_UP(dma_conf->dma_buf_sz, PAGE_SIZE);
|
||||
pp_params.order = ilog2(num_pages);
|
||||
|
||||
@@ -651,15 +651,15 @@ static int axienet_device_reset(struct net_device *ndev)
|
||||
*
|
||||
* Would either be called after a successful transmit operation, or after
|
||||
* there was an error when setting up the chain.
|
||||
* Returns the number of descriptors handled.
|
||||
* Returns the number of packets handled.
|
||||
*/
|
||||
static int axienet_free_tx_chain(struct axienet_local *lp, u32 first_bd,
|
||||
int nr_bds, bool force, u32 *sizep, int budget)
|
||||
{
|
||||
struct axidma_bd *cur_p;
|
||||
unsigned int status;
|
||||
int i, packets = 0;
|
||||
dma_addr_t phys;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nr_bds; i++) {
|
||||
cur_p = &lp->tx_bd_v[(first_bd + i) % lp->tx_bd_num];
|
||||
@@ -678,8 +678,10 @@ static int axienet_free_tx_chain(struct axienet_local *lp, u32 first_bd,
|
||||
(cur_p->cntrl & XAXIDMA_BD_CTRL_LENGTH_MASK),
|
||||
DMA_TO_DEVICE);
|
||||
|
||||
if (cur_p->skb && (status & XAXIDMA_BD_STS_COMPLETE_MASK))
|
||||
if (cur_p->skb && (status & XAXIDMA_BD_STS_COMPLETE_MASK)) {
|
||||
napi_consume_skb(cur_p->skb, budget);
|
||||
packets++;
|
||||
}
|
||||
|
||||
cur_p->app0 = 0;
|
||||
cur_p->app1 = 0;
|
||||
@@ -695,7 +697,13 @@ static int axienet_free_tx_chain(struct axienet_local *lp, u32 first_bd,
|
||||
*sizep += status & XAXIDMA_BD_STS_ACTUAL_LEN_MASK;
|
||||
}
|
||||
|
||||
return i;
|
||||
if (!force) {
|
||||
lp->tx_bd_ci += i;
|
||||
if (lp->tx_bd_ci >= lp->tx_bd_num)
|
||||
lp->tx_bd_ci %= lp->tx_bd_num;
|
||||
}
|
||||
|
||||
return packets;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -746,13 +754,10 @@ static int axienet_tx_poll(struct napi_struct *napi, int budget)
|
||||
u32 size = 0;
|
||||
int packets;
|
||||
|
||||
packets = axienet_free_tx_chain(lp, lp->tx_bd_ci, budget, false, &size, budget);
|
||||
packets = axienet_free_tx_chain(lp, lp->tx_bd_ci, lp->tx_bd_num, false,
|
||||
&size, budget);
|
||||
|
||||
if (packets) {
|
||||
lp->tx_bd_ci += packets;
|
||||
if (lp->tx_bd_ci >= lp->tx_bd_num)
|
||||
lp->tx_bd_ci %= lp->tx_bd_num;
|
||||
|
||||
u64_stats_update_begin(&lp->tx_stat_sync);
|
||||
u64_stats_add(&lp->tx_packets, packets);
|
||||
u64_stats_add(&lp->tx_bytes, size);
|
||||
@@ -1041,9 +1046,10 @@ static irqreturn_t axienet_tx_irq(int irq, void *_ndev)
|
||||
u32 cr = lp->tx_dma_cr;
|
||||
|
||||
cr &= ~(XAXIDMA_IRQ_IOC_MASK | XAXIDMA_IRQ_DELAY_MASK);
|
||||
axienet_dma_out32(lp, XAXIDMA_TX_CR_OFFSET, cr);
|
||||
|
||||
napi_schedule(&lp->napi_tx);
|
||||
if (napi_schedule_prep(&lp->napi_tx)) {
|
||||
axienet_dma_out32(lp, XAXIDMA_TX_CR_OFFSET, cr);
|
||||
__napi_schedule(&lp->napi_tx);
|
||||
}
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
@@ -1085,9 +1091,10 @@ static irqreturn_t axienet_rx_irq(int irq, void *_ndev)
|
||||
u32 cr = lp->rx_dma_cr;
|
||||
|
||||
cr &= ~(XAXIDMA_IRQ_IOC_MASK | XAXIDMA_IRQ_DELAY_MASK);
|
||||
axienet_dma_out32(lp, XAXIDMA_RX_CR_OFFSET, cr);
|
||||
|
||||
napi_schedule(&lp->napi_rx);
|
||||
if (napi_schedule_prep(&lp->napi_rx)) {
|
||||
axienet_dma_out32(lp, XAXIDMA_RX_CR_OFFSET, cr);
|
||||
__napi_schedule(&lp->napi_rx);
|
||||
}
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
|
||||
@@ -464,10 +464,15 @@ static enum skb_state defer_bh(struct usbnet *dev, struct sk_buff *skb,
|
||||
void usbnet_defer_kevent (struct usbnet *dev, int work)
|
||||
{
|
||||
set_bit (work, &dev->flags);
|
||||
if (!schedule_work (&dev->kevent))
|
||||
netdev_dbg(dev->net, "kevent %s may have been dropped\n", usbnet_event_names[work]);
|
||||
else
|
||||
netdev_dbg(dev->net, "kevent %s scheduled\n", usbnet_event_names[work]);
|
||||
if (!usbnet_going_away(dev)) {
|
||||
if (!schedule_work(&dev->kevent))
|
||||
netdev_dbg(dev->net,
|
||||
"kevent %s may have been dropped\n",
|
||||
usbnet_event_names[work]);
|
||||
else
|
||||
netdev_dbg(dev->net,
|
||||
"kevent %s scheduled\n", usbnet_event_names[work]);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(usbnet_defer_kevent);
|
||||
|
||||
@@ -535,7 +540,8 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
|
||||
tasklet_schedule (&dev->bh);
|
||||
break;
|
||||
case 0:
|
||||
__usbnet_queue_skb(&dev->rxq, skb, rx_start);
|
||||
if (!usbnet_going_away(dev))
|
||||
__usbnet_queue_skb(&dev->rxq, skb, rx_start);
|
||||
}
|
||||
} else {
|
||||
netif_dbg(dev, ifdown, dev->net, "rx: stopped\n");
|
||||
@@ -845,9 +851,18 @@ int usbnet_stop (struct net_device *net)
|
||||
|
||||
/* deferred work (timer, softirq, task) must also stop */
|
||||
dev->flags = 0;
|
||||
del_timer_sync (&dev->delay);
|
||||
tasklet_kill (&dev->bh);
|
||||
del_timer_sync(&dev->delay);
|
||||
tasklet_kill(&dev->bh);
|
||||
cancel_work_sync(&dev->kevent);
|
||||
|
||||
/* We have cyclic dependencies. Those calls are needed
|
||||
* to break a cycle. We cannot fall into the gaps because
|
||||
* we have a flag
|
||||
*/
|
||||
tasklet_kill(&dev->bh);
|
||||
del_timer_sync(&dev->delay);
|
||||
cancel_work_sync(&dev->kevent);
|
||||
|
||||
if (!pm)
|
||||
usb_autopm_put_interface(dev->intf);
|
||||
|
||||
@@ -1173,7 +1188,8 @@ fail_halt:
|
||||
status);
|
||||
} else {
|
||||
clear_bit (EVENT_RX_HALT, &dev->flags);
|
||||
tasklet_schedule (&dev->bh);
|
||||
if (!usbnet_going_away(dev))
|
||||
tasklet_schedule(&dev->bh);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1198,7 +1214,8 @@ fail_halt:
|
||||
usb_autopm_put_interface(dev->intf);
|
||||
fail_lowmem:
|
||||
if (resched)
|
||||
tasklet_schedule (&dev->bh);
|
||||
if (!usbnet_going_away(dev))
|
||||
tasklet_schedule(&dev->bh);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1554,6 +1571,7 @@ static void usbnet_bh (struct timer_list *t)
|
||||
} else if (netif_running (dev->net) &&
|
||||
netif_device_present (dev->net) &&
|
||||
netif_carrier_ok(dev->net) &&
|
||||
!usbnet_going_away(dev) &&
|
||||
!timer_pending(&dev->delay) &&
|
||||
!test_bit(EVENT_RX_PAUSED, &dev->flags) &&
|
||||
!test_bit(EVENT_RX_HALT, &dev->flags)) {
|
||||
@@ -1601,6 +1619,7 @@ void usbnet_disconnect (struct usb_interface *intf)
|
||||
usb_set_intfdata(intf, NULL);
|
||||
if (!dev)
|
||||
return;
|
||||
usbnet_mark_going_away(dev);
|
||||
|
||||
xdev = interface_to_usbdev (intf);
|
||||
|
||||
|
||||
@@ -778,7 +778,7 @@ static void ndev_init_debugfs(struct intel_ntb_dev *ndev)
|
||||
ndev->debugfs_dir =
|
||||
debugfs_create_dir(pci_name(ndev->ntb.pdev),
|
||||
debugfs_dir);
|
||||
if (!ndev->debugfs_dir)
|
||||
if (IS_ERR(ndev->debugfs_dir))
|
||||
ndev->debugfs_info = NULL;
|
||||
else
|
||||
ndev->debugfs_info =
|
||||
|
||||
@@ -807,16 +807,29 @@ static void ntb_free_mw(struct ntb_transport_ctx *nt, int num_mw)
|
||||
}
|
||||
|
||||
static int ntb_alloc_mw_buffer(struct ntb_transport_mw *mw,
|
||||
struct device *dma_dev, size_t align)
|
||||
struct device *ntb_dev, size_t align)
|
||||
{
|
||||
dma_addr_t dma_addr;
|
||||
void *alloc_addr, *virt_addr;
|
||||
int rc;
|
||||
|
||||
alloc_addr = dma_alloc_coherent(dma_dev, mw->alloc_size,
|
||||
&dma_addr, GFP_KERNEL);
|
||||
/*
|
||||
* The buffer here is allocated against the NTB device. The reason to
|
||||
* use dma_alloc_*() call is to allocate a large IOVA contiguous buffer
|
||||
* backing the NTB BAR for the remote host to write to. During receive
|
||||
* processing, the data is being copied out of the receive buffer to
|
||||
* the kernel skbuff. When a DMA device is being used, dma_map_page()
|
||||
* is called on the kvaddr of the receive buffer (from dma_alloc_*())
|
||||
* and remapped against the DMA device. It appears to be a double
|
||||
* DMA mapping of buffers, but first is mapped to the NTB device and
|
||||
* second is to the DMA device. DMA_ATTR_FORCE_CONTIGUOUS is necessary
|
||||
* in order for the later dma_map_page() to not fail.
|
||||
*/
|
||||
alloc_addr = dma_alloc_attrs(ntb_dev, mw->alloc_size,
|
||||
&dma_addr, GFP_KERNEL,
|
||||
DMA_ATTR_FORCE_CONTIGUOUS);
|
||||
if (!alloc_addr) {
|
||||
dev_err(dma_dev, "Unable to alloc MW buff of size %zu\n",
|
||||
dev_err(ntb_dev, "Unable to alloc MW buff of size %zu\n",
|
||||
mw->alloc_size);
|
||||
return -ENOMEM;
|
||||
}
|
||||
@@ -845,7 +858,7 @@ static int ntb_alloc_mw_buffer(struct ntb_transport_mw *mw,
|
||||
return 0;
|
||||
|
||||
err:
|
||||
dma_free_coherent(dma_dev, mw->alloc_size, alloc_addr, dma_addr);
|
||||
dma_free_coherent(ntb_dev, mw->alloc_size, alloc_addr, dma_addr);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -1227,7 +1227,7 @@ static ssize_t perf_dbgfs_read_info(struct file *filep, char __user *ubuf,
|
||||
"\tOut buffer addr 0x%pK\n", peer->outbuf);
|
||||
|
||||
pos += scnprintf(buf + pos, buf_size - pos,
|
||||
"\tOut buff phys addr %pa[p]\n", &peer->out_phys_addr);
|
||||
"\tOut buff phys addr %pap\n", &peer->out_phys_addr);
|
||||
|
||||
pos += scnprintf(buf + pos, buf_size - pos,
|
||||
"\tOut buffer size %pa\n", &peer->outbuf_size);
|
||||
|
||||
@@ -548,7 +548,7 @@ static void nvme_mpath_set_live(struct nvme_ns *ns)
|
||||
rc = device_add_disk(&head->subsys->dev, head->disk,
|
||||
nvme_ns_id_attr_groups);
|
||||
if (rc) {
|
||||
clear_bit(NVME_NSHEAD_DISK_LIVE, &ns->flags);
|
||||
clear_bit(NVME_NSHEAD_DISK_LIVE, &head->flags);
|
||||
return;
|
||||
}
|
||||
nvme_add_ns_head_cdev(head);
|
||||
|
||||
@@ -956,7 +956,7 @@ static int imx6_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
ret = phy_power_on(imx6_pcie->phy);
|
||||
if (ret) {
|
||||
dev_err(dev, "waiting for PHY ready timeout!\n");
|
||||
goto err_phy_off;
|
||||
goto err_phy_exit;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -971,8 +971,9 @@ static int imx6_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
return 0;
|
||||
|
||||
err_phy_off:
|
||||
if (imx6_pcie->phy)
|
||||
phy_exit(imx6_pcie->phy);
|
||||
phy_power_off(imx6_pcie->phy);
|
||||
err_phy_exit:
|
||||
phy_exit(imx6_pcie->phy);
|
||||
err_clk_disable:
|
||||
imx6_pcie_clk_disable(imx6_pcie);
|
||||
err_reg_disable:
|
||||
|
||||
@@ -416,12 +416,12 @@ static int kirin_pcie_parse_port(struct kirin_pcie *pcie,
|
||||
if (pcie->gpio_id_reset[i] < 0)
|
||||
continue;
|
||||
|
||||
pcie->num_slots++;
|
||||
if (pcie->num_slots > MAX_PCI_SLOTS) {
|
||||
if (pcie->num_slots + 1 >= MAX_PCI_SLOTS) {
|
||||
dev_err(dev, "Too many PCI slots!\n");
|
||||
ret = -EINVAL;
|
||||
goto put_node;
|
||||
}
|
||||
pcie->num_slots++;
|
||||
|
||||
ret = of_pci_get_devfn(child);
|
||||
if (ret < 0) {
|
||||
|
||||
@@ -374,7 +374,7 @@ static void nwl_mask_leg_irq(struct irq_data *data)
|
||||
u32 mask;
|
||||
u32 val;
|
||||
|
||||
mask = 1 << (data->hwirq - 1);
|
||||
mask = 1 << data->hwirq;
|
||||
raw_spin_lock_irqsave(&pcie->leg_mask_lock, flags);
|
||||
val = nwl_bridge_readl(pcie, MSGF_LEG_MASK);
|
||||
nwl_bridge_writel(pcie, (val & (~mask)), MSGF_LEG_MASK);
|
||||
@@ -388,7 +388,7 @@ static void nwl_unmask_leg_irq(struct irq_data *data)
|
||||
u32 mask;
|
||||
u32 val;
|
||||
|
||||
mask = 1 << (data->hwirq - 1);
|
||||
mask = 1 << data->hwirq;
|
||||
raw_spin_lock_irqsave(&pcie->leg_mask_lock, flags);
|
||||
val = nwl_bridge_readl(pcie, MSGF_LEG_MASK);
|
||||
nwl_bridge_writel(pcie, (val | mask), MSGF_LEG_MASK);
|
||||
|
||||
@@ -769,7 +769,7 @@ static int dove_pinctrl_probe(struct platform_device *pdev)
|
||||
of_match_device(dove_pinctrl_of_match, &pdev->dev);
|
||||
struct mvebu_mpp_ctrl_data *mpp_data;
|
||||
void __iomem *base;
|
||||
int i;
|
||||
int i, ret;
|
||||
|
||||
pdev->dev.platform_data = (void *)match->data;
|
||||
|
||||
@@ -784,15 +784,18 @@ static int dove_pinctrl_probe(struct platform_device *pdev)
|
||||
}
|
||||
clk_prepare_enable(clk);
|
||||
|
||||
mpp_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
base = devm_ioremap_resource(&pdev->dev, mpp_res);
|
||||
if (IS_ERR(base))
|
||||
return PTR_ERR(base);
|
||||
base = devm_platform_get_and_ioremap_resource(pdev, 0, &mpp_res);
|
||||
if (IS_ERR(base)) {
|
||||
ret = PTR_ERR(base);
|
||||
goto err_probe;
|
||||
}
|
||||
|
||||
mpp_data = devm_kcalloc(&pdev->dev, dove_pinctrl_info.ncontrols,
|
||||
sizeof(*mpp_data), GFP_KERNEL);
|
||||
if (!mpp_data)
|
||||
return -ENOMEM;
|
||||
if (!mpp_data) {
|
||||
ret = -ENOMEM;
|
||||
goto err_probe;
|
||||
}
|
||||
|
||||
dove_pinctrl_info.control_data = mpp_data;
|
||||
for (i = 0; i < ARRAY_SIZE(dove_mpp_controls); i++)
|
||||
@@ -811,8 +814,10 @@ static int dove_pinctrl_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
mpp4_base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(mpp4_base))
|
||||
return PTR_ERR(mpp4_base);
|
||||
if (IS_ERR(mpp4_base)) {
|
||||
ret = PTR_ERR(mpp4_base);
|
||||
goto err_probe;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
|
||||
if (!res) {
|
||||
@@ -823,8 +828,10 @@ static int dove_pinctrl_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
pmu_base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(pmu_base))
|
||||
return PTR_ERR(pmu_base);
|
||||
if (IS_ERR(pmu_base)) {
|
||||
ret = PTR_ERR(pmu_base);
|
||||
goto err_probe;
|
||||
}
|
||||
|
||||
gconfmap = syscon_regmap_lookup_by_compatible("marvell,dove-global-config");
|
||||
if (IS_ERR(gconfmap)) {
|
||||
@@ -834,12 +841,17 @@ static int dove_pinctrl_probe(struct platform_device *pdev)
|
||||
adjust_resource(&fb_res,
|
||||
(mpp_res->start & INT_REGS_MASK) + GC_REGS_OFFS, 0x14);
|
||||
gc_base = devm_ioremap_resource(&pdev->dev, &fb_res);
|
||||
if (IS_ERR(gc_base))
|
||||
return PTR_ERR(gc_base);
|
||||
if (IS_ERR(gc_base)) {
|
||||
ret = PTR_ERR(gc_base);
|
||||
goto err_probe;
|
||||
}
|
||||
|
||||
gconfmap = devm_regmap_init_mmio(&pdev->dev,
|
||||
gc_base, &gc_regmap_config);
|
||||
if (IS_ERR(gconfmap))
|
||||
return PTR_ERR(gconfmap);
|
||||
if (IS_ERR(gconfmap)) {
|
||||
ret = PTR_ERR(gconfmap);
|
||||
goto err_probe;
|
||||
}
|
||||
}
|
||||
|
||||
/* Warn on any missing DT resource */
|
||||
@@ -847,6 +859,9 @@ static int dove_pinctrl_probe(struct platform_device *pdev)
|
||||
dev_warn(&pdev->dev, FW_BUG "Missing pinctrl regs in DTB. Please update your firmware.\n");
|
||||
|
||||
return mvebu_pinctrl_probe(pdev);
|
||||
err_probe:
|
||||
clk_disable_unprepare(clk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct platform_driver dove_pinctrl_driver = {
|
||||
|
||||
@@ -102,11 +102,15 @@ __setup("mac5380=", mac_scsi_setup);
|
||||
* Linux SCSI drivers lack knowledge of the timing behaviour of SCSI targets
|
||||
* so bus errors are unavoidable.
|
||||
*
|
||||
* If a MOVE.B instruction faults, we assume that zero bytes were transferred
|
||||
* and simply retry. That assumption probably depends on target behaviour but
|
||||
* seems to hold up okay. The NOP provides synchronization: without it the
|
||||
* fault can sometimes occur after the program counter has moved past the
|
||||
* offending instruction. Post-increment addressing can't be used.
|
||||
* If a MOVE.B instruction faults during a receive operation, we assume the
|
||||
* target sent nothing and try again. That assumption probably depends on
|
||||
* target firmware but it seems to hold up okay. If a fault happens during a
|
||||
* send operation, the target may or may not have seen /ACK and got the byte.
|
||||
* It's uncertain so the whole SCSI command gets retried.
|
||||
*
|
||||
* The NOP is needed for synchronization because the fault address in the
|
||||
* exception stack frame may or may not be the instruction that actually
|
||||
* caused the bus error. Post-increment addressing can't be used.
|
||||
*/
|
||||
|
||||
#define MOVE_BYTE(operands) \
|
||||
@@ -208,8 +212,6 @@ __setup("mac5380=", mac_scsi_setup);
|
||||
".previous \n" \
|
||||
: "+a" (addr), "+r" (n), "+r" (result) : "a" (io))
|
||||
|
||||
#define MAC_PDMA_DELAY 32
|
||||
|
||||
static inline int mac_pdma_recv(void __iomem *io, unsigned char *start, int n)
|
||||
{
|
||||
unsigned char *addr = start;
|
||||
@@ -245,22 +247,21 @@ static inline int mac_pdma_send(unsigned char *start, void __iomem *io, int n)
|
||||
if (n >= 1) {
|
||||
MOVE_BYTE("%0@,%3@");
|
||||
if (result)
|
||||
goto out;
|
||||
return -1;
|
||||
}
|
||||
if (n >= 1 && ((unsigned long)addr & 1)) {
|
||||
MOVE_BYTE("%0@,%3@");
|
||||
if (result)
|
||||
goto out;
|
||||
return -2;
|
||||
}
|
||||
while (n >= 32)
|
||||
MOVE_16_WORDS("%0@+,%3@");
|
||||
while (n >= 2)
|
||||
MOVE_WORD("%0@+,%3@");
|
||||
if (result)
|
||||
return start - addr; /* Negated to indicate uncertain length */
|
||||
return start - addr - 1; /* Negated to indicate uncertain length */
|
||||
if (n == 1)
|
||||
MOVE_BYTE("%0@,%3@");
|
||||
out:
|
||||
return addr - start;
|
||||
}
|
||||
|
||||
@@ -274,25 +275,56 @@ static inline void write_ctrl_reg(struct NCR5380_hostdata *hostdata, u32 value)
|
||||
out_be32(hostdata->io + (CTRL_REG << 4), value);
|
||||
}
|
||||
|
||||
static inline int macscsi_wait_for_drq(struct NCR5380_hostdata *hostdata)
|
||||
{
|
||||
unsigned int n = 1; /* effectively multiplies NCR5380_REG_POLL_TIME */
|
||||
unsigned char basr;
|
||||
|
||||
again:
|
||||
basr = NCR5380_read(BUS_AND_STATUS_REG);
|
||||
|
||||
if (!(basr & BASR_PHASE_MATCH))
|
||||
return 1;
|
||||
|
||||
if (basr & BASR_IRQ)
|
||||
return -1;
|
||||
|
||||
if (basr & BASR_DRQ)
|
||||
return 0;
|
||||
|
||||
if (n-- == 0) {
|
||||
NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host);
|
||||
dsprintk(NDEBUG_PSEUDO_DMA, hostdata->host,
|
||||
"%s: DRQ timeout\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
NCR5380_poll_politely2(hostdata,
|
||||
BUS_AND_STATUS_REG, BASR_DRQ, BASR_DRQ,
|
||||
BUS_AND_STATUS_REG, BASR_PHASE_MATCH, 0, 0);
|
||||
goto again;
|
||||
}
|
||||
|
||||
static inline int macscsi_pread(struct NCR5380_hostdata *hostdata,
|
||||
unsigned char *dst, int len)
|
||||
{
|
||||
u8 __iomem *s = hostdata->pdma_io + (INPUT_DATA_REG << 4);
|
||||
unsigned char *d = dst;
|
||||
int result = 0;
|
||||
|
||||
hostdata->pdma_residual = len;
|
||||
|
||||
while (!NCR5380_poll_politely(hostdata, BUS_AND_STATUS_REG,
|
||||
BASR_DRQ | BASR_PHASE_MATCH,
|
||||
BASR_DRQ | BASR_PHASE_MATCH, 0)) {
|
||||
int bytes;
|
||||
while (macscsi_wait_for_drq(hostdata) == 0) {
|
||||
int bytes, chunk_bytes;
|
||||
|
||||
if (macintosh_config->ident == MAC_MODEL_IIFX)
|
||||
write_ctrl_reg(hostdata, CTRL_HANDSHAKE_MODE |
|
||||
CTRL_INTERRUPTS_ENABLE);
|
||||
|
||||
bytes = mac_pdma_recv(s, d, min(hostdata->pdma_residual, 512));
|
||||
chunk_bytes = min(hostdata->pdma_residual, 512);
|
||||
bytes = mac_pdma_recv(s, d, chunk_bytes);
|
||||
|
||||
if (macintosh_config->ident == MAC_MODEL_IIFX)
|
||||
write_ctrl_reg(hostdata, CTRL_INTERRUPTS_ENABLE);
|
||||
|
||||
if (bytes > 0) {
|
||||
d += bytes;
|
||||
@@ -300,37 +332,25 @@ static inline int macscsi_pread(struct NCR5380_hostdata *hostdata,
|
||||
}
|
||||
|
||||
if (hostdata->pdma_residual == 0)
|
||||
goto out;
|
||||
break;
|
||||
|
||||
if (NCR5380_poll_politely2(hostdata, STATUS_REG, SR_REQ, SR_REQ,
|
||||
BUS_AND_STATUS_REG, BASR_ACK,
|
||||
BASR_ACK, 0) < 0)
|
||||
scmd_printk(KERN_DEBUG, hostdata->connected,
|
||||
"%s: !REQ and !ACK\n", __func__);
|
||||
if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH))
|
||||
goto out;
|
||||
|
||||
if (bytes == 0)
|
||||
udelay(MAC_PDMA_DELAY);
|
||||
|
||||
if (bytes >= 0)
|
||||
if (bytes > 0)
|
||||
continue;
|
||||
|
||||
dsprintk(NDEBUG_PSEUDO_DMA, hostdata->host,
|
||||
"%s: bus error (%d/%d)\n", __func__, d - dst, len);
|
||||
NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host);
|
||||
result = -1;
|
||||
goto out;
|
||||
dsprintk(NDEBUG_PSEUDO_DMA, hostdata->host,
|
||||
"%s: bus error [%d/%d] (%d/%d)\n",
|
||||
__func__, d - dst, len, bytes, chunk_bytes);
|
||||
|
||||
if (bytes == 0)
|
||||
continue;
|
||||
|
||||
if (macscsi_wait_for_drq(hostdata) <= 0)
|
||||
set_host_byte(hostdata->connected, DID_ERROR);
|
||||
break;
|
||||
}
|
||||
|
||||
scmd_printk(KERN_ERR, hostdata->connected,
|
||||
"%s: phase mismatch or !DRQ\n", __func__);
|
||||
NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host);
|
||||
result = -1;
|
||||
out:
|
||||
if (macintosh_config->ident == MAC_MODEL_IIFX)
|
||||
write_ctrl_reg(hostdata, CTRL_INTERRUPTS_ENABLE);
|
||||
return result;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int macscsi_pwrite(struct NCR5380_hostdata *hostdata,
|
||||
@@ -338,67 +358,47 @@ static inline int macscsi_pwrite(struct NCR5380_hostdata *hostdata,
|
||||
{
|
||||
unsigned char *s = src;
|
||||
u8 __iomem *d = hostdata->pdma_io + (OUTPUT_DATA_REG << 4);
|
||||
int result = 0;
|
||||
|
||||
hostdata->pdma_residual = len;
|
||||
|
||||
while (!NCR5380_poll_politely(hostdata, BUS_AND_STATUS_REG,
|
||||
BASR_DRQ | BASR_PHASE_MATCH,
|
||||
BASR_DRQ | BASR_PHASE_MATCH, 0)) {
|
||||
int bytes;
|
||||
while (macscsi_wait_for_drq(hostdata) == 0) {
|
||||
int bytes, chunk_bytes;
|
||||
|
||||
if (macintosh_config->ident == MAC_MODEL_IIFX)
|
||||
write_ctrl_reg(hostdata, CTRL_HANDSHAKE_MODE |
|
||||
CTRL_INTERRUPTS_ENABLE);
|
||||
|
||||
bytes = mac_pdma_send(s, d, min(hostdata->pdma_residual, 512));
|
||||
chunk_bytes = min(hostdata->pdma_residual, 512);
|
||||
bytes = mac_pdma_send(s, d, chunk_bytes);
|
||||
|
||||
if (macintosh_config->ident == MAC_MODEL_IIFX)
|
||||
write_ctrl_reg(hostdata, CTRL_INTERRUPTS_ENABLE);
|
||||
|
||||
if (bytes > 0) {
|
||||
s += bytes;
|
||||
hostdata->pdma_residual -= bytes;
|
||||
}
|
||||
|
||||
if (hostdata->pdma_residual == 0) {
|
||||
if (NCR5380_poll_politely(hostdata, TARGET_COMMAND_REG,
|
||||
TCR_LAST_BYTE_SENT,
|
||||
TCR_LAST_BYTE_SENT,
|
||||
0) < 0) {
|
||||
scmd_printk(KERN_ERR, hostdata->connected,
|
||||
"%s: Last Byte Sent timeout\n", __func__);
|
||||
result = -1;
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
if (hostdata->pdma_residual == 0)
|
||||
break;
|
||||
|
||||
if (NCR5380_poll_politely2(hostdata, STATUS_REG, SR_REQ, SR_REQ,
|
||||
BUS_AND_STATUS_REG, BASR_ACK,
|
||||
BASR_ACK, 0) < 0)
|
||||
scmd_printk(KERN_DEBUG, hostdata->connected,
|
||||
"%s: !REQ and !ACK\n", __func__);
|
||||
if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH))
|
||||
goto out;
|
||||
|
||||
if (bytes == 0)
|
||||
udelay(MAC_PDMA_DELAY);
|
||||
|
||||
if (bytes >= 0)
|
||||
if (bytes > 0)
|
||||
continue;
|
||||
|
||||
dsprintk(NDEBUG_PSEUDO_DMA, hostdata->host,
|
||||
"%s: bus error (%d/%d)\n", __func__, s - src, len);
|
||||
NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host);
|
||||
result = -1;
|
||||
goto out;
|
||||
dsprintk(NDEBUG_PSEUDO_DMA, hostdata->host,
|
||||
"%s: bus error [%d/%d] (%d/%d)\n",
|
||||
__func__, s - src, len, bytes, chunk_bytes);
|
||||
|
||||
if (bytes == 0)
|
||||
continue;
|
||||
|
||||
if (macscsi_wait_for_drq(hostdata) <= 0)
|
||||
set_host_byte(hostdata->connected, DID_ERROR);
|
||||
break;
|
||||
}
|
||||
|
||||
scmd_printk(KERN_ERR, hostdata->connected,
|
||||
"%s: phase mismatch or !DRQ\n", __func__);
|
||||
NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host);
|
||||
result = -1;
|
||||
out:
|
||||
if (macintosh_config->ident == MAC_MODEL_IIFX)
|
||||
write_ctrl_reg(hostdata, CTRL_INTERRUPTS_ENABLE);
|
||||
return result;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int macscsi_dma_xfer_len(struct NCR5380_hostdata *hostdata,
|
||||
|
||||
@@ -2940,7 +2940,7 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp)
|
||||
rcu_read_lock();
|
||||
vpd = rcu_dereference(sdkp->device->vpd_pgb1);
|
||||
|
||||
if (!vpd || vpd->len < 8) {
|
||||
if (!vpd || vpd->len <= 8) {
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -113,6 +113,7 @@ static int __init integrator_soc_init(void)
|
||||
return -ENODEV;
|
||||
|
||||
syscon_regmap = syscon_node_to_regmap(np);
|
||||
of_node_put(np);
|
||||
if (IS_ERR(syscon_regmap))
|
||||
return PTR_ERR(syscon_regmap);
|
||||
|
||||
|
||||
@@ -692,6 +692,7 @@ static int atmel_qspi_remove(struct platform_device *pdev)
|
||||
clk_unprepare(aq->pclk);
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
pm_runtime_dont_use_autosuspend(&pdev->dev);
|
||||
pm_runtime_put_noidle(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -947,6 +947,7 @@ static int fsl_lpspi_remove(struct platform_device *pdev)
|
||||
|
||||
fsl_lpspi_dma_exit(controller);
|
||||
|
||||
pm_runtime_dont_use_autosuspend(fsl_lpspi->dev);
|
||||
pm_runtime_disable(fsl_lpspi->dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -597,8 +597,8 @@ static void rp2_reset_asic(struct rp2_card *card, unsigned int asic_id)
|
||||
u32 clk_cfg;
|
||||
|
||||
writew(1, base + RP2_GLOBAL_CMD);
|
||||
readw(base + RP2_GLOBAL_CMD);
|
||||
msleep(100);
|
||||
readw(base + RP2_GLOBAL_CMD);
|
||||
writel(0, base + RP2_CLK_PRESCALER);
|
||||
|
||||
/* TDM clock configuration */
|
||||
|
||||
@@ -718,7 +718,8 @@ int cdnsp_remove_request(struct cdnsp_device *pdev,
|
||||
seg = cdnsp_trb_in_td(pdev, cur_td->start_seg, cur_td->first_trb,
|
||||
cur_td->last_trb, hw_deq);
|
||||
|
||||
if (seg && (pep->ep_state & EP_ENABLED))
|
||||
if (seg && (pep->ep_state & EP_ENABLED) &&
|
||||
!(pep->ep_state & EP_DIS_IN_RROGRESS))
|
||||
cdnsp_find_new_dequeue_state(pdev, pep, preq->request.stream_id,
|
||||
cur_td, &deq_state);
|
||||
else
|
||||
@@ -736,7 +737,8 @@ int cdnsp_remove_request(struct cdnsp_device *pdev,
|
||||
* During disconnecting all endpoint will be disabled so we don't
|
||||
* have to worry about updating dequeue pointer.
|
||||
*/
|
||||
if (pdev->cdnsp_state & CDNSP_STATE_DISCONNECT_PENDING) {
|
||||
if (pdev->cdnsp_state & CDNSP_STATE_DISCONNECT_PENDING ||
|
||||
pep->ep_state & EP_DIS_IN_RROGRESS) {
|
||||
status = -ESHUTDOWN;
|
||||
ret = cdnsp_cmd_set_deq(pdev, pep, &deq_state);
|
||||
}
|
||||
|
||||
@@ -938,10 +938,12 @@ static int get_serial_info(struct tty_struct *tty, struct serial_struct *ss)
|
||||
struct acm *acm = tty->driver_data;
|
||||
|
||||
ss->line = acm->minor;
|
||||
mutex_lock(&acm->port.mutex);
|
||||
ss->close_delay = jiffies_to_msecs(acm->port.close_delay) / 10;
|
||||
ss->closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
|
||||
ASYNC_CLOSING_WAIT_NONE :
|
||||
jiffies_to_msecs(acm->port.closing_wait) / 10;
|
||||
mutex_unlock(&acm->port.mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -127,6 +127,15 @@ static int dwc2_drd_role_sw_set(struct usb_role_switch *sw, enum usb_role role)
|
||||
role = USB_ROLE_DEVICE;
|
||||
}
|
||||
|
||||
if ((IS_ENABLED(CONFIG_USB_DWC2_PERIPHERAL) ||
|
||||
IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE)) &&
|
||||
dwc2_is_device_mode(hsotg) &&
|
||||
hsotg->lx_state == DWC2_L2 &&
|
||||
hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_NONE &&
|
||||
hsotg->bus_suspended &&
|
||||
!hsotg->params.no_clock_gating)
|
||||
dwc2_gadget_exit_clock_gating(hsotg, 0);
|
||||
|
||||
if (role == USB_ROLE_HOST) {
|
||||
already = dwc2_ovr_avalid(hsotg, true);
|
||||
} else if (role == USB_ROLE_DEVICE) {
|
||||
|
||||
@@ -107,7 +107,12 @@ static void appledisplay_complete(struct urb *urb)
|
||||
case ACD_BTN_BRIGHT_UP:
|
||||
case ACD_BTN_BRIGHT_DOWN:
|
||||
pdata->button_pressed = 1;
|
||||
schedule_delayed_work(&pdata->work, 0);
|
||||
/*
|
||||
* there is a window during which no device
|
||||
* is registered
|
||||
*/
|
||||
if (pdata->bd )
|
||||
schedule_delayed_work(&pdata->work, 0);
|
||||
break;
|
||||
case ACD_BTN_NONE:
|
||||
default:
|
||||
@@ -202,6 +207,7 @@ static int appledisplay_probe(struct usb_interface *iface,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
struct backlight_properties props;
|
||||
struct backlight_device *backlight;
|
||||
struct appledisplay *pdata;
|
||||
struct usb_device *udev = interface_to_usbdev(iface);
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
@@ -272,13 +278,14 @@ static int appledisplay_probe(struct usb_interface *iface,
|
||||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
props.type = BACKLIGHT_RAW;
|
||||
props.max_brightness = 0xff;
|
||||
pdata->bd = backlight_device_register(bl_name, NULL, pdata,
|
||||
backlight = backlight_device_register(bl_name, NULL, pdata,
|
||||
&appledisplay_bl_data, &props);
|
||||
if (IS_ERR(pdata->bd)) {
|
||||
if (IS_ERR(backlight)) {
|
||||
dev_err(&iface->dev, "Backlight registration failed\n");
|
||||
retval = PTR_ERR(pdata->bd);
|
||||
retval = PTR_ERR(backlight);
|
||||
goto error;
|
||||
}
|
||||
pdata->bd = backlight;
|
||||
|
||||
/* Try to get brightness */
|
||||
brightness = appledisplay_bl_get_brightness(pdata->bd);
|
||||
|
||||
@@ -88,6 +88,9 @@ static int vendor_command(struct cypress *dev, unsigned char request,
|
||||
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER,
|
||||
address, data, iobuf, CYPRESS_MAX_REQSIZE,
|
||||
USB_CTRL_GET_TIMEOUT);
|
||||
/* we must not process garbage */
|
||||
if (retval < 2)
|
||||
goto err_buf;
|
||||
|
||||
/* store returned data (more READs to be added) */
|
||||
switch (request) {
|
||||
@@ -107,6 +110,7 @@ static int vendor_command(struct cypress *dev, unsigned char request,
|
||||
break;
|
||||
}
|
||||
|
||||
err_buf:
|
||||
kfree(iobuf);
|
||||
error:
|
||||
return retval;
|
||||
|
||||
@@ -215,8 +215,10 @@ static int vfio_intx_enable(struct vfio_pci_core_device *vdev,
|
||||
return -ENOMEM;
|
||||
|
||||
vdev->ctx = kzalloc(sizeof(struct vfio_pci_irq_ctx), GFP_KERNEL_ACCOUNT);
|
||||
if (!vdev->ctx)
|
||||
if (!vdev->ctx) {
|
||||
kfree(name);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
vdev->num_ctx = 1;
|
||||
|
||||
|
||||
@@ -191,11 +191,9 @@ static void vhost_vdpa_setup_vq_irq(struct vhost_vdpa *v, u16 qid)
|
||||
if (irq < 0)
|
||||
return;
|
||||
|
||||
irq_bypass_unregister_producer(&vq->call_ctx.producer);
|
||||
if (!vq->call_ctx.ctx)
|
||||
return;
|
||||
|
||||
vq->call_ctx.producer.token = vq->call_ctx.ctx;
|
||||
vq->call_ctx.producer.irq = irq;
|
||||
ret = irq_bypass_register_producer(&vq->call_ctx.producer);
|
||||
if (unlikely(ret))
|
||||
@@ -571,6 +569,14 @@ static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd,
|
||||
vq->last_avail_idx = vq_state.split.avail_index;
|
||||
}
|
||||
break;
|
||||
case VHOST_SET_VRING_CALL:
|
||||
if (vq->call_ctx.ctx) {
|
||||
if (ops->get_status(vdpa) &
|
||||
VIRTIO_CONFIG_S_DRIVER_OK)
|
||||
vhost_vdpa_unsetup_vq_irq(v, idx);
|
||||
vq->call_ctx.producer.token = NULL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
r = vhost_vring_ioctl(&v->vdev, cmd, argp);
|
||||
@@ -602,12 +608,17 @@ static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd,
|
||||
if (vq->call_ctx.ctx) {
|
||||
cb.callback = vhost_vdpa_virtqueue_cb;
|
||||
cb.private = vq;
|
||||
cb.trigger = vq->call_ctx.ctx;
|
||||
vq->call_ctx.producer.token = vq->call_ctx.ctx;
|
||||
if (ops->get_status(vdpa) &
|
||||
VIRTIO_CONFIG_S_DRIVER_OK)
|
||||
vhost_vdpa_setup_vq_irq(v, idx);
|
||||
} else {
|
||||
cb.callback = NULL;
|
||||
cb.private = NULL;
|
||||
cb.trigger = NULL;
|
||||
}
|
||||
ops->set_vq_cb(vdpa, idx, &cb);
|
||||
vhost_vdpa_setup_vq_irq(v, idx);
|
||||
break;
|
||||
|
||||
case VHOST_SET_VRING_NUM:
|
||||
@@ -1233,6 +1244,7 @@ static int vhost_vdpa_open(struct inode *inode, struct file *filep)
|
||||
for (i = 0; i < nvqs; i++) {
|
||||
vqs[i] = &v->vqs[i];
|
||||
vqs[i]->handle_kick = handle_vq_kick;
|
||||
vqs[i]->call_ctx.ctx = NULL;
|
||||
}
|
||||
vhost_dev_init(dev, vqs, nvqs, 0, 0, 0, false,
|
||||
vhost_vdpa_process_iotlb_msg);
|
||||
|
||||
@@ -188,6 +188,7 @@ virtio_vdpa_setup_vq(struct virtio_device *vdev, unsigned int index,
|
||||
/* Setup virtqueue callback */
|
||||
cb.callback = callback ? virtio_vdpa_virtqueue_cb : NULL;
|
||||
cb.private = info;
|
||||
cb.trigger = NULL;
|
||||
ops->set_vq_cb(vdpa, index, &cb);
|
||||
ops->set_vq_num(vdpa, index, virtqueue_get_vring_size(vq));
|
||||
|
||||
|
||||
@@ -213,29 +213,6 @@ register_device:
|
||||
return devm_watchdog_register_device(dev, wdog);
|
||||
}
|
||||
|
||||
static int __maybe_unused imx_sc_wdt_suspend(struct device *dev)
|
||||
{
|
||||
struct imx_sc_wdt_device *imx_sc_wdd = dev_get_drvdata(dev);
|
||||
|
||||
if (watchdog_active(&imx_sc_wdd->wdd))
|
||||
imx_sc_wdt_stop(&imx_sc_wdd->wdd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused imx_sc_wdt_resume(struct device *dev)
|
||||
{
|
||||
struct imx_sc_wdt_device *imx_sc_wdd = dev_get_drvdata(dev);
|
||||
|
||||
if (watchdog_active(&imx_sc_wdd->wdd))
|
||||
imx_sc_wdt_start(&imx_sc_wdd->wdd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(imx_sc_wdt_pm_ops,
|
||||
imx_sc_wdt_suspend, imx_sc_wdt_resume);
|
||||
|
||||
static const struct of_device_id imx_sc_wdt_dt_ids[] = {
|
||||
{ .compatible = "fsl,imx-sc-wdt", },
|
||||
{ /* sentinel */ }
|
||||
@@ -247,7 +224,6 @@ static struct platform_driver imx_sc_wdt_driver = {
|
||||
.driver = {
|
||||
.name = "imx-sc-wdt",
|
||||
.of_match_table = imx_sc_wdt_dt_ids,
|
||||
.pm = &imx_sc_wdt_pm_ops,
|
||||
},
|
||||
};
|
||||
module_platform_driver(imx_sc_wdt_driver);
|
||||
|
||||
@@ -74,13 +74,7 @@ struct fscrypt_nokey_name {
|
||||
|
||||
static inline bool fscrypt_is_dot_dotdot(const struct qstr *str)
|
||||
{
|
||||
if (str->len == 1 && str->name[0] == '.')
|
||||
return true;
|
||||
|
||||
if (str->len == 2 && str->name[0] == '.' && str->name[1] == '.')
|
||||
return true;
|
||||
|
||||
return false;
|
||||
return is_dot_dotdot(str->name, str->len);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1973,16 +1973,6 @@ out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static bool is_dot_dotdot(const char *name, size_t name_size)
|
||||
{
|
||||
if (name_size == 1 && name[0] == '.')
|
||||
return true;
|
||||
else if (name_size == 2 && name[0] == '.' && name[1] == '.')
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* ecryptfs_decode_and_decrypt_filename - converts the encoded cipher text name to decoded plaintext
|
||||
* @plaintext_name: The plaintext name
|
||||
|
||||
@@ -283,6 +283,7 @@ enum {
|
||||
APPEND_INO, /* for append ino list */
|
||||
UPDATE_INO, /* for update ino list */
|
||||
TRANS_DIR_INO, /* for transactions dir ino list */
|
||||
XATTR_DIR_INO, /* for xattr updated dir ino list */
|
||||
FLUSH_INO, /* for multiple device flushing */
|
||||
MAX_INO_ENTRY, /* max. list */
|
||||
};
|
||||
@@ -780,7 +781,6 @@ enum {
|
||||
FI_NEED_IPU, /* used for ipu per file */
|
||||
FI_ATOMIC_FILE, /* indicate atomic file */
|
||||
FI_DATA_EXIST, /* indicate data exists */
|
||||
FI_INLINE_DOTS, /* indicate inline dot dentries */
|
||||
FI_SKIP_WRITES, /* should skip data page writeback */
|
||||
FI_OPU_WRITE, /* used for opu per file */
|
||||
FI_DIRTY_FILE, /* indicate regular/symlink has dirty pages */
|
||||
@@ -1146,6 +1146,7 @@ enum cp_reason_type {
|
||||
CP_FASTBOOT_MODE,
|
||||
CP_SPEC_LOG_NUM,
|
||||
CP_RECOVER_DIR,
|
||||
CP_XATTR_DIR,
|
||||
};
|
||||
|
||||
enum iostat_type {
|
||||
@@ -3000,7 +3001,6 @@ static inline void __mark_inode_dirty_flag(struct inode *inode,
|
||||
return;
|
||||
fallthrough;
|
||||
case FI_DATA_EXIST:
|
||||
case FI_INLINE_DOTS:
|
||||
case FI_PIN_FILE:
|
||||
case FI_COMPRESS_RELEASED:
|
||||
f2fs_mark_inode_dirty_sync(inode, true);
|
||||
@@ -3124,8 +3124,6 @@ static inline void get_inline_info(struct inode *inode, struct f2fs_inode *ri)
|
||||
set_bit(FI_INLINE_DENTRY, fi->flags);
|
||||
if (ri->i_inline & F2FS_DATA_EXIST)
|
||||
set_bit(FI_DATA_EXIST, fi->flags);
|
||||
if (ri->i_inline & F2FS_INLINE_DOTS)
|
||||
set_bit(FI_INLINE_DOTS, fi->flags);
|
||||
if (ri->i_inline & F2FS_EXTRA_ATTR)
|
||||
set_bit(FI_EXTRA_ATTR, fi->flags);
|
||||
if (ri->i_inline & F2FS_PIN_FILE)
|
||||
@@ -3146,8 +3144,6 @@ static inline void set_raw_inline(struct inode *inode, struct f2fs_inode *ri)
|
||||
ri->i_inline |= F2FS_INLINE_DENTRY;
|
||||
if (is_inode_flag_set(inode, FI_DATA_EXIST))
|
||||
ri->i_inline |= F2FS_DATA_EXIST;
|
||||
if (is_inode_flag_set(inode, FI_INLINE_DOTS))
|
||||
ri->i_inline |= F2FS_INLINE_DOTS;
|
||||
if (is_inode_flag_set(inode, FI_EXTRA_ATTR))
|
||||
ri->i_inline |= F2FS_EXTRA_ATTR;
|
||||
if (is_inode_flag_set(inode, FI_PIN_FILE))
|
||||
@@ -3234,11 +3230,6 @@ static inline int f2fs_exist_data(struct inode *inode)
|
||||
return is_inode_flag_set(inode, FI_DATA_EXIST);
|
||||
}
|
||||
|
||||
static inline int f2fs_has_inline_dots(struct inode *inode)
|
||||
{
|
||||
return is_inode_flag_set(inode, FI_INLINE_DOTS);
|
||||
}
|
||||
|
||||
static inline int f2fs_is_mmap_file(struct inode *inode)
|
||||
{
|
||||
return is_inode_flag_set(inode, FI_MMAP_FILE);
|
||||
@@ -3342,17 +3333,6 @@ static inline bool f2fs_cp_error(struct f2fs_sb_info *sbi)
|
||||
return is_set_ckpt_flags(sbi, CP_ERROR_FLAG);
|
||||
}
|
||||
|
||||
static inline bool is_dot_dotdot(const u8 *name, size_t len)
|
||||
{
|
||||
if (len == 1 && name[0] == '.')
|
||||
return true;
|
||||
|
||||
if (len == 2 && name[0] == '.' && name[1] == '.')
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void *f2fs_kmalloc(struct f2fs_sb_info *sbi,
|
||||
size_t size, gfp_t flags)
|
||||
{
|
||||
|
||||
@@ -215,6 +215,9 @@ static inline enum cp_reason_type need_do_checkpoint(struct inode *inode)
|
||||
f2fs_exist_written_data(sbi, F2FS_I(inode)->i_pino,
|
||||
TRANS_DIR_INO))
|
||||
cp_reason = CP_RECOVER_DIR;
|
||||
else if (f2fs_exist_written_data(sbi, F2FS_I(inode)->i_pino,
|
||||
XATTR_DIR_INO))
|
||||
cp_reason = CP_XATTR_DIR;
|
||||
|
||||
return cp_reason;
|
||||
}
|
||||
@@ -2159,6 +2162,10 @@ static int f2fs_ioc_start_atomic_write(struct file *filp, bool truncate)
|
||||
clear_inode_flag(fi->cow_inode, FI_INLINE_DATA);
|
||||
} else {
|
||||
/* Reuse the already created COW inode */
|
||||
f2fs_bug_on(sbi, get_dirty_pages(fi->cow_inode));
|
||||
|
||||
invalidate_mapping_pages(fi->cow_inode->i_mapping, 0, -1);
|
||||
|
||||
ret = f2fs_do_truncate_blocks(fi->cow_inode, 0, true);
|
||||
if (ret) {
|
||||
f2fs_up_write(&fi->i_gc_rwsem[WRITE]);
|
||||
@@ -2744,6 +2751,8 @@ do_map:
|
||||
goto clear_out;
|
||||
}
|
||||
|
||||
f2fs_wait_on_page_writeback(page, DATA, true, true);
|
||||
|
||||
set_page_dirty(page);
|
||||
set_page_private_gcing(page);
|
||||
f2fs_put_page(page, 1);
|
||||
@@ -4089,6 +4098,8 @@ static int redirty_blocks(struct inode *inode, pgoff_t page_idx, int len)
|
||||
/* It will never fail, when page has pinned above */
|
||||
f2fs_bug_on(F2FS_I_SB(inode), !page);
|
||||
|
||||
f2fs_wait_on_page_writeback(page, DATA, true, true);
|
||||
|
||||
set_page_dirty(page);
|
||||
f2fs_put_page(page, 1);
|
||||
f2fs_put_page(page, 0);
|
||||
@@ -4454,7 +4465,7 @@ static void f2fs_trace_rw_file_path(struct kiocb *iocb, size_t count, int rw)
|
||||
struct inode *inode = file_inode(iocb->ki_filp);
|
||||
char *buf, *path;
|
||||
|
||||
buf = f2fs_getname(F2FS_I_SB(inode));
|
||||
buf = f2fs_kmalloc(F2FS_I_SB(inode), PATH_MAX, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return;
|
||||
path = dentry_path_raw(file_dentry(iocb->ki_filp), buf, PATH_MAX);
|
||||
@@ -4482,6 +4493,10 @@ static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
|
||||
if (trace_f2fs_dataread_start_enabled())
|
||||
f2fs_trace_rw_file_path(iocb, iov_iter_count(to), READ);
|
||||
|
||||
/* In LFS mode, if there is inflight dio, wait for its completion */
|
||||
if (f2fs_lfs_mode(F2FS_I_SB(inode)))
|
||||
inode_dio_wait(inode);
|
||||
|
||||
if (f2fs_should_use_dio(inode, iocb, to)) {
|
||||
ret = f2fs_dio_read_iter(iocb, to);
|
||||
} else {
|
||||
|
||||
@@ -441,63 +441,6 @@ struct dentry *f2fs_get_parent(struct dentry *child)
|
||||
return d_obtain_alias(f2fs_iget(child->d_sb, ino));
|
||||
}
|
||||
|
||||
static int __recover_dot_dentries(struct inode *dir, nid_t pino)
|
||||
{
|
||||
struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
|
||||
struct qstr dot = QSTR_INIT(".", 1);
|
||||
struct qstr dotdot = QSTR_INIT("..", 2);
|
||||
struct f2fs_dir_entry *de;
|
||||
struct page *page;
|
||||
int err = 0;
|
||||
|
||||
if (f2fs_readonly(sbi->sb)) {
|
||||
f2fs_info(sbi, "skip recovering inline_dots inode (ino:%lu, pino:%u) in readonly mountpoint",
|
||||
dir->i_ino, pino);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!S_ISDIR(dir->i_mode)) {
|
||||
f2fs_err(sbi, "inconsistent inode status, skip recovering inline_dots inode (ino:%lu, i_mode:%u, pino:%u)",
|
||||
dir->i_ino, dir->i_mode, pino);
|
||||
set_sbi_flag(sbi, SBI_NEED_FSCK);
|
||||
return -ENOTDIR;
|
||||
}
|
||||
|
||||
err = f2fs_dquot_initialize(dir);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
f2fs_balance_fs(sbi, true);
|
||||
|
||||
f2fs_lock_op(sbi);
|
||||
|
||||
de = f2fs_find_entry(dir, &dot, &page);
|
||||
if (de) {
|
||||
f2fs_put_page(page, 0);
|
||||
} else if (IS_ERR(page)) {
|
||||
err = PTR_ERR(page);
|
||||
goto out;
|
||||
} else {
|
||||
err = f2fs_do_add_link(dir, &dot, NULL, dir->i_ino, S_IFDIR);
|
||||
if (err)
|
||||
goto out;
|
||||
}
|
||||
|
||||
de = f2fs_find_entry(dir, &dotdot, &page);
|
||||
if (de)
|
||||
f2fs_put_page(page, 0);
|
||||
else if (IS_ERR(page))
|
||||
err = PTR_ERR(page);
|
||||
else
|
||||
err = f2fs_do_add_link(dir, &dotdot, NULL, pino, S_IFDIR);
|
||||
out:
|
||||
if (!err)
|
||||
clear_inode_flag(dir, FI_INLINE_DOTS);
|
||||
|
||||
f2fs_unlock_op(sbi);
|
||||
return err;
|
||||
}
|
||||
|
||||
static struct dentry *f2fs_lookup(struct inode *dir, struct dentry *dentry,
|
||||
unsigned int flags)
|
||||
{
|
||||
@@ -507,7 +450,6 @@ static struct dentry *f2fs_lookup(struct inode *dir, struct dentry *dentry,
|
||||
struct dentry *new;
|
||||
nid_t ino = -1;
|
||||
int err = 0;
|
||||
unsigned int root_ino = F2FS_ROOT_INO(F2FS_I_SB(dir));
|
||||
struct f2fs_filename fname;
|
||||
|
||||
trace_f2fs_lookup_start(dir, dentry, flags);
|
||||
@@ -544,17 +486,6 @@ static struct dentry *f2fs_lookup(struct inode *dir, struct dentry *dentry,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ((dir->i_ino == root_ino) && f2fs_has_inline_dots(dir)) {
|
||||
err = __recover_dot_dentries(dir, root_ino);
|
||||
if (err)
|
||||
goto out_iput;
|
||||
}
|
||||
|
||||
if (f2fs_has_inline_dots(inode)) {
|
||||
err = __recover_dot_dentries(inode, dir->i_ino);
|
||||
if (err)
|
||||
goto out_iput;
|
||||
}
|
||||
if (IS_ENCRYPTED(dir) &&
|
||||
(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) &&
|
||||
!fscrypt_has_permitted_context(dir, inode)) {
|
||||
|
||||
@@ -629,6 +629,7 @@ static int __f2fs_setxattr(struct inode *inode, int index,
|
||||
const char *name, const void *value, size_t size,
|
||||
struct page *ipage, int flags)
|
||||
{
|
||||
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
|
||||
struct f2fs_xattr_entry *here, *last;
|
||||
void *base_addr, *last_base_addr;
|
||||
int found, newsize;
|
||||
@@ -772,17 +773,26 @@ retry:
|
||||
if (index == F2FS_XATTR_INDEX_ENCRYPTION &&
|
||||
!strcmp(name, F2FS_XATTR_NAME_ENCRYPTION_CONTEXT))
|
||||
f2fs_set_encrypted_inode(inode);
|
||||
f2fs_mark_inode_dirty_sync(inode, true);
|
||||
if (!error && S_ISDIR(inode->i_mode))
|
||||
set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_CP);
|
||||
|
||||
if (!S_ISDIR(inode->i_mode))
|
||||
goto same;
|
||||
/*
|
||||
* In restrict mode, fsync() always try to trigger checkpoint for all
|
||||
* metadata consistency, in other mode, it triggers checkpoint when
|
||||
* parent's xattr metadata was updated.
|
||||
*/
|
||||
if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_STRICT)
|
||||
set_sbi_flag(sbi, SBI_NEED_CP);
|
||||
else
|
||||
f2fs_add_ino_entry(sbi, inode->i_ino, XATTR_DIR_INO);
|
||||
same:
|
||||
if (is_inode_flag_set(inode, FI_ACL_MODE)) {
|
||||
inode->i_mode = F2FS_I(inode)->i_acl_mode;
|
||||
inode->i_ctime = current_time(inode);
|
||||
clear_inode_flag(inode, FI_ACL_MODE);
|
||||
}
|
||||
|
||||
inode->i_ctime = current_time(inode);
|
||||
f2fs_mark_inode_dirty_sync(inode, true);
|
||||
exit:
|
||||
kfree(base_addr);
|
||||
return error;
|
||||
|
||||
@@ -2662,10 +2662,8 @@ static int lookup_one_common(struct user_namespace *mnt_userns,
|
||||
if (!len)
|
||||
return -EACCES;
|
||||
|
||||
if (unlikely(name[0] == '.')) {
|
||||
if (len < 2 || (len == 2 && name[1] == '.'))
|
||||
return -EACCES;
|
||||
}
|
||||
if (is_dot_dotdot(name, len))
|
||||
return -EACCES;
|
||||
|
||||
while (len--) {
|
||||
unsigned int c = *(const unsigned char *)name++;
|
||||
|
||||
@@ -1041,8 +1041,6 @@ retry:
|
||||
if (likely(ret == 0))
|
||||
goto open_file;
|
||||
|
||||
if (ret == -EEXIST)
|
||||
goto retry;
|
||||
trace_nfsd_file_insert_err(rqstp, inode, may_flags, ret);
|
||||
status = nfserr_jukebox;
|
||||
goto construction_err;
|
||||
@@ -1057,6 +1055,7 @@ wait_for_construction:
|
||||
status = nfserr_jukebox;
|
||||
goto construction_err;
|
||||
}
|
||||
nfsd_file_put(nf);
|
||||
open_retry = false;
|
||||
goto retry;
|
||||
}
|
||||
|
||||
@@ -581,6 +581,7 @@ static __be32 idmap_id_to_name(struct xdr_stream *xdr,
|
||||
.id = id,
|
||||
.type = type,
|
||||
};
|
||||
__be32 status = nfs_ok;
|
||||
__be32 *p;
|
||||
int ret;
|
||||
struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
|
||||
@@ -593,12 +594,16 @@ static __be32 idmap_id_to_name(struct xdr_stream *xdr,
|
||||
return nfserrno(ret);
|
||||
ret = strlen(item->name);
|
||||
WARN_ON_ONCE(ret > IDMAP_NAMESZ);
|
||||
|
||||
p = xdr_reserve_space(xdr, ret + 4);
|
||||
if (!p)
|
||||
return nfserr_resource;
|
||||
p = xdr_encode_opaque(p, item->name, ret);
|
||||
if (unlikely(!p)) {
|
||||
status = nfserr_resource;
|
||||
goto out_put;
|
||||
}
|
||||
xdr_encode_opaque(p, item->name, ret);
|
||||
out_put:
|
||||
cache_put(&item->h, nn->idtoname_cache);
|
||||
return 0;
|
||||
return status;
|
||||
}
|
||||
|
||||
static bool
|
||||
|
||||
@@ -806,6 +806,10 @@ __cld_pipe_inprogress_downcall(const struct cld_msg_v2 __user *cmsg,
|
||||
ci = &cmsg->cm_u.cm_clntinfo;
|
||||
if (get_user(namelen, &ci->cc_name.cn_len))
|
||||
return -EFAULT;
|
||||
if (!namelen) {
|
||||
dprintk("%s: namelen should not be zero", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
name.data = memdup_user(&ci->cc_name.cn_id, namelen);
|
||||
if (IS_ERR(name.data))
|
||||
return PTR_ERR(name.data);
|
||||
@@ -828,6 +832,10 @@ __cld_pipe_inprogress_downcall(const struct cld_msg_v2 __user *cmsg,
|
||||
cnm = &cmsg->cm_u.cm_name;
|
||||
if (get_user(namelen, &cnm->cn_len))
|
||||
return -EFAULT;
|
||||
if (!namelen) {
|
||||
dprintk("%s: namelen should not be zero", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
name.data = memdup_user(&cnm->cn_id, namelen);
|
||||
if (IS_ERR(name.data))
|
||||
return PTR_ERR(name.data);
|
||||
|
||||
@@ -493,7 +493,7 @@ int ksmbd_vfs_write(struct ksmbd_work *work, struct ksmbd_file *fp,
|
||||
int err = 0;
|
||||
|
||||
if (work->conn->connection_type) {
|
||||
if (!(fp->daccess & FILE_WRITE_DATA_LE)) {
|
||||
if (!(fp->daccess & (FILE_WRITE_DATA_LE | FILE_APPEND_DATA_LE))) {
|
||||
pr_err("no right to write(%pD)\n", fp->filp);
|
||||
err = -EACCES;
|
||||
goto out;
|
||||
@@ -1102,9 +1102,10 @@ static bool __dir_empty(struct dir_context *ctx, const char *name, int namlen,
|
||||
struct ksmbd_readdir_data *buf;
|
||||
|
||||
buf = container_of(ctx, struct ksmbd_readdir_data, ctx);
|
||||
buf->dirent_count++;
|
||||
if (!is_dot_dotdot(name, namlen))
|
||||
buf->dirent_count++;
|
||||
|
||||
return buf->dirent_count <= 2;
|
||||
return !buf->dirent_count;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1124,7 +1125,7 @@ int ksmbd_vfs_empty_dir(struct ksmbd_file *fp)
|
||||
readdir_data.dirent_count = 0;
|
||||
|
||||
err = iterate_dir(fp->filp, &readdir_data.ctx);
|
||||
if (readdir_data.dirent_count > 2)
|
||||
if (readdir_data.dirent_count)
|
||||
err = -ENOTEMPTY;
|
||||
else
|
||||
err = 0;
|
||||
@@ -1153,7 +1154,7 @@ static bool __caseless_lookup(struct dir_context *ctx, const char *name,
|
||||
if (cmp < 0)
|
||||
cmp = strncasecmp((char *)buf->private, name, namlen);
|
||||
if (!cmp) {
|
||||
memcpy((char *)buf->private, name, namlen);
|
||||
memcpy((char *)buf->private, name, buf->used);
|
||||
buf->dirent_count = 1;
|
||||
return false;
|
||||
}
|
||||
@@ -1219,10 +1220,7 @@ int ksmbd_vfs_kern_path_locked(struct ksmbd_work *work, char *name,
|
||||
char *filepath;
|
||||
size_t path_len, remain_len;
|
||||
|
||||
filepath = kstrdup(name, GFP_KERNEL);
|
||||
if (!filepath)
|
||||
return -ENOMEM;
|
||||
|
||||
filepath = name;
|
||||
path_len = strlen(filepath);
|
||||
remain_len = path_len;
|
||||
|
||||
@@ -1265,10 +1263,9 @@ int ksmbd_vfs_kern_path_locked(struct ksmbd_work *work, char *name,
|
||||
err = -EINVAL;
|
||||
out2:
|
||||
path_put(parent_path);
|
||||
out1:
|
||||
kfree(filepath);
|
||||
}
|
||||
|
||||
out1:
|
||||
if (!err) {
|
||||
err = mnt_want_write(parent_path->mnt);
|
||||
if (err) {
|
||||
|
||||
@@ -281,7 +281,7 @@ struct node_footer {
|
||||
#define F2FS_INLINE_DATA 0x02 /* file inline data flag */
|
||||
#define F2FS_INLINE_DENTRY 0x04 /* file inline dentry flag */
|
||||
#define F2FS_DATA_EXIST 0x08 /* file inline data exist flag */
|
||||
#define F2FS_INLINE_DOTS 0x10 /* file having implicit dot dentries */
|
||||
#define F2FS_INLINE_DOTS 0x10 /* file having implicit dot dentries (obsolete) */
|
||||
#define F2FS_EXTRA_ATTR 0x20 /* file having extra attribute */
|
||||
#define F2FS_PIN_FILE 0x40 /* file should not be gced */
|
||||
#define F2FS_COMPRESS_RELEASED 0x80 /* file released compressed blocks */
|
||||
|
||||
@@ -3117,6 +3117,17 @@ extern bool path_is_under(const struct path *, const struct path *);
|
||||
|
||||
extern char *file_path(struct file *, char *, int);
|
||||
|
||||
/**
|
||||
* is_dot_dotdot - returns true only if @name is "." or ".."
|
||||
* @name: file name to check
|
||||
* @len: length of file name, in bytes
|
||||
*/
|
||||
static inline bool is_dot_dotdot(const char *name, size_t len)
|
||||
{
|
||||
return len && unlikely(name[0] == '.') &&
|
||||
(len == 1 || (len == 2 && name[1] == '.'));
|
||||
}
|
||||
|
||||
#include <linux/err.h>
|
||||
|
||||
/* needed for stackable file system support */
|
||||
|
||||
@@ -77,6 +77,11 @@ struct usbnet {
|
||||
# define EVENT_LINK_CHANGE 11
|
||||
# define EVENT_SET_RX_MODE 12
|
||||
# define EVENT_NO_IP_ALIGN 13
|
||||
/* This one is special, as it indicates that the device is going away
|
||||
* there are cyclic dependencies between tasklet, timer and bh
|
||||
* that must be broken
|
||||
*/
|
||||
# define EVENT_UNPLUG 31
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
@@ -84,6 +89,16 @@ struct usbnet {
|
||||
ANDROID_KABI_RESERVE(4);
|
||||
};
|
||||
|
||||
static inline bool usbnet_going_away(struct usbnet *ubn)
|
||||
{
|
||||
return test_bit(EVENT_UNPLUG, &ubn->flags);
|
||||
}
|
||||
|
||||
static inline void usbnet_mark_going_away(struct usbnet *ubn)
|
||||
{
|
||||
set_bit(EVENT_UNPLUG, &ubn->flags);
|
||||
}
|
||||
|
||||
static inline struct usb_driver *driver_of(struct usb_interface *intf)
|
||||
{
|
||||
return to_usb_driver(intf->dev.driver);
|
||||
|
||||
@@ -13,10 +13,16 @@
|
||||
* struct vdpa_calllback - vDPA callback definition.
|
||||
* @callback: interrupt callback function
|
||||
* @private: the data passed to the callback function
|
||||
* @trigger: the eventfd for the callback (Optional).
|
||||
* When it is set, the vDPA driver must guarantee that
|
||||
* signaling it is functional equivalent to triggering
|
||||
* the callback. Then vDPA parent can signal it directly
|
||||
* instead of triggering the callback.
|
||||
*/
|
||||
struct vdpa_callback {
|
||||
irqreturn_t (*callback)(void *data);
|
||||
void *private;
|
||||
struct eventfd_ctx *trigger;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -2175,9 +2175,26 @@ static inline s64 tcp_rto_delta_us(const struct sock *sk)
|
||||
{
|
||||
const struct sk_buff *skb = tcp_rtx_queue_head(sk);
|
||||
u32 rto = inet_csk(sk)->icsk_rto;
|
||||
u64 rto_time_stamp_us = tcp_skb_timestamp_us(skb) + jiffies_to_usecs(rto);
|
||||
|
||||
return rto_time_stamp_us - tcp_sk(sk)->tcp_mstamp;
|
||||
if (likely(skb)) {
|
||||
u64 rto_time_stamp_us = tcp_skb_timestamp_us(skb) + jiffies_to_usecs(rto);
|
||||
|
||||
return rto_time_stamp_us - tcp_sk(sk)->tcp_mstamp;
|
||||
} else {
|
||||
WARN_ONCE(1,
|
||||
"rtx queue emtpy: "
|
||||
"out:%u sacked:%u lost:%u retrans:%u "
|
||||
"tlp_high_seq:%u sk_state:%u ca_state:%u "
|
||||
"advmss:%u mss_cache:%u pmtu:%u\n",
|
||||
tcp_sk(sk)->packets_out, tcp_sk(sk)->sacked_out,
|
||||
tcp_sk(sk)->lost_out, tcp_sk(sk)->retrans_out,
|
||||
tcp_sk(sk)->tlp_high_seq, sk->sk_state,
|
||||
inet_csk(sk)->icsk_ca_state,
|
||||
tcp_sk(sk)->advmss, tcp_sk(sk)->mss_cache,
|
||||
inet_csk(sk)->icsk_pmtu_cookie);
|
||||
return jiffies_to_usecs(rto);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -139,7 +139,8 @@ TRACE_DEFINE_ENUM(EX_BLOCK_AGE);
|
||||
{ CP_NODE_NEED_CP, "node needs cp" }, \
|
||||
{ CP_FASTBOOT_MODE, "fastboot mode" }, \
|
||||
{ CP_SPEC_LOG_NUM, "log type is 2" }, \
|
||||
{ CP_RECOVER_DIR, "dir needs recovery" })
|
||||
{ CP_RECOVER_DIR, "dir needs recovery" }, \
|
||||
{ CP_XATTR_DIR, "dir's xattr updated" })
|
||||
|
||||
#define show_shutdown_mode(type) \
|
||||
__print_symbolic(type, \
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/rculist_nulls.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/cpuset.h>
|
||||
#include <linux/task_work.h>
|
||||
#include <linux/audit.h>
|
||||
#include <uapi/linux/io_uring.h>
|
||||
@@ -1156,6 +1157,7 @@ struct io_wq *io_wq_create(unsigned bounded, struct io_wq_data *data)
|
||||
{
|
||||
int ret, node, i;
|
||||
struct io_wq *wq;
|
||||
cpumask_var_t allowed_mask;
|
||||
|
||||
if (WARN_ON_ONCE(!data->free_work || !data->do_work))
|
||||
return ERR_PTR(-EINVAL);
|
||||
@@ -1175,6 +1177,9 @@ struct io_wq *io_wq_create(unsigned bounded, struct io_wq_data *data)
|
||||
wq->do_work = data->do_work;
|
||||
|
||||
ret = -ENOMEM;
|
||||
if (!alloc_cpumask_var(&allowed_mask, GFP_KERNEL))
|
||||
goto err;
|
||||
cpuset_cpus_allowed(current, allowed_mask);
|
||||
for_each_node(node) {
|
||||
struct io_wqe *wqe;
|
||||
int alloc_node = node;
|
||||
@@ -1187,7 +1192,8 @@ struct io_wq *io_wq_create(unsigned bounded, struct io_wq_data *data)
|
||||
wq->wqes[node] = wqe;
|
||||
if (!alloc_cpumask_var(&wqe->cpu_mask, GFP_KERNEL))
|
||||
goto err;
|
||||
cpumask_copy(wqe->cpu_mask, cpumask_of_node(node));
|
||||
if (!cpumask_and(wqe->cpu_mask, cpumask_of_node(node), allowed_mask))
|
||||
cpumask_copy(wqe->cpu_mask, allowed_mask);
|
||||
wqe->node = alloc_node;
|
||||
wqe->acct[IO_WQ_ACCT_BOUND].max_workers = bounded;
|
||||
wqe->acct[IO_WQ_ACCT_UNBOUND].max_workers =
|
||||
@@ -1221,6 +1227,7 @@ err:
|
||||
free_cpumask_var(wq->wqes[node]->cpu_mask);
|
||||
kfree(wq->wqes[node]);
|
||||
}
|
||||
free_cpumask_var(allowed_mask);
|
||||
err_wq:
|
||||
kfree(wq);
|
||||
return ERR_PTR(ret);
|
||||
@@ -1362,22 +1369,34 @@ static int io_wq_cpu_offline(unsigned int cpu, struct hlist_node *node)
|
||||
|
||||
int io_wq_cpu_affinity(struct io_uring_task *tctx, cpumask_var_t mask)
|
||||
{
|
||||
cpumask_var_t allowed_mask;
|
||||
int ret = 0;
|
||||
int i;
|
||||
|
||||
if (!tctx || !tctx->io_wq)
|
||||
return -EINVAL;
|
||||
|
||||
if (!alloc_cpumask_var(&allowed_mask, GFP_KERNEL))
|
||||
return -ENOMEM;
|
||||
cpuset_cpus_allowed(tctx->io_wq->task, allowed_mask);
|
||||
|
||||
rcu_read_lock();
|
||||
for_each_node(i) {
|
||||
struct io_wqe *wqe = tctx->io_wq->wqes[i];
|
||||
|
||||
if (mask)
|
||||
cpumask_copy(wqe->cpu_mask, mask);
|
||||
else
|
||||
cpumask_copy(wqe->cpu_mask, cpumask_of_node(i));
|
||||
if (mask) {
|
||||
if (cpumask_subset(mask, allowed_mask))
|
||||
cpumask_copy(wqe->cpu_mask, mask);
|
||||
else
|
||||
ret = -EINVAL;
|
||||
} else {
|
||||
if (!cpumask_and(wqe->cpu_mask, cpumask_of_node(i), allowed_mask))
|
||||
cpumask_copy(wqe->cpu_mask, allowed_mask);
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
return 0;
|
||||
|
||||
free_cpumask_var(allowed_mask);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/audit.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/cpuset.h>
|
||||
#include <linux/io_uring.h>
|
||||
|
||||
#include <uapi/linux/io_uring.h>
|
||||
@@ -402,11 +403,22 @@ __cold int io_sq_offload_create(struct io_ring_ctx *ctx,
|
||||
return 0;
|
||||
|
||||
if (p->flags & IORING_SETUP_SQ_AFF) {
|
||||
cpumask_var_t allowed_mask;
|
||||
int cpu = p->sq_thread_cpu;
|
||||
|
||||
ret = -EINVAL;
|
||||
if (cpu >= nr_cpu_ids || !cpu_online(cpu))
|
||||
goto err_sqpoll;
|
||||
ret = -ENOMEM;
|
||||
if (!alloc_cpumask_var(&allowed_mask, GFP_KERNEL))
|
||||
goto err_sqpoll;
|
||||
ret = -EINVAL;
|
||||
cpuset_cpus_allowed(current, allowed_mask);
|
||||
if (!cpumask_test_cpu(cpu, allowed_mask)) {
|
||||
free_cpumask_var(allowed_mask);
|
||||
goto err_sqpoll;
|
||||
}
|
||||
free_cpumask_var(allowed_mask);
|
||||
sqd->sq_cpu = cpu;
|
||||
} else {
|
||||
sqd->sq_cpu = -1;
|
||||
|
||||
@@ -323,6 +323,7 @@ config IPV6_RPL_LWTUNNEL
|
||||
bool "IPv6: RPL Source Routing Header support"
|
||||
depends on IPV6
|
||||
select LWTUNNEL
|
||||
select DST_CACHE
|
||||
help
|
||||
Support for RFC6554 RPL Source Routing Header using the lightweight
|
||||
tunnels mechanism.
|
||||
|
||||
@@ -223,33 +223,23 @@ void nf_reject_ip6_tcphdr_put(struct sk_buff *nskb,
|
||||
const struct tcphdr *oth, unsigned int otcplen)
|
||||
{
|
||||
struct tcphdr *tcph;
|
||||
int needs_ack;
|
||||
|
||||
skb_reset_transport_header(nskb);
|
||||
tcph = skb_put(nskb, sizeof(struct tcphdr));
|
||||
tcph = skb_put_zero(nskb, sizeof(struct tcphdr));
|
||||
/* Truncate to length (no data) */
|
||||
tcph->doff = sizeof(struct tcphdr)/4;
|
||||
tcph->source = oth->dest;
|
||||
tcph->dest = oth->source;
|
||||
|
||||
if (oth->ack) {
|
||||
needs_ack = 0;
|
||||
tcph->seq = oth->ack_seq;
|
||||
tcph->ack_seq = 0;
|
||||
} else {
|
||||
needs_ack = 1;
|
||||
tcph->ack_seq = htonl(ntohl(oth->seq) + oth->syn + oth->fin +
|
||||
otcplen - (oth->doff<<2));
|
||||
tcph->seq = 0;
|
||||
tcph->ack = 1;
|
||||
}
|
||||
|
||||
/* Reset flags */
|
||||
((u_int8_t *)tcph)[13] = 0;
|
||||
tcph->rst = 1;
|
||||
tcph->ack = needs_ack;
|
||||
tcph->window = 0;
|
||||
tcph->urg_ptr = 0;
|
||||
tcph->check = 0;
|
||||
|
||||
/* Adjust TCP checksum */
|
||||
tcph->check = csum_ipv6_magic(&ipv6_hdr(nskb)->saddr,
|
||||
|
||||
@@ -381,7 +381,7 @@ nla_put_failure:
|
||||
#define ctnetlink_dump_secctx(a, b) (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NF_CONNTRACK_LABELS
|
||||
#ifdef CONFIG_NF_CONNTRACK_EVENTS
|
||||
static inline int ctnetlink_label_size(const struct nf_conn *ct)
|
||||
{
|
||||
struct nf_conn_labels *labels = nf_ct_labels_find(ct);
|
||||
@@ -390,6 +390,7 @@ static inline int ctnetlink_label_size(const struct nf_conn *ct)
|
||||
return 0;
|
||||
return nla_total_size(sizeof(labels->bits));
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
ctnetlink_dump_labels(struct sk_buff *skb, const struct nf_conn *ct)
|
||||
@@ -410,10 +411,6 @@ ctnetlink_dump_labels(struct sk_buff *skb, const struct nf_conn *ct)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#define ctnetlink_dump_labels(a, b) (0)
|
||||
#define ctnetlink_label_size(a) (0)
|
||||
#endif
|
||||
|
||||
#define master_tuple(ct) &(ct->master->tuplehash[IP_CT_DIR_ORIGINAL].tuple)
|
||||
|
||||
|
||||
@@ -8619,7 +8619,7 @@ static void nf_tables_flowtable_destroy(struct nft_flowtable *flowtable)
|
||||
flowtable->data.type->setup(&flowtable->data, hook->ops.dev,
|
||||
FLOW_BLOCK_UNBIND);
|
||||
list_del_rcu(&hook->list);
|
||||
kfree(hook);
|
||||
kfree_rcu(hook, rcu);
|
||||
}
|
||||
kfree(flowtable->name);
|
||||
module_put(flowtable->data.type->owner);
|
||||
|
||||
@@ -879,7 +879,7 @@ static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,
|
||||
|
||||
mutex_lock(&qrtr_node_lock);
|
||||
list_for_each_entry(node, &qrtr_all_nodes, item) {
|
||||
skbn = skb_clone(skb, GFP_KERNEL);
|
||||
skbn = pskb_copy(skb, GFP_KERNEL);
|
||||
if (!skbn)
|
||||
break;
|
||||
skb_set_owner_w(skbn, skb->sk);
|
||||
|
||||
@@ -6631,8 +6631,8 @@ static int selinux_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen
|
||||
*/
|
||||
static int selinux_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
|
||||
{
|
||||
return __vfs_setxattr_noperm(&init_user_ns, dentry, XATTR_NAME_SELINUX,
|
||||
ctx, ctxlen, 0);
|
||||
return __vfs_setxattr_locked(&init_user_ns, dentry, XATTR_NAME_SELINUX,
|
||||
ctx, ctxlen, 0, NULL);
|
||||
}
|
||||
|
||||
static int selinux_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
|
||||
|
||||
@@ -4714,8 +4714,8 @@ static int smack_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
|
||||
|
||||
static int smack_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
|
||||
{
|
||||
return __vfs_setxattr_noperm(&init_user_ns, dentry, XATTR_NAME_SMACK,
|
||||
ctx, ctxlen, 0);
|
||||
return __vfs_setxattr_locked(&init_user_ns, dentry, XATTR_NAME_SMACK,
|
||||
ctx, ctxlen, 0, NULL);
|
||||
}
|
||||
|
||||
static int smack_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
|
||||
|
||||
@@ -2899,8 +2899,10 @@ int rt5682_register_dai_clks(struct rt5682_priv *rt5682)
|
||||
}
|
||||
|
||||
if (dev->of_node) {
|
||||
devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get,
|
||||
ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get,
|
||||
dai_clk_hw);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else {
|
||||
ret = devm_clk_hw_register_clkdev(dev, dai_clk_hw,
|
||||
init.name,
|
||||
|
||||
Reference in New Issue
Block a user