Merge ad34d9c738 ("ext4: fix FS_IOC_GETFSMAP handling") into android16-6.12
Steps on the way to 6.12.2 Resolves merge conflicts in: fs/f2fs/data.c include/linux/f2fs_fs.h Change-Id: I4903837fe6be213c3eb5a9091f24e2838efc660b Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -770,7 +770,8 @@ process the parameters it is given.
|
||||
|
||||
* ::
|
||||
|
||||
bool fs_validate_description(const struct fs_parameter_description *desc);
|
||||
bool fs_validate_description(const char *name,
|
||||
const struct fs_parameter_description *desc);
|
||||
|
||||
This performs some validation checks on a parameter description. It
|
||||
returns true if the description is good and false if it is not. It will
|
||||
|
||||
@@ -179,7 +179,7 @@ static void __build_epilogue(struct jit_ctx *ctx, bool is_tail_call)
|
||||
|
||||
if (!is_tail_call) {
|
||||
/* Set return value */
|
||||
move_reg(ctx, LOONGARCH_GPR_A0, regmap[BPF_REG_0]);
|
||||
emit_insn(ctx, addiw, LOONGARCH_GPR_A0, regmap[BPF_REG_0], 0);
|
||||
/* Return to the caller */
|
||||
emit_insn(ctx, jirl, LOONGARCH_GPR_RA, LOONGARCH_GPR_ZERO, 0);
|
||||
} else {
|
||||
|
||||
@@ -19,7 +19,7 @@ ccflags-vdso := \
|
||||
cflags-vdso := $(ccflags-vdso) \
|
||||
-isystem $(shell $(CC) -print-file-name=include) \
|
||||
$(filter -W%,$(filter-out -Wa$(comma)%,$(KBUILD_CFLAGS))) \
|
||||
-O2 -g -fno-strict-aliasing -fno-common -fno-builtin \
|
||||
-std=gnu11 -O2 -g -fno-strict-aliasing -fno-common -fno-builtin \
|
||||
-fno-stack-protector -fno-jump-tables -DDISABLE_BRANCH_PROFILING \
|
||||
$(call cc-option, -fno-asynchronous-unwind-tables) \
|
||||
$(call cc-option, -fno-stack-protector)
|
||||
|
||||
+9
-25
@@ -917,10 +917,8 @@ void zpci_device_reserved(struct zpci_dev *zdev)
|
||||
void zpci_release_device(struct kref *kref)
|
||||
{
|
||||
struct zpci_dev *zdev = container_of(kref, struct zpci_dev, kref);
|
||||
int ret;
|
||||
|
||||
if (zdev->has_hp_slot)
|
||||
zpci_exit_slot(zdev);
|
||||
WARN_ON(zdev->state != ZPCI_FN_STATE_RESERVED);
|
||||
|
||||
if (zdev->zbus->bus)
|
||||
zpci_bus_remove_device(zdev, false);
|
||||
@@ -928,28 +926,14 @@ void zpci_release_device(struct kref *kref)
|
||||
if (zdev_enabled(zdev))
|
||||
zpci_disable_device(zdev);
|
||||
|
||||
switch (zdev->state) {
|
||||
case ZPCI_FN_STATE_CONFIGURED:
|
||||
ret = sclp_pci_deconfigure(zdev->fid);
|
||||
zpci_dbg(3, "deconf fid:%x, rc:%d\n", zdev->fid, ret);
|
||||
fallthrough;
|
||||
case ZPCI_FN_STATE_STANDBY:
|
||||
if (zdev->has_hp_slot)
|
||||
zpci_exit_slot(zdev);
|
||||
spin_lock(&zpci_list_lock);
|
||||
list_del(&zdev->entry);
|
||||
spin_unlock(&zpci_list_lock);
|
||||
zpci_dbg(3, "rsv fid:%x\n", zdev->fid);
|
||||
fallthrough;
|
||||
case ZPCI_FN_STATE_RESERVED:
|
||||
if (zdev->has_resources)
|
||||
zpci_cleanup_bus_resources(zdev);
|
||||
zpci_bus_device_unregister(zdev);
|
||||
zpci_destroy_iommu(zdev);
|
||||
fallthrough;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (zdev->has_hp_slot)
|
||||
zpci_exit_slot(zdev);
|
||||
|
||||
if (zdev->has_resources)
|
||||
zpci_cleanup_bus_resources(zdev);
|
||||
|
||||
zpci_bus_device_unregister(zdev);
|
||||
zpci_destroy_iommu(zdev);
|
||||
zpci_dbg(3, "rem fid:%x\n", zdev->fid);
|
||||
kfree_rcu(zdev, rcu);
|
||||
}
|
||||
|
||||
@@ -829,19 +829,18 @@ static void fw_log_firmware_info(const struct firmware *fw, const char *name, st
|
||||
shash->tfm = alg;
|
||||
|
||||
if (crypto_shash_digest(shash, fw->data, fw->size, sha256buf) < 0)
|
||||
goto out_shash;
|
||||
goto out_free;
|
||||
|
||||
for (int i = 0; i < SHA256_DIGEST_SIZE; i++)
|
||||
sprintf(&outbuf[i * 2], "%02x", sha256buf[i]);
|
||||
outbuf[SHA256_BLOCK_SIZE] = 0;
|
||||
dev_dbg(device, "Loaded FW: %s, sha256: %s\n", name, outbuf);
|
||||
|
||||
out_shash:
|
||||
crypto_free_shash(alg);
|
||||
out_free:
|
||||
kfree(shash);
|
||||
kfree(outbuf);
|
||||
kfree(sha256buf);
|
||||
crypto_free_shash(alg);
|
||||
}
|
||||
#else
|
||||
static void fw_log_firmware_info(const struct firmware *fw, const char *name,
|
||||
|
||||
@@ -24,18 +24,18 @@ DECLARE_EVENT_CLASS(devres,
|
||||
__field(struct device *, dev)
|
||||
__field(const char *, op)
|
||||
__field(void *, node)
|
||||
__field(const char *, name)
|
||||
__string(name, name)
|
||||
__field(size_t, size)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__assign_str(devname);
|
||||
__entry->op = op;
|
||||
__entry->node = node;
|
||||
__entry->name = name;
|
||||
__assign_str(name);
|
||||
__entry->size = size;
|
||||
),
|
||||
TP_printk("%s %3s %p %s (%zu bytes)", __get_str(devname),
|
||||
__entry->op, __entry->node, __entry->name, __entry->size)
|
||||
__entry->op, __entry->node, __get_str(name), __entry->size)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(devres, devres_log,
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#if !defined(_TRACE_EVENT_MHI_HOST_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define _TRACE_EVENT_MHI_HOST_H
|
||||
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/tracepoint.h>
|
||||
#include <linux/trace_seq.h>
|
||||
#include "../common.h"
|
||||
@@ -97,18 +98,18 @@ TRACE_EVENT(mhi_gen_tre,
|
||||
__string(name, mhi_cntrl->mhi_dev->name)
|
||||
__field(int, ch_num)
|
||||
__field(void *, wp)
|
||||
__field(__le64, tre_ptr)
|
||||
__field(__le32, dword0)
|
||||
__field(__le32, dword1)
|
||||
__field(uint64_t, tre_ptr)
|
||||
__field(uint32_t, dword0)
|
||||
__field(uint32_t, dword1)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(name);
|
||||
__entry->ch_num = mhi_chan->chan;
|
||||
__entry->wp = mhi_tre;
|
||||
__entry->tre_ptr = mhi_tre->ptr;
|
||||
__entry->dword0 = mhi_tre->dword[0];
|
||||
__entry->dword1 = mhi_tre->dword[1];
|
||||
__entry->tre_ptr = le64_to_cpu(mhi_tre->ptr);
|
||||
__entry->dword0 = le32_to_cpu(mhi_tre->dword[0]);
|
||||
__entry->dword1 = le32_to_cpu(mhi_tre->dword[1]);
|
||||
),
|
||||
|
||||
TP_printk("%s: Chan: %d TRE: 0x%p TRE buf: 0x%llx DWORD0: 0x%08x DWORD1: 0x%08x\n",
|
||||
@@ -176,19 +177,19 @@ DECLARE_EVENT_CLASS(mhi_process_event_ring,
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string(name, mhi_cntrl->mhi_dev->name)
|
||||
__field(__le32, dword0)
|
||||
__field(__le32, dword1)
|
||||
__field(uint32_t, dword0)
|
||||
__field(uint32_t, dword1)
|
||||
__field(int, state)
|
||||
__field(__le64, ptr)
|
||||
__field(uint64_t, ptr)
|
||||
__field(void *, rp)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(name);
|
||||
__entry->rp = rp;
|
||||
__entry->ptr = rp->ptr;
|
||||
__entry->dword0 = rp->dword[0];
|
||||
__entry->dword1 = rp->dword[1];
|
||||
__entry->ptr = le64_to_cpu(rp->ptr);
|
||||
__entry->dword0 = le32_to_cpu(rp->dword[0]);
|
||||
__entry->dword1 = le32_to_cpu(rp->dword[1]);
|
||||
__entry->state = MHI_TRE_GET_EV_STATE(rp);
|
||||
),
|
||||
|
||||
|
||||
@@ -214,11 +214,17 @@ static int stm32_count_enable_write(struct counter_device *counter,
|
||||
{
|
||||
struct stm32_timer_cnt *const priv = counter_priv(counter);
|
||||
u32 cr1;
|
||||
int ret;
|
||||
|
||||
if (enable) {
|
||||
regmap_read(priv->regmap, TIM_CR1, &cr1);
|
||||
if (!(cr1 & TIM_CR1_CEN))
|
||||
clk_enable(priv->clk);
|
||||
if (!(cr1 & TIM_CR1_CEN)) {
|
||||
ret = clk_enable(priv->clk);
|
||||
if (ret) {
|
||||
dev_err(counter->parent, "Cannot enable clock %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN,
|
||||
TIM_CR1_CEN);
|
||||
@@ -816,7 +822,11 @@ static int __maybe_unused stm32_timer_cnt_resume(struct device *dev)
|
||||
return ret;
|
||||
|
||||
if (priv->enabled) {
|
||||
clk_enable(priv->clk);
|
||||
ret = clk_enable(priv->clk);
|
||||
if (ret) {
|
||||
dev_err(dev, "Cannot enable clock %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Restore registers that may have been lost */
|
||||
regmap_write(priv->regmap, TIM_SMCR, priv->bak.smcr);
|
||||
|
||||
@@ -574,8 +574,13 @@ static int ecap_cnt_resume(struct device *dev)
|
||||
{
|
||||
struct counter_device *counter_dev = dev_get_drvdata(dev);
|
||||
struct ecap_cnt_dev *ecap_dev = counter_priv(counter_dev);
|
||||
int ret;
|
||||
|
||||
clk_enable(ecap_dev->clk);
|
||||
ret = clk_enable(ecap_dev->clk);
|
||||
if (ret) {
|
||||
dev_err(dev, "Cannot enable clock %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ecap_cnt_capture_set_evmode(counter_dev, ecap_dev->pm_ctx.ev_mode);
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
@@ -169,6 +170,7 @@ static const struct gpio_chip zevio_gpio_chip = {
|
||||
/* Initialization */
|
||||
static int zevio_gpio_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct zevio_gpio *controller;
|
||||
int status, i;
|
||||
|
||||
@@ -180,6 +182,10 @@ static int zevio_gpio_probe(struct platform_device *pdev)
|
||||
controller->chip = zevio_gpio_chip;
|
||||
controller->chip.parent = &pdev->dev;
|
||||
|
||||
controller->chip.label = devm_kasprintf(dev, GFP_KERNEL, "%pfw", dev_fwnode(dev));
|
||||
if (!controller->chip.label)
|
||||
return -ENOMEM;
|
||||
|
||||
controller->regs = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(controller->regs))
|
||||
return dev_err_probe(&pdev->dev, PTR_ERR(controller->regs),
|
||||
|
||||
@@ -881,6 +881,9 @@ void hwss_setup_dpp(union block_sequence_params *params)
|
||||
struct dpp *dpp = pipe_ctx->plane_res.dpp;
|
||||
struct dc_plane_state *plane_state = pipe_ctx->plane_state;
|
||||
|
||||
if (!plane_state)
|
||||
return;
|
||||
|
||||
if (dpp && dpp->funcs->dpp_setup) {
|
||||
// program the input csc
|
||||
dpp->funcs->dpp_setup(dpp,
|
||||
|
||||
@@ -1923,9 +1923,9 @@ static void dcn20_program_pipe(
|
||||
dc->res_pool->hubbub, pipe_ctx->plane_res.hubp->inst, pipe_ctx->hubp_regs.det_size);
|
||||
}
|
||||
|
||||
if (pipe_ctx->update_flags.raw ||
|
||||
(pipe_ctx->plane_state && pipe_ctx->plane_state->update_flags.raw) ||
|
||||
pipe_ctx->stream->update_flags.raw)
|
||||
if (pipe_ctx->plane_state && (pipe_ctx->update_flags.raw ||
|
||||
pipe_ctx->plane_state->update_flags.raw ||
|
||||
pipe_ctx->stream->update_flags.raw))
|
||||
dcn20_update_dchubp_dpp(dc, pipe_ctx, context);
|
||||
|
||||
if (pipe_ctx->plane_state && (pipe_ctx->update_flags.bits.enable ||
|
||||
|
||||
@@ -760,16 +760,20 @@ static int radeon_audio_component_get_eld(struct device *kdev, int port,
|
||||
if (!rdev->audio.enabled || !rdev->mode_info.mode_config_initialized)
|
||||
return 0;
|
||||
|
||||
list_for_each_entry(encoder, &rdev_to_drm(rdev)->mode_config.encoder_list, head) {
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
const struct drm_connector_helper_funcs *connector_funcs =
|
||||
connector->helper_private;
|
||||
encoder = connector_funcs->best_encoder(connector);
|
||||
|
||||
if (!encoder)
|
||||
continue;
|
||||
|
||||
if (!radeon_encoder_is_digital(encoder))
|
||||
continue;
|
||||
radeon_encoder = to_radeon_encoder(encoder);
|
||||
dig = radeon_encoder->enc_priv;
|
||||
if (!dig->pin || dig->pin->id != port)
|
||||
continue;
|
||||
connector = radeon_get_connector_for_encoder(encoder);
|
||||
if (!connector)
|
||||
continue;
|
||||
*enabled = true;
|
||||
ret = drm_eld_size(connector->eld);
|
||||
memcpy(buf, connector->eld, min(max_bytes, ret));
|
||||
|
||||
@@ -85,8 +85,12 @@ static void user_fence_worker(struct work_struct *w)
|
||||
mmput(ufence->mm);
|
||||
}
|
||||
|
||||
wake_up_all(&ufence->xe->ufence_wq);
|
||||
/*
|
||||
* Wake up waiters only after updating the ufence state, allowing the UMD
|
||||
* to safely reuse the same ufence without encountering -EBUSY errors.
|
||||
*/
|
||||
WRITE_ONCE(ufence->signalled, 1);
|
||||
wake_up_all(&ufence->xe->ufence_wq);
|
||||
user_fence_put(ufence);
|
||||
}
|
||||
|
||||
|
||||
@@ -597,7 +597,7 @@ struct aqc_data {
|
||||
|
||||
/* Sensor values */
|
||||
s32 temp_input[20]; /* Max 4 physical and 16 virtual or 8 physical and 12 virtual */
|
||||
s32 speed_input[8];
|
||||
s32 speed_input[9];
|
||||
u32 speed_input_min[1];
|
||||
u32 speed_input_target[1];
|
||||
u32 speed_input_max[1];
|
||||
|
||||
@@ -132,7 +132,7 @@ static int tps23861_read_temp(struct tps23861_data *data, long *val)
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
*val = (regval * TEMPERATURE_LSB) - 20000;
|
||||
*val = ((long)regval * TEMPERATURE_LSB) - 20000;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1181,7 +1181,7 @@ static int adxl380_read_raw(struct iio_dev *indio_dev,
|
||||
|
||||
ret = adxl380_read_chn(st, chan->address);
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
if (ret)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
*val = sign_extend32(ret >> chan->scan_type.shift,
|
||||
|
||||
@@ -344,6 +344,8 @@ static int ad4000_single_conversion(struct iio_dev *indio_dev,
|
||||
|
||||
if (chan->scan_type.sign == 's')
|
||||
*val = sign_extend32(sample, chan->scan_type.realbits - 1);
|
||||
else
|
||||
*val = sample;
|
||||
|
||||
return IIO_VAL_INT;
|
||||
}
|
||||
@@ -637,7 +639,9 @@ static int ad4000_probe(struct spi_device *spi)
|
||||
indio_dev->name = chip->dev_name;
|
||||
indio_dev->num_channels = 1;
|
||||
|
||||
devm_mutex_init(dev, &st->lock);
|
||||
ret = devm_mutex_init(dev, &st->lock);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
st->gain_milli = 1000;
|
||||
if (chip->has_hardware_gain) {
|
||||
|
||||
@@ -1171,7 +1171,9 @@ static int pac1921_probe(struct i2c_client *client)
|
||||
return dev_err_probe(dev, (int)PTR_ERR(priv->regmap),
|
||||
"Cannot initialize register map\n");
|
||||
|
||||
devm_mutex_init(dev, &priv->lock);
|
||||
ret = devm_mutex_init(dev, &priv->lock);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
priv->dv_gain = PAC1921_DEFAULT_DV_GAIN;
|
||||
priv->di_gain = PAC1921_DEFAULT_DI_GAIN;
|
||||
|
||||
@@ -737,8 +737,8 @@ static struct iio_backend *__devm_iio_backend_fwnode_get(struct device *dev, con
|
||||
}
|
||||
|
||||
fwnode_back = fwnode_find_reference(fwnode, "io-backends", index);
|
||||
if (IS_ERR(fwnode))
|
||||
return dev_err_cast_probe(dev, fwnode,
|
||||
if (IS_ERR(fwnode_back))
|
||||
return dev_err_cast_probe(dev, fwnode_back,
|
||||
"Cannot get Firmware reference\n");
|
||||
|
||||
guard(mutex)(&iio_back_lock);
|
||||
|
||||
@@ -87,7 +87,12 @@ static int al3010_init(struct al3010_data *data)
|
||||
int ret;
|
||||
|
||||
ret = al3010_set_pwr(data->client, true);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = devm_add_action_or_reset(&data->client->dev,
|
||||
al3010_set_pwr_off,
|
||||
data);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -190,12 +195,6 @@ static int al3010_probe(struct i2c_client *client)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_add_action_or_reset(&client->dev,
|
||||
al3010_set_pwr_off,
|
||||
data);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return devm_iio_device_register(&client->dev, indio_dev);
|
||||
}
|
||||
|
||||
|
||||
@@ -311,6 +311,9 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
qp->num_clks = devm_clk_bulk_get_all(qp->dev, &qp->clks);
|
||||
if (qp->num_clks == -EPROBE_DEFER)
|
||||
return dev_err_probe(dev, qp->num_clks, "Failed to get QoS clocks\n");
|
||||
|
||||
if (qp->num_clks < 0 || (!qp->num_clks && desc->qos_clks_required)) {
|
||||
dev_info(dev, "Skipping QoS, failed to get clk: %d\n", qp->num_clks);
|
||||
goto skip_qos_config;
|
||||
|
||||
@@ -1147,7 +1147,7 @@ static int apds990x_probe(struct i2c_client *client)
|
||||
err = chip->pdata->setup_resources();
|
||||
if (err) {
|
||||
err = -EINVAL;
|
||||
goto fail3;
|
||||
goto fail4;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1155,7 +1155,7 @@ static int apds990x_probe(struct i2c_client *client)
|
||||
apds990x_attribute_group);
|
||||
if (err < 0) {
|
||||
dev_err(&chip->client->dev, "Sysfs registration failed\n");
|
||||
goto fail4;
|
||||
goto fail5;
|
||||
}
|
||||
|
||||
err = request_threaded_irq(client->irq, NULL,
|
||||
@@ -1166,15 +1166,17 @@ static int apds990x_probe(struct i2c_client *client)
|
||||
if (err) {
|
||||
dev_err(&client->dev, "could not get IRQ %d\n",
|
||||
client->irq);
|
||||
goto fail5;
|
||||
goto fail6;
|
||||
}
|
||||
return err;
|
||||
fail5:
|
||||
fail6:
|
||||
sysfs_remove_group(&chip->client->dev.kobj,
|
||||
&apds990x_attribute_group[0]);
|
||||
fail4:
|
||||
fail5:
|
||||
if (chip->pdata && chip->pdata->release_resources)
|
||||
chip->pdata->release_resources();
|
||||
fail4:
|
||||
pm_runtime_disable(&client->dev);
|
||||
fail3:
|
||||
regulator_bulk_disable(ARRAY_SIZE(chip->regs), chip->regs);
|
||||
fail2:
|
||||
|
||||
@@ -4558,7 +4558,7 @@ int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode)
|
||||
struct net_device *dev = bp->dev;
|
||||
|
||||
if (page_mode) {
|
||||
bp->flags &= ~BNXT_FLAG_AGG_RINGS;
|
||||
bp->flags &= ~(BNXT_FLAG_AGG_RINGS | BNXT_FLAG_NO_AGG_RINGS);
|
||||
bp->flags |= BNXT_FLAG_RX_PAGE_MODE;
|
||||
|
||||
if (bp->xdp_prog->aux->xdp_has_frags)
|
||||
@@ -9053,7 +9053,6 @@ static int __bnxt_hwrm_ptp_qcfg(struct bnxt *bp)
|
||||
struct hwrm_port_mac_ptp_qcfg_output *resp;
|
||||
struct hwrm_port_mac_ptp_qcfg_input *req;
|
||||
struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
|
||||
bool phc_cfg;
|
||||
u8 flags;
|
||||
int rc;
|
||||
|
||||
@@ -9100,8 +9099,9 @@ static int __bnxt_hwrm_ptp_qcfg(struct bnxt *bp)
|
||||
rc = -ENODEV;
|
||||
goto exit;
|
||||
}
|
||||
phc_cfg = (flags & PORT_MAC_PTP_QCFG_RESP_FLAGS_RTC_CONFIGURED) != 0;
|
||||
rc = bnxt_ptp_init(bp, phc_cfg);
|
||||
ptp->rtc_configured =
|
||||
(flags & PORT_MAC_PTP_QCFG_RESP_FLAGS_RTC_CONFIGURED) != 0;
|
||||
rc = bnxt_ptp_init(bp);
|
||||
if (rc)
|
||||
netdev_warn(bp->dev, "PTP initialization failed.\n");
|
||||
exit:
|
||||
@@ -14494,6 +14494,14 @@ static int bnxt_change_mtu(struct net_device *dev, int new_mtu)
|
||||
bnxt_close_nic(bp, true, false);
|
||||
|
||||
WRITE_ONCE(dev->mtu, new_mtu);
|
||||
|
||||
/* MTU change may change the AGG ring settings if an XDP multi-buffer
|
||||
* program is attached. We need to set the AGG rings settings and
|
||||
* rx_skb_func accordingly.
|
||||
*/
|
||||
if (READ_ONCE(bp->xdp_prog))
|
||||
bnxt_set_rx_skb_mode(bp, true);
|
||||
|
||||
bnxt_set_ring_params(bp);
|
||||
|
||||
if (netif_running(dev))
|
||||
@@ -15231,6 +15239,13 @@ static int bnxt_queue_start(struct net_device *dev, void *qmem, int idx)
|
||||
|
||||
for (i = 0; i <= BNXT_VNIC_NTUPLE; i++) {
|
||||
vnic = &bp->vnic_info[i];
|
||||
|
||||
rc = bnxt_hwrm_vnic_set_rss_p5(bp, vnic, true);
|
||||
if (rc) {
|
||||
netdev_err(bp->dev, "hwrm vnic %d set rss failure rc: %d\n",
|
||||
vnic->vnic_id, rc);
|
||||
return rc;
|
||||
}
|
||||
vnic->mru = bp->dev->mtu + ETH_HLEN + VLAN_HLEN;
|
||||
bnxt_hwrm_vnic_update(bp, vnic,
|
||||
VNIC_UPDATE_REQ_ENABLES_MRU_VALID);
|
||||
@@ -15984,6 +15999,7 @@ static void bnxt_shutdown(struct pci_dev *pdev)
|
||||
if (netif_running(dev))
|
||||
dev_close(dev);
|
||||
|
||||
bnxt_ptp_clear(bp);
|
||||
bnxt_clear_int_mode(bp);
|
||||
pci_disable_device(pdev);
|
||||
|
||||
@@ -16011,6 +16027,7 @@ static int bnxt_suspend(struct device *device)
|
||||
rc = bnxt_close(dev);
|
||||
}
|
||||
bnxt_hwrm_func_drv_unrgtr(bp);
|
||||
bnxt_ptp_clear(bp);
|
||||
pci_disable_device(bp->pdev);
|
||||
bnxt_free_ctx_mem(bp);
|
||||
rtnl_unlock();
|
||||
@@ -16054,6 +16071,10 @@ static int bnxt_resume(struct device *device)
|
||||
if (bp->fw_crash_mem)
|
||||
bnxt_hwrm_crash_dump_mem_cfg(bp);
|
||||
|
||||
if (bnxt_ptp_init(bp)) {
|
||||
kfree(bp->ptp_cfg);
|
||||
bp->ptp_cfg = NULL;
|
||||
}
|
||||
bnxt_get_wol_settings(bp);
|
||||
if (netif_running(dev)) {
|
||||
rc = bnxt_open(dev);
|
||||
@@ -16232,8 +16253,12 @@ static void bnxt_io_resume(struct pci_dev *pdev)
|
||||
rtnl_lock();
|
||||
|
||||
err = bnxt_hwrm_func_qcaps(bp);
|
||||
if (!err && netif_running(netdev))
|
||||
err = bnxt_open(netdev);
|
||||
if (!err) {
|
||||
if (netif_running(netdev))
|
||||
err = bnxt_open(netdev);
|
||||
else
|
||||
err = bnxt_reserve_rings(bp, true);
|
||||
}
|
||||
|
||||
if (!err)
|
||||
netif_device_attach(netdev);
|
||||
|
||||
@@ -2838,19 +2838,24 @@ static int bnxt_get_link_ksettings(struct net_device *dev,
|
||||
}
|
||||
|
||||
base->port = PORT_NONE;
|
||||
if (link_info->media_type == PORT_PHY_QCFG_RESP_MEDIA_TYPE_TP) {
|
||||
if (media == BNXT_MEDIA_TP) {
|
||||
base->port = PORT_TP;
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT,
|
||||
lk_ksettings->link_modes.supported);
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT,
|
||||
lk_ksettings->link_modes.advertising);
|
||||
} else if (media == BNXT_MEDIA_KR) {
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_Backplane_BIT,
|
||||
lk_ksettings->link_modes.supported);
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_Backplane_BIT,
|
||||
lk_ksettings->link_modes.advertising);
|
||||
} else {
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT,
|
||||
lk_ksettings->link_modes.supported);
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT,
|
||||
lk_ksettings->link_modes.advertising);
|
||||
|
||||
if (link_info->media_type == PORT_PHY_QCFG_RESP_MEDIA_TYPE_DAC)
|
||||
if (media == BNXT_MEDIA_CR)
|
||||
base->port = PORT_DA;
|
||||
else
|
||||
base->port = PORT_FIBRE;
|
||||
|
||||
@@ -1024,7 +1024,7 @@ static void bnxt_ptp_free(struct bnxt *bp)
|
||||
}
|
||||
}
|
||||
|
||||
int bnxt_ptp_init(struct bnxt *bp, bool phc_cfg)
|
||||
int bnxt_ptp_init(struct bnxt *bp)
|
||||
{
|
||||
struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
|
||||
int rc;
|
||||
@@ -1047,7 +1047,7 @@ int bnxt_ptp_init(struct bnxt *bp, bool phc_cfg)
|
||||
|
||||
if (BNXT_PTP_USE_RTC(bp)) {
|
||||
bnxt_ptp_timecounter_init(bp, false);
|
||||
rc = bnxt_ptp_init_rtc(bp, phc_cfg);
|
||||
rc = bnxt_ptp_init_rtc(bp, ptp->rtc_configured);
|
||||
if (rc)
|
||||
goto out;
|
||||
} else {
|
||||
|
||||
@@ -133,6 +133,7 @@ struct bnxt_ptp_cfg {
|
||||
BNXT_PTP_MSG_PDELAY_REQ | \
|
||||
BNXT_PTP_MSG_PDELAY_RESP)
|
||||
u8 tx_tstamp_en:1;
|
||||
u8 rtc_configured:1;
|
||||
int rx_filter;
|
||||
u32 tstamp_filters;
|
||||
|
||||
@@ -180,6 +181,6 @@ void bnxt_tx_ts_cmp(struct bnxt *bp, struct bnxt_napi *bnapi,
|
||||
struct tx_ts_cmp *tscmp);
|
||||
void bnxt_ptp_rtc_timecounter_init(struct bnxt_ptp_cfg *ptp, u64 ns);
|
||||
int bnxt_ptp_init_rtc(struct bnxt *bp, bool phc_cfg);
|
||||
int bnxt_ptp_init(struct bnxt *bp, bool phc_cfg);
|
||||
int bnxt_ptp_init(struct bnxt *bp);
|
||||
void bnxt_ptp_clear(struct bnxt *bp);
|
||||
#endif
|
||||
|
||||
@@ -17801,6 +17801,9 @@ static int tg3_init_one(struct pci_dev *pdev,
|
||||
} else
|
||||
persist_dma_mask = dma_mask = DMA_BIT_MASK(64);
|
||||
|
||||
if (tg3_asic_rev(tp) == ASIC_REV_57766)
|
||||
persist_dma_mask = DMA_BIT_MASK(31);
|
||||
|
||||
/* Configure DMA attributes. */
|
||||
if (dma_mask > DMA_BIT_MASK(32)) {
|
||||
err = dma_set_mask(&pdev->dev, dma_mask);
|
||||
|
||||
@@ -112,6 +112,11 @@ struct mac_ops *get_mac_ops(void *cgxd)
|
||||
return ((struct cgx *)cgxd)->mac_ops;
|
||||
}
|
||||
|
||||
u32 cgx_get_fifo_len(void *cgxd)
|
||||
{
|
||||
return ((struct cgx *)cgxd)->fifo_len;
|
||||
}
|
||||
|
||||
void cgx_write(struct cgx *cgx, u64 lmac, u64 offset, u64 val)
|
||||
{
|
||||
writeq(val, cgx->reg_base + (lmac << cgx->mac_ops->lmac_offset) +
|
||||
@@ -209,6 +214,24 @@ u8 cgx_lmac_get_p2x(int cgx_id, int lmac_id)
|
||||
return (cfg & CMR_P2X_SEL_MASK) >> CMR_P2X_SEL_SHIFT;
|
||||
}
|
||||
|
||||
static u8 cgx_get_nix_resetbit(struct cgx *cgx)
|
||||
{
|
||||
int first_lmac;
|
||||
u8 p2x;
|
||||
|
||||
/* non 98XX silicons supports only NIX0 block */
|
||||
if (cgx->pdev->subsystem_device != PCI_SUBSYS_DEVID_98XX)
|
||||
return CGX_NIX0_RESET;
|
||||
|
||||
first_lmac = find_first_bit(&cgx->lmac_bmap, cgx->max_lmac_per_mac);
|
||||
p2x = cgx_lmac_get_p2x(cgx->cgx_id, first_lmac);
|
||||
|
||||
if (p2x == CMR_P2X_SEL_NIX1)
|
||||
return CGX_NIX1_RESET;
|
||||
else
|
||||
return CGX_NIX0_RESET;
|
||||
}
|
||||
|
||||
/* Ensure the required lock for event queue(where asynchronous events are
|
||||
* posted) is acquired before calling this API. Else an asynchronous event(with
|
||||
* latest link status) can reach the destination before this function returns
|
||||
@@ -501,7 +524,7 @@ static u32 cgx_get_lmac_fifo_len(void *cgxd, int lmac_id)
|
||||
u8 num_lmacs;
|
||||
u32 fifo_len;
|
||||
|
||||
fifo_len = cgx->mac_ops->fifo_len;
|
||||
fifo_len = cgx->fifo_len;
|
||||
num_lmacs = cgx->mac_ops->get_nr_lmacs(cgx);
|
||||
|
||||
switch (num_lmacs) {
|
||||
@@ -1719,6 +1742,8 @@ static int cgx_lmac_init(struct cgx *cgx)
|
||||
lmac->lmac_type = cgx->mac_ops->get_lmac_type(cgx, lmac->lmac_id);
|
||||
}
|
||||
|
||||
/* Start X2P reset on given MAC block */
|
||||
cgx->mac_ops->mac_x2p_reset(cgx, true);
|
||||
return cgx_lmac_verify_fwi_version(cgx);
|
||||
|
||||
err_bitmap_free:
|
||||
@@ -1764,7 +1789,7 @@ static void cgx_populate_features(struct cgx *cgx)
|
||||
u64 cfg;
|
||||
|
||||
cfg = cgx_read(cgx, 0, CGX_CONST);
|
||||
cgx->mac_ops->fifo_len = FIELD_GET(CGX_CONST_RXFIFO_SIZE, cfg);
|
||||
cgx->fifo_len = FIELD_GET(CGX_CONST_RXFIFO_SIZE, cfg);
|
||||
cgx->max_lmac_per_mac = FIELD_GET(CGX_CONST_MAX_LMACS, cfg);
|
||||
|
||||
if (is_dev_rpm(cgx))
|
||||
@@ -1784,6 +1809,45 @@ static u8 cgx_get_rxid_mapoffset(struct cgx *cgx)
|
||||
return 0x60;
|
||||
}
|
||||
|
||||
static void cgx_x2p_reset(void *cgxd, bool enable)
|
||||
{
|
||||
struct cgx *cgx = cgxd;
|
||||
int lmac_id;
|
||||
u64 cfg;
|
||||
|
||||
if (enable) {
|
||||
for_each_set_bit(lmac_id, &cgx->lmac_bmap, cgx->max_lmac_per_mac)
|
||||
cgx->mac_ops->mac_enadis_rx(cgx, lmac_id, false);
|
||||
|
||||
usleep_range(1000, 2000);
|
||||
|
||||
cfg = cgx_read(cgx, 0, CGXX_CMR_GLOBAL_CONFIG);
|
||||
cfg |= cgx_get_nix_resetbit(cgx) | CGX_NSCI_DROP;
|
||||
cgx_write(cgx, 0, CGXX_CMR_GLOBAL_CONFIG, cfg);
|
||||
} else {
|
||||
cfg = cgx_read(cgx, 0, CGXX_CMR_GLOBAL_CONFIG);
|
||||
cfg &= ~(cgx_get_nix_resetbit(cgx) | CGX_NSCI_DROP);
|
||||
cgx_write(cgx, 0, CGXX_CMR_GLOBAL_CONFIG, cfg);
|
||||
}
|
||||
}
|
||||
|
||||
static int cgx_enadis_rx(void *cgxd, int lmac_id, bool enable)
|
||||
{
|
||||
struct cgx *cgx = cgxd;
|
||||
u64 cfg;
|
||||
|
||||
if (!is_lmac_valid(cgx, lmac_id))
|
||||
return -ENODEV;
|
||||
|
||||
cfg = cgx_read(cgx, lmac_id, CGXX_CMRX_CFG);
|
||||
if (enable)
|
||||
cfg |= DATA_PKT_RX_EN;
|
||||
else
|
||||
cfg &= ~DATA_PKT_RX_EN;
|
||||
cgx_write(cgx, lmac_id, CGXX_CMRX_CFG, cfg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct mac_ops cgx_mac_ops = {
|
||||
.name = "cgx",
|
||||
.csr_offset = 0,
|
||||
@@ -1815,6 +1879,8 @@ static struct mac_ops cgx_mac_ops = {
|
||||
.mac_get_pfc_frm_cfg = cgx_lmac_get_pfc_frm_cfg,
|
||||
.mac_reset = cgx_lmac_reset,
|
||||
.mac_stats_reset = cgx_stats_reset,
|
||||
.mac_x2p_reset = cgx_x2p_reset,
|
||||
.mac_enadis_rx = cgx_enadis_rx,
|
||||
};
|
||||
|
||||
static int cgx_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
|
||||
@@ -32,6 +32,10 @@
|
||||
#define CGX_LMAC_TYPE_MASK 0xF
|
||||
#define CGXX_CMRX_INT 0x040
|
||||
#define FW_CGX_INT BIT_ULL(1)
|
||||
#define CGXX_CMR_GLOBAL_CONFIG 0x08
|
||||
#define CGX_NIX0_RESET BIT_ULL(2)
|
||||
#define CGX_NIX1_RESET BIT_ULL(3)
|
||||
#define CGX_NSCI_DROP BIT_ULL(9)
|
||||
#define CGXX_CMRX_INT_ENA_W1S 0x058
|
||||
#define CGXX_CMRX_RX_ID_MAP 0x060
|
||||
#define CGXX_CMRX_RX_STAT0 0x070
|
||||
@@ -185,4 +189,5 @@ int cgx_lmac_get_pfc_frm_cfg(void *cgxd, int lmac_id, u8 *tx_pause,
|
||||
int verify_lmac_fc_cfg(void *cgxd, int lmac_id, u8 tx_pause, u8 rx_pause,
|
||||
int pfvf_idx);
|
||||
int cgx_lmac_reset(void *cgxd, int lmac_id, u8 pf_req_flr);
|
||||
u32 cgx_get_fifo_len(void *cgxd);
|
||||
#endif /* CGX_H */
|
||||
|
||||
@@ -72,7 +72,6 @@ struct mac_ops {
|
||||
u8 irq_offset;
|
||||
u8 int_ena_bit;
|
||||
u8 lmac_fwi;
|
||||
u32 fifo_len;
|
||||
bool non_contiguous_serdes_lane;
|
||||
/* RPM & CGX differs in number of Receive/transmit stats */
|
||||
u8 rx_stats_cnt;
|
||||
@@ -133,6 +132,8 @@ struct mac_ops {
|
||||
int (*get_fec_stats)(void *cgxd, int lmac_id,
|
||||
struct cgx_fec_stats_rsp *rsp);
|
||||
int (*mac_stats_reset)(void *cgxd, int lmac_id);
|
||||
void (*mac_x2p_reset)(void *cgxd, bool enable);
|
||||
int (*mac_enadis_rx)(void *cgxd, int lmac_id, bool enable);
|
||||
};
|
||||
|
||||
struct cgx {
|
||||
@@ -142,6 +143,10 @@ struct cgx {
|
||||
u8 lmac_count;
|
||||
/* number of LMACs per MAC could be 4 or 8 */
|
||||
u8 max_lmac_per_mac;
|
||||
/* length of fifo varies depending on the number
|
||||
* of LMACS
|
||||
*/
|
||||
u32 fifo_len;
|
||||
#define MAX_LMAC_COUNT 8
|
||||
struct lmac *lmac_idmap[MAX_LMAC_COUNT];
|
||||
struct work_struct cgx_cmd_work;
|
||||
|
||||
@@ -39,6 +39,8 @@ static struct mac_ops rpm_mac_ops = {
|
||||
.mac_get_pfc_frm_cfg = rpm_lmac_get_pfc_frm_cfg,
|
||||
.mac_reset = rpm_lmac_reset,
|
||||
.mac_stats_reset = rpm_stats_reset,
|
||||
.mac_x2p_reset = rpm_x2p_reset,
|
||||
.mac_enadis_rx = rpm_enadis_rx,
|
||||
};
|
||||
|
||||
static struct mac_ops rpm2_mac_ops = {
|
||||
@@ -72,6 +74,8 @@ static struct mac_ops rpm2_mac_ops = {
|
||||
.mac_get_pfc_frm_cfg = rpm_lmac_get_pfc_frm_cfg,
|
||||
.mac_reset = rpm_lmac_reset,
|
||||
.mac_stats_reset = rpm_stats_reset,
|
||||
.mac_x2p_reset = rpm_x2p_reset,
|
||||
.mac_enadis_rx = rpm_enadis_rx,
|
||||
};
|
||||
|
||||
bool is_dev_rpm2(void *rpmd)
|
||||
@@ -467,7 +471,7 @@ u8 rpm_get_lmac_type(void *rpmd, int lmac_id)
|
||||
int err;
|
||||
|
||||
req = FIELD_SET(CMDREG_ID, CGX_CMD_GET_LINK_STS, req);
|
||||
err = cgx_fwi_cmd_generic(req, &resp, rpm, 0);
|
||||
err = cgx_fwi_cmd_generic(req, &resp, rpm, lmac_id);
|
||||
if (!err)
|
||||
return FIELD_GET(RESP_LINKSTAT_LMAC_TYPE, resp);
|
||||
return err;
|
||||
@@ -480,7 +484,7 @@ u32 rpm_get_lmac_fifo_len(void *rpmd, int lmac_id)
|
||||
u8 num_lmacs;
|
||||
u32 fifo_len;
|
||||
|
||||
fifo_len = rpm->mac_ops->fifo_len;
|
||||
fifo_len = rpm->fifo_len;
|
||||
num_lmacs = rpm->mac_ops->get_nr_lmacs(rpm);
|
||||
|
||||
switch (num_lmacs) {
|
||||
@@ -533,9 +537,9 @@ u32 rpm2_get_lmac_fifo_len(void *rpmd, int lmac_id)
|
||||
*/
|
||||
max_lmac = (rpm_read(rpm, 0, CGX_CONST) >> 24) & 0xFF;
|
||||
if (max_lmac > 4)
|
||||
fifo_len = rpm->mac_ops->fifo_len / 2;
|
||||
fifo_len = rpm->fifo_len / 2;
|
||||
else
|
||||
fifo_len = rpm->mac_ops->fifo_len;
|
||||
fifo_len = rpm->fifo_len;
|
||||
|
||||
if (lmac_id < 4) {
|
||||
num_lmacs = hweight8(lmac_info & 0xF);
|
||||
@@ -699,46 +703,51 @@ int rpm_get_fec_stats(void *rpmd, int lmac_id, struct cgx_fec_stats_rsp *rsp)
|
||||
if (rpm->lmac_idmap[lmac_id]->link_info.fec == OTX2_FEC_NONE)
|
||||
return 0;
|
||||
|
||||
/* latched registers FCFECX_CW_HI/RSFEC_STAT_FAST_DATA_HI_CDC are common
|
||||
* for all counters. Acquire lock to ensure serialized reads
|
||||
*/
|
||||
mutex_lock(&rpm->lock);
|
||||
if (rpm->lmac_idmap[lmac_id]->link_info.fec == OTX2_FEC_BASER) {
|
||||
val_lo = rpm_read(rpm, lmac_id, RPMX_MTI_FCFECX_VL0_CCW_LO);
|
||||
val_hi = rpm_read(rpm, lmac_id, RPMX_MTI_FCFECX_CW_HI);
|
||||
val_lo = rpm_read(rpm, 0, RPMX_MTI_FCFECX_VL0_CCW_LO(lmac_id));
|
||||
val_hi = rpm_read(rpm, 0, RPMX_MTI_FCFECX_CW_HI(lmac_id));
|
||||
rsp->fec_corr_blks = (val_hi << 16 | val_lo);
|
||||
|
||||
val_lo = rpm_read(rpm, lmac_id, RPMX_MTI_FCFECX_VL0_NCCW_LO);
|
||||
val_hi = rpm_read(rpm, lmac_id, RPMX_MTI_FCFECX_CW_HI);
|
||||
val_lo = rpm_read(rpm, 0, RPMX_MTI_FCFECX_VL0_NCCW_LO(lmac_id));
|
||||
val_hi = rpm_read(rpm, 0, RPMX_MTI_FCFECX_CW_HI(lmac_id));
|
||||
rsp->fec_uncorr_blks = (val_hi << 16 | val_lo);
|
||||
|
||||
/* 50G uses 2 Physical serdes lines */
|
||||
if (rpm->lmac_idmap[lmac_id]->link_info.lmac_type_id ==
|
||||
LMAC_MODE_50G_R) {
|
||||
val_lo = rpm_read(rpm, lmac_id,
|
||||
RPMX_MTI_FCFECX_VL1_CCW_LO);
|
||||
val_hi = rpm_read(rpm, lmac_id,
|
||||
RPMX_MTI_FCFECX_CW_HI);
|
||||
val_lo = rpm_read(rpm, 0,
|
||||
RPMX_MTI_FCFECX_VL1_CCW_LO(lmac_id));
|
||||
val_hi = rpm_read(rpm, 0,
|
||||
RPMX_MTI_FCFECX_CW_HI(lmac_id));
|
||||
rsp->fec_corr_blks += (val_hi << 16 | val_lo);
|
||||
|
||||
val_lo = rpm_read(rpm, lmac_id,
|
||||
RPMX_MTI_FCFECX_VL1_NCCW_LO);
|
||||
val_hi = rpm_read(rpm, lmac_id,
|
||||
RPMX_MTI_FCFECX_CW_HI);
|
||||
val_lo = rpm_read(rpm, 0,
|
||||
RPMX_MTI_FCFECX_VL1_NCCW_LO(lmac_id));
|
||||
val_hi = rpm_read(rpm, 0,
|
||||
RPMX_MTI_FCFECX_CW_HI(lmac_id));
|
||||
rsp->fec_uncorr_blks += (val_hi << 16 | val_lo);
|
||||
}
|
||||
} else {
|
||||
/* enable RS-FEC capture */
|
||||
cfg = rpm_read(rpm, 0, RPMX_MTI_STAT_STATN_CONTROL);
|
||||
cfg = rpm_read(rpm, 0, RPMX_MTI_RSFEC_STAT_STATN_CONTROL);
|
||||
cfg |= RPMX_RSFEC_RX_CAPTURE | BIT(lmac_id);
|
||||
rpm_write(rpm, 0, RPMX_MTI_STAT_STATN_CONTROL, cfg);
|
||||
rpm_write(rpm, 0, RPMX_MTI_RSFEC_STAT_STATN_CONTROL, cfg);
|
||||
|
||||
val_lo = rpm_read(rpm, 0,
|
||||
RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_2);
|
||||
val_hi = rpm_read(rpm, 0, RPMX_MTI_STAT_DATA_HI_CDC);
|
||||
val_hi = rpm_read(rpm, 0, RPMX_MTI_RSFEC_STAT_FAST_DATA_HI_CDC);
|
||||
rsp->fec_corr_blks = (val_hi << 32 | val_lo);
|
||||
|
||||
val_lo = rpm_read(rpm, 0,
|
||||
RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_3);
|
||||
val_hi = rpm_read(rpm, 0, RPMX_MTI_STAT_DATA_HI_CDC);
|
||||
val_hi = rpm_read(rpm, 0, RPMX_MTI_RSFEC_STAT_FAST_DATA_HI_CDC);
|
||||
rsp->fec_uncorr_blks = (val_hi << 32 | val_lo);
|
||||
}
|
||||
mutex_unlock(&rpm->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -763,3 +772,41 @@ int rpm_lmac_reset(void *rpmd, int lmac_id, u8 pf_req_flr)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rpm_x2p_reset(void *rpmd, bool enable)
|
||||
{
|
||||
rpm_t *rpm = rpmd;
|
||||
int lmac_id;
|
||||
u64 cfg;
|
||||
|
||||
if (enable) {
|
||||
for_each_set_bit(lmac_id, &rpm->lmac_bmap, rpm->max_lmac_per_mac)
|
||||
rpm->mac_ops->mac_enadis_rx(rpm, lmac_id, false);
|
||||
|
||||
usleep_range(1000, 2000);
|
||||
|
||||
cfg = rpm_read(rpm, 0, RPMX_CMR_GLOBAL_CFG);
|
||||
rpm_write(rpm, 0, RPMX_CMR_GLOBAL_CFG, cfg | RPM_NIX0_RESET);
|
||||
} else {
|
||||
cfg = rpm_read(rpm, 0, RPMX_CMR_GLOBAL_CFG);
|
||||
cfg &= ~RPM_NIX0_RESET;
|
||||
rpm_write(rpm, 0, RPMX_CMR_GLOBAL_CFG, cfg);
|
||||
}
|
||||
}
|
||||
|
||||
int rpm_enadis_rx(void *rpmd, int lmac_id, bool enable)
|
||||
{
|
||||
rpm_t *rpm = rpmd;
|
||||
u64 cfg;
|
||||
|
||||
if (!is_lmac_valid(rpm, lmac_id))
|
||||
return -ENODEV;
|
||||
|
||||
cfg = rpm_read(rpm, lmac_id, RPMX_MTI_MAC100X_COMMAND_CONFIG);
|
||||
if (enable)
|
||||
cfg |= RPM_RX_EN;
|
||||
else
|
||||
cfg &= ~RPM_RX_EN;
|
||||
rpm_write(rpm, lmac_id, RPMX_MTI_MAC100X_COMMAND_CONFIG, cfg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
|
||||
/* Registers */
|
||||
#define RPMX_CMRX_CFG 0x00
|
||||
#define RPMX_CMR_GLOBAL_CFG 0x08
|
||||
#define RPM_NIX0_RESET BIT_ULL(3)
|
||||
#define RPMX_RX_TS_PREPEND BIT_ULL(22)
|
||||
#define RPMX_TX_PTP_1S_SUPPORT BIT_ULL(17)
|
||||
#define RPMX_CMRX_RX_ID_MAP 0x80
|
||||
@@ -84,16 +86,18 @@
|
||||
/* FEC stats */
|
||||
#define RPMX_MTI_STAT_STATN_CONTROL 0x10018
|
||||
#define RPMX_MTI_STAT_DATA_HI_CDC 0x10038
|
||||
#define RPMX_RSFEC_RX_CAPTURE BIT_ULL(27)
|
||||
#define RPMX_RSFEC_RX_CAPTURE BIT_ULL(28)
|
||||
#define RPMX_CMD_CLEAR_RX BIT_ULL(30)
|
||||
#define RPMX_CMD_CLEAR_TX BIT_ULL(31)
|
||||
#define RPMX_MTI_RSFEC_STAT_STATN_CONTROL 0x40018
|
||||
#define RPMX_MTI_RSFEC_STAT_FAST_DATA_HI_CDC 0x40000
|
||||
#define RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_2 0x40050
|
||||
#define RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_3 0x40058
|
||||
#define RPMX_MTI_FCFECX_VL0_CCW_LO 0x38618
|
||||
#define RPMX_MTI_FCFECX_VL0_NCCW_LO 0x38620
|
||||
#define RPMX_MTI_FCFECX_VL1_CCW_LO 0x38628
|
||||
#define RPMX_MTI_FCFECX_VL1_NCCW_LO 0x38630
|
||||
#define RPMX_MTI_FCFECX_CW_HI 0x38638
|
||||
#define RPMX_MTI_FCFECX_VL0_CCW_LO(a) (0x38618 + ((a) * 0x40))
|
||||
#define RPMX_MTI_FCFECX_VL0_NCCW_LO(a) (0x38620 + ((a) * 0x40))
|
||||
#define RPMX_MTI_FCFECX_VL1_CCW_LO(a) (0x38628 + ((a) * 0x40))
|
||||
#define RPMX_MTI_FCFECX_VL1_NCCW_LO(a) (0x38630 + ((a) * 0x40))
|
||||
#define RPMX_MTI_FCFECX_CW_HI(a) (0x38638 + ((a) * 0x40))
|
||||
|
||||
/* CN10KB CSR Declaration */
|
||||
#define RPM2_CMRX_SW_INT 0x1b0
|
||||
@@ -137,4 +141,6 @@ bool is_dev_rpm2(void *rpmd);
|
||||
int rpm_get_fec_stats(void *cgxd, int lmac_id, struct cgx_fec_stats_rsp *rsp);
|
||||
int rpm_lmac_reset(void *rpmd, int lmac_id, u8 pf_req_flr);
|
||||
int rpm_stats_reset(void *rpmd, int lmac_id);
|
||||
void rpm_x2p_reset(void *rpmd, bool enable);
|
||||
int rpm_enadis_rx(void *rpmd, int lmac_id, bool enable);
|
||||
#endif /* RPM_H */
|
||||
|
||||
@@ -1162,6 +1162,7 @@ cpt:
|
||||
}
|
||||
|
||||
rvu_program_channels(rvu);
|
||||
cgx_start_linkup(rvu);
|
||||
|
||||
err = rvu_mcs_init(rvu);
|
||||
if (err) {
|
||||
|
||||
@@ -997,6 +997,7 @@ int rvu_cgx_prio_flow_ctrl_cfg(struct rvu *rvu, u16 pcifunc, u8 tx_pause, u8 rx_
|
||||
int rvu_cgx_cfg_pause_frm(struct rvu *rvu, u16 pcifunc, u8 tx_pause, u8 rx_pause);
|
||||
void rvu_mac_reset(struct rvu *rvu, u16 pcifunc);
|
||||
u32 rvu_cgx_get_lmac_fifolen(struct rvu *rvu, int cgx, int lmac);
|
||||
void cgx_start_linkup(struct rvu *rvu);
|
||||
int npc_get_nixlf_mcam_index(struct npc_mcam *mcam, u16 pcifunc, int nixlf,
|
||||
int type);
|
||||
bool is_mcam_entry_enabled(struct rvu *rvu, struct npc_mcam *mcam, int blkaddr,
|
||||
|
||||
@@ -349,6 +349,7 @@ static void rvu_cgx_wq_destroy(struct rvu *rvu)
|
||||
|
||||
int rvu_cgx_init(struct rvu *rvu)
|
||||
{
|
||||
struct mac_ops *mac_ops;
|
||||
int cgx, err;
|
||||
void *cgxd;
|
||||
|
||||
@@ -375,6 +376,15 @@ int rvu_cgx_init(struct rvu *rvu)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Clear X2P reset on all MAC blocks */
|
||||
for (cgx = 0; cgx < rvu->cgx_cnt_max; cgx++) {
|
||||
cgxd = rvu_cgx_pdata(cgx, rvu);
|
||||
if (!cgxd)
|
||||
continue;
|
||||
mac_ops = get_mac_ops(cgxd);
|
||||
mac_ops->mac_x2p_reset(cgxd, false);
|
||||
}
|
||||
|
||||
/* Register for CGX events */
|
||||
err = cgx_lmac_event_handler_init(rvu);
|
||||
if (err)
|
||||
@@ -382,10 +392,26 @@ int rvu_cgx_init(struct rvu *rvu)
|
||||
|
||||
mutex_init(&rvu->cgx_cfg_lock);
|
||||
|
||||
/* Ensure event handler registration is completed, before
|
||||
* we turn on the links
|
||||
*/
|
||||
mb();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void cgx_start_linkup(struct rvu *rvu)
|
||||
{
|
||||
unsigned long lmac_bmap;
|
||||
struct mac_ops *mac_ops;
|
||||
int cgx, lmac, err;
|
||||
void *cgxd;
|
||||
|
||||
/* Enable receive on all LMACS */
|
||||
for (cgx = 0; cgx <= rvu->cgx_cnt_max; cgx++) {
|
||||
cgxd = rvu_cgx_pdata(cgx, rvu);
|
||||
if (!cgxd)
|
||||
continue;
|
||||
mac_ops = get_mac_ops(cgxd);
|
||||
lmac_bmap = cgx_get_lmac_bmap(cgxd);
|
||||
for_each_set_bit(lmac, &lmac_bmap, rvu->hw->lmac_per_cgx)
|
||||
mac_ops->mac_enadis_rx(cgxd, lmac, true);
|
||||
}
|
||||
|
||||
/* Do link up for all CGX ports */
|
||||
for (cgx = 0; cgx <= rvu->cgx_cnt_max; cgx++) {
|
||||
@@ -398,8 +424,6 @@ int rvu_cgx_init(struct rvu *rvu)
|
||||
"Link up process failed to start on cgx %d\n",
|
||||
cgx);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rvu_cgx_exit(struct rvu *rvu)
|
||||
@@ -923,13 +947,12 @@ int rvu_mbox_handler_cgx_features_get(struct rvu *rvu,
|
||||
|
||||
u32 rvu_cgx_get_fifolen(struct rvu *rvu)
|
||||
{
|
||||
struct mac_ops *mac_ops;
|
||||
u32 fifo_len;
|
||||
void *cgxd = rvu_first_cgx_pdata(rvu);
|
||||
|
||||
mac_ops = get_mac_ops(rvu_first_cgx_pdata(rvu));
|
||||
fifo_len = mac_ops ? mac_ops->fifo_len : 0;
|
||||
if (!cgxd)
|
||||
return 0;
|
||||
|
||||
return fifo_len;
|
||||
return cgx_get_fifo_len(cgxd);
|
||||
}
|
||||
|
||||
u32 rvu_cgx_get_lmac_fifolen(struct rvu *rvu, int cgx, int lmac)
|
||||
|
||||
@@ -1394,18 +1394,15 @@ static int pxa168_eth_probe(struct platform_device *pdev)
|
||||
|
||||
printk(KERN_NOTICE "PXA168 10/100 Ethernet Driver\n");
|
||||
|
||||
clk = devm_clk_get(&pdev->dev, NULL);
|
||||
clk = devm_clk_get_enabled(&pdev->dev, NULL);
|
||||
if (IS_ERR(clk)) {
|
||||
dev_err(&pdev->dev, "Fast Ethernet failed to get clock\n");
|
||||
dev_err(&pdev->dev, "Fast Ethernet failed to get and enable clock\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
clk_prepare_enable(clk);
|
||||
|
||||
dev = alloc_etherdev(sizeof(struct pxa168_eth_private));
|
||||
if (!dev) {
|
||||
err = -ENOMEM;
|
||||
goto err_clk;
|
||||
}
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
platform_set_drvdata(pdev, dev);
|
||||
pep = netdev_priv(dev);
|
||||
@@ -1523,8 +1520,6 @@ err_free_mdio:
|
||||
mdiobus_free(pep->smi_bus);
|
||||
err_netdev:
|
||||
free_netdev(dev);
|
||||
err_clk:
|
||||
clk_disable_unprepare(clk);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1542,7 +1537,6 @@ static void pxa168_eth_remove(struct platform_device *pdev)
|
||||
if (dev->phydev)
|
||||
phy_disconnect(dev->phydev);
|
||||
|
||||
clk_disable_unprepare(pep->clk);
|
||||
mdiobus_unregister(pep->smi_bus);
|
||||
mdiobus_free(pep->smi_bus);
|
||||
unregister_netdev(dev);
|
||||
|
||||
@@ -366,12 +366,13 @@ static void vcap_api_iterator_init_test(struct kunit *test)
|
||||
struct vcap_typegroup typegroups[] = {
|
||||
{ .offset = 0, .width = 2, .value = 2, },
|
||||
{ .offset = 156, .width = 1, .value = 0, },
|
||||
{ .offset = 0, .width = 0, .value = 0, },
|
||||
{ }
|
||||
};
|
||||
struct vcap_typegroup typegroups2[] = {
|
||||
{ .offset = 0, .width = 3, .value = 4, },
|
||||
{ .offset = 49, .width = 2, .value = 0, },
|
||||
{ .offset = 98, .width = 2, .value = 0, },
|
||||
{ }
|
||||
};
|
||||
|
||||
vcap_iter_init(&iter, 52, typegroups, 86);
|
||||
@@ -399,6 +400,7 @@ static void vcap_api_iterator_next_test(struct kunit *test)
|
||||
{ .offset = 147, .width = 3, .value = 0, },
|
||||
{ .offset = 196, .width = 2, .value = 0, },
|
||||
{ .offset = 245, .width = 1, .value = 0, },
|
||||
{ }
|
||||
};
|
||||
int idx;
|
||||
|
||||
@@ -433,7 +435,7 @@ static void vcap_api_encode_typegroups_test(struct kunit *test)
|
||||
{ .offset = 147, .width = 3, .value = 5, },
|
||||
{ .offset = 196, .width = 2, .value = 2, },
|
||||
{ .offset = 245, .width = 5, .value = 27, },
|
||||
{ .offset = 0, .width = 0, .value = 0, },
|
||||
{ }
|
||||
};
|
||||
|
||||
vcap_encode_typegroups(stream, 49, typegroups, false);
|
||||
@@ -463,6 +465,7 @@ static void vcap_api_encode_bit_test(struct kunit *test)
|
||||
{ .offset = 147, .width = 3, .value = 5, },
|
||||
{ .offset = 196, .width = 2, .value = 2, },
|
||||
{ .offset = 245, .width = 1, .value = 0, },
|
||||
{ }
|
||||
};
|
||||
|
||||
vcap_iter_init(&iter, 49, typegroups, 44);
|
||||
@@ -489,7 +492,7 @@ static void vcap_api_encode_field_test(struct kunit *test)
|
||||
{ .offset = 147, .width = 3, .value = 5, },
|
||||
{ .offset = 196, .width = 2, .value = 2, },
|
||||
{ .offset = 245, .width = 5, .value = 27, },
|
||||
{ .offset = 0, .width = 0, .value = 0, },
|
||||
{ }
|
||||
};
|
||||
struct vcap_field rf = {
|
||||
.type = VCAP_FIELD_U32,
|
||||
@@ -538,7 +541,7 @@ static void vcap_api_encode_short_field_test(struct kunit *test)
|
||||
{ .offset = 0, .width = 3, .value = 7, },
|
||||
{ .offset = 21, .width = 2, .value = 3, },
|
||||
{ .offset = 42, .width = 1, .value = 1, },
|
||||
{ .offset = 0, .width = 0, .value = 0, },
|
||||
{ }
|
||||
};
|
||||
struct vcap_field rf = {
|
||||
.type = VCAP_FIELD_U32,
|
||||
@@ -608,7 +611,7 @@ static void vcap_api_encode_keyfield_test(struct kunit *test)
|
||||
struct vcap_typegroup tgt[] = {
|
||||
{ .offset = 0, .width = 2, .value = 2, },
|
||||
{ .offset = 156, .width = 1, .value = 1, },
|
||||
{ .offset = 0, .width = 0, .value = 0, },
|
||||
{ }
|
||||
};
|
||||
|
||||
vcap_test_api_init(&admin);
|
||||
@@ -671,7 +674,7 @@ static void vcap_api_encode_max_keyfield_test(struct kunit *test)
|
||||
struct vcap_typegroup tgt[] = {
|
||||
{ .offset = 0, .width = 2, .value = 2, },
|
||||
{ .offset = 156, .width = 1, .value = 1, },
|
||||
{ .offset = 0, .width = 0, .value = 0, },
|
||||
{ }
|
||||
};
|
||||
u32 keyres[] = {
|
||||
0x928e8a84,
|
||||
@@ -732,7 +735,7 @@ static void vcap_api_encode_actionfield_test(struct kunit *test)
|
||||
{ .offset = 0, .width = 2, .value = 2, },
|
||||
{ .offset = 21, .width = 1, .value = 1, },
|
||||
{ .offset = 42, .width = 1, .value = 0, },
|
||||
{ .offset = 0, .width = 0, .value = 0, },
|
||||
{ }
|
||||
};
|
||||
|
||||
vcap_encode_actionfield(&rule, &caf, &rf, tgt);
|
||||
|
||||
@@ -9,7 +9,10 @@
|
||||
#ifndef RTASE_H
|
||||
#define RTASE_H
|
||||
|
||||
#define RTASE_HW_VER_MASK 0x7C800000
|
||||
#define RTASE_HW_VER_MASK 0x7C800000
|
||||
#define RTASE_HW_VER_906X_7XA 0x00800000
|
||||
#define RTASE_HW_VER_906X_7XC 0x04000000
|
||||
#define RTASE_HW_VER_907XD_V1 0x04800000
|
||||
|
||||
#define RTASE_RX_DMA_BURST_256 4
|
||||
#define RTASE_TX_DMA_BURST_UNLIMITED 7
|
||||
@@ -327,6 +330,8 @@ struct rtase_private {
|
||||
u16 int_nums;
|
||||
u16 tx_int_mit;
|
||||
u16 rx_int_mit;
|
||||
|
||||
u32 hw_ver;
|
||||
};
|
||||
|
||||
#define RTASE_LSO_64K 64000
|
||||
|
||||
@@ -1714,10 +1714,21 @@ static int rtase_get_settings(struct net_device *dev,
|
||||
struct ethtool_link_ksettings *cmd)
|
||||
{
|
||||
u32 supported = SUPPORTED_MII | SUPPORTED_Pause | SUPPORTED_Asym_Pause;
|
||||
const struct rtase_private *tp = netdev_priv(dev);
|
||||
|
||||
ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
|
||||
supported);
|
||||
cmd->base.speed = SPEED_5000;
|
||||
|
||||
switch (tp->hw_ver) {
|
||||
case RTASE_HW_VER_906X_7XA:
|
||||
case RTASE_HW_VER_906X_7XC:
|
||||
cmd->base.speed = SPEED_5000;
|
||||
break;
|
||||
case RTASE_HW_VER_907XD_V1:
|
||||
cmd->base.speed = SPEED_10000;
|
||||
break;
|
||||
}
|
||||
|
||||
cmd->base.duplex = DUPLEX_FULL;
|
||||
cmd->base.port = PORT_MII;
|
||||
cmd->base.autoneg = AUTONEG_DISABLE;
|
||||
@@ -1972,20 +1983,21 @@ static void rtase_init_software_variable(struct pci_dev *pdev,
|
||||
tp->dev->max_mtu = RTASE_MAX_JUMBO_SIZE;
|
||||
}
|
||||
|
||||
static bool rtase_check_mac_version_valid(struct rtase_private *tp)
|
||||
static int rtase_check_mac_version_valid(struct rtase_private *tp)
|
||||
{
|
||||
u32 hw_ver = rtase_r32(tp, RTASE_TX_CONFIG_0) & RTASE_HW_VER_MASK;
|
||||
bool known_ver = false;
|
||||
int ret = -ENODEV;
|
||||
|
||||
switch (hw_ver) {
|
||||
case 0x00800000:
|
||||
case 0x04000000:
|
||||
case 0x04800000:
|
||||
known_ver = true;
|
||||
tp->hw_ver = rtase_r32(tp, RTASE_TX_CONFIG_0) & RTASE_HW_VER_MASK;
|
||||
|
||||
switch (tp->hw_ver) {
|
||||
case RTASE_HW_VER_906X_7XA:
|
||||
case RTASE_HW_VER_906X_7XC:
|
||||
case RTASE_HW_VER_907XD_V1:
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return known_ver;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtase_init_board(struct pci_dev *pdev, struct net_device **dev_out,
|
||||
@@ -2105,9 +2117,13 @@ static int rtase_init_one(struct pci_dev *pdev,
|
||||
tp->pdev = pdev;
|
||||
|
||||
/* identify chip attached to board */
|
||||
if (!rtase_check_mac_version_valid(tp))
|
||||
return dev_err_probe(&pdev->dev, -ENODEV,
|
||||
"unknown chip version, contact rtase maintainers (see MAINTAINERS file)\n");
|
||||
ret = rtase_check_mac_version_valid(tp);
|
||||
if (ret != 0) {
|
||||
dev_err(&pdev->dev,
|
||||
"unknown chip version: 0x%08x, contact rtase maintainers (see MAINTAINERS file)\n",
|
||||
tp->hw_ver);
|
||||
goto err_out_release_board;
|
||||
}
|
||||
|
||||
rtase_init_software_variable(pdev, tp);
|
||||
rtase_init_hardware(tp);
|
||||
@@ -2181,6 +2197,7 @@ err_out_1:
|
||||
netif_napi_del(&ivec->napi);
|
||||
}
|
||||
|
||||
err_out_release_board:
|
||||
rtase_release_board(pdev, dev, ioaddr);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -486,6 +486,8 @@ static int socfpga_dwmac_probe(struct platform_device *pdev)
|
||||
plat_dat->pcs_exit = socfpga_dwmac_pcs_exit;
|
||||
plat_dat->select_pcs = socfpga_dwmac_select_pcs;
|
||||
|
||||
plat_dat->riwt_off = 1;
|
||||
|
||||
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -352,8 +352,11 @@ static int ipq4019_mdio_probe(struct platform_device *pdev)
|
||||
/* The platform resource is provided on the chipset IPQ5018 */
|
||||
/* This resource is optional */
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
if (res)
|
||||
if (res) {
|
||||
priv->eth_ldo_rdy = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(priv->eth_ldo_rdy))
|
||||
return PTR_ERR(priv->eth_ldo_rdy);
|
||||
}
|
||||
|
||||
bus->name = "ipq4019_mdio";
|
||||
bus->read = ipq4019_mdio_read_c22;
|
||||
|
||||
+22
-20
@@ -1652,13 +1652,13 @@ static int lan78xx_set_wol(struct net_device *netdev,
|
||||
struct lan78xx_priv *pdata = (struct lan78xx_priv *)(dev->data[0]);
|
||||
int ret;
|
||||
|
||||
if (wol->wolopts & ~WAKE_ALL)
|
||||
return -EINVAL;
|
||||
|
||||
ret = usb_autopm_get_interface(dev->intf);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (wol->wolopts & ~WAKE_ALL)
|
||||
return -EINVAL;
|
||||
|
||||
pdata->wol = wol->wolopts;
|
||||
|
||||
device_set_wakeup_enable(&dev->udev->dev, (bool)wol->wolopts);
|
||||
@@ -2380,6 +2380,7 @@ static int lan78xx_phy_init(struct lan78xx_net *dev)
|
||||
if (dev->chipid == ID_REV_CHIP_ID_7801_) {
|
||||
if (phy_is_pseudo_fixed_link(phydev)) {
|
||||
fixed_phy_unregister(phydev);
|
||||
phy_device_free(phydev);
|
||||
} else {
|
||||
phy_unregister_fixup_for_uid(PHY_KSZ9031RNX,
|
||||
0xfffffff0);
|
||||
@@ -4246,8 +4247,10 @@ static void lan78xx_disconnect(struct usb_interface *intf)
|
||||
|
||||
phy_disconnect(net->phydev);
|
||||
|
||||
if (phy_is_pseudo_fixed_link(phydev))
|
||||
if (phy_is_pseudo_fixed_link(phydev)) {
|
||||
fixed_phy_unregister(phydev);
|
||||
phy_device_free(phydev);
|
||||
}
|
||||
|
||||
usb_scuttle_anchored_urbs(&dev->deferred);
|
||||
|
||||
@@ -4414,29 +4417,30 @@ static int lan78xx_probe(struct usb_interface *intf,
|
||||
|
||||
period = ep_intr->desc.bInterval;
|
||||
maxp = usb_maxpacket(dev->udev, dev->pipe_intr);
|
||||
buf = kmalloc(maxp, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
ret = -ENOMEM;
|
||||
goto out5;
|
||||
}
|
||||
|
||||
dev->urb_intr = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!dev->urb_intr) {
|
||||
ret = -ENOMEM;
|
||||
goto out6;
|
||||
} else {
|
||||
usb_fill_int_urb(dev->urb_intr, dev->udev,
|
||||
dev->pipe_intr, buf, maxp,
|
||||
intr_complete, dev, period);
|
||||
dev->urb_intr->transfer_flags |= URB_FREE_BUFFER;
|
||||
goto out5;
|
||||
}
|
||||
|
||||
buf = kmalloc(maxp, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
ret = -ENOMEM;
|
||||
goto free_urbs;
|
||||
}
|
||||
|
||||
usb_fill_int_urb(dev->urb_intr, dev->udev,
|
||||
dev->pipe_intr, buf, maxp,
|
||||
intr_complete, dev, period);
|
||||
dev->urb_intr->transfer_flags |= URB_FREE_BUFFER;
|
||||
|
||||
dev->maxpacket = usb_maxpacket(dev->udev, dev->pipe_out);
|
||||
|
||||
/* Reject broken descriptors. */
|
||||
if (dev->maxpacket == 0) {
|
||||
ret = -ENODEV;
|
||||
goto out6;
|
||||
goto free_urbs;
|
||||
}
|
||||
|
||||
/* driver requires remote-wakeup capability during autosuspend. */
|
||||
@@ -4444,7 +4448,7 @@ static int lan78xx_probe(struct usb_interface *intf,
|
||||
|
||||
ret = lan78xx_phy_init(dev);
|
||||
if (ret < 0)
|
||||
goto out7;
|
||||
goto free_urbs;
|
||||
|
||||
ret = register_netdev(netdev);
|
||||
if (ret != 0) {
|
||||
@@ -4466,10 +4470,8 @@ static int lan78xx_probe(struct usb_interface *intf,
|
||||
|
||||
out8:
|
||||
phy_disconnect(netdev->phydev);
|
||||
out7:
|
||||
free_urbs:
|
||||
usb_free_urb(dev->urb_intr);
|
||||
out6:
|
||||
kfree(buf);
|
||||
out5:
|
||||
lan78xx_unbind(dev, intf);
|
||||
out4:
|
||||
|
||||
@@ -867,12 +867,18 @@ static int pci_epf_mhi_bind(struct pci_epf *epf)
|
||||
{
|
||||
struct pci_epf_mhi *epf_mhi = epf_get_drvdata(epf);
|
||||
struct pci_epc *epc = epf->epc;
|
||||
struct device *dev = &epf->dev;
|
||||
struct platform_device *pdev = to_platform_device(epc->dev.parent);
|
||||
struct resource *res;
|
||||
int ret;
|
||||
|
||||
/* Get MMIO base address from Endpoint controller */
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mmio");
|
||||
if (!res) {
|
||||
dev_err(dev, "Failed to get \"mmio\" resource\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
epf_mhi->mmio_phys = res->start;
|
||||
epf_mhi->mmio_size = resource_size(res);
|
||||
|
||||
|
||||
@@ -197,9 +197,9 @@
|
||||
#define CSR_2L_PXP_TX1_MULTLANE_EN BIT(0)
|
||||
|
||||
#define REG_CSR_2L_RX0_REV0 0x00fc
|
||||
#define CSR_2L_PXP_VOS_PNINV GENMASK(3, 2)
|
||||
#define CSR_2L_PXP_FE_GAIN_NORMAL_MODE GENMASK(6, 4)
|
||||
#define CSR_2L_PXP_FE_GAIN_TRAIN_MODE GENMASK(10, 8)
|
||||
#define CSR_2L_PXP_VOS_PNINV GENMASK(19, 18)
|
||||
#define CSR_2L_PXP_FE_GAIN_NORMAL_MODE GENMASK(22, 20)
|
||||
#define CSR_2L_PXP_FE_GAIN_TRAIN_MODE GENMASK(26, 24)
|
||||
|
||||
#define REG_CSR_2L_RX0_PHYCK_DIV 0x0100
|
||||
#define CSR_2L_PXP_RX0_PHYCK_SEL GENMASK(9, 8)
|
||||
|
||||
@@ -459,7 +459,7 @@ static void airoha_pcie_phy_init_clk_out(struct airoha_pcie_phy *pcie_phy)
|
||||
airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CLKTX1_OFFSET,
|
||||
CSR_2L_PXP_CLKTX1_SR);
|
||||
airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_PLL_CMN_RESERVE0,
|
||||
CSR_2L_PXP_PLL_RESERVE_MASK, 0xdd);
|
||||
CSR_2L_PXP_PLL_RESERVE_MASK, 0xd0d);
|
||||
}
|
||||
|
||||
static void airoha_pcie_phy_init_csr_2l(struct airoha_pcie_phy *pcie_phy)
|
||||
@@ -471,9 +471,9 @@ static void airoha_pcie_phy_init_csr_2l(struct airoha_pcie_phy *pcie_phy)
|
||||
PCIE_SW_XFI_RXPCS_RST | PCIE_SW_REF_RST |
|
||||
PCIE_SW_RX_RST);
|
||||
airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_TX_RESET,
|
||||
PCIE_TX_TOP_RST | REG_PCIE_PMA_TX_RESET);
|
||||
PCIE_TX_TOP_RST | PCIE_TX_CAL_RST);
|
||||
airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_TX_RESET,
|
||||
PCIE_TX_TOP_RST | REG_PCIE_PMA_TX_RESET);
|
||||
PCIE_TX_TOP_RST | PCIE_TX_CAL_RST);
|
||||
}
|
||||
|
||||
static void airoha_pcie_phy_init_rx(struct airoha_pcie_phy *pcie_phy)
|
||||
@@ -802,7 +802,7 @@ static void airoha_pcie_phy_init_ssc_jcpll(struct airoha_pcie_phy *pcie_phy)
|
||||
airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SDM_IFM,
|
||||
CSR_2L_PXP_JCPLL_SDM_IFM);
|
||||
airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SDM_HREN,
|
||||
REG_CSR_2L_JCPLL_SDM_HREN);
|
||||
CSR_2L_PXP_JCPLL_SDM_HREN);
|
||||
airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_RST_DLY,
|
||||
CSR_2L_PXP_JCPLL_SDM_DI_EN);
|
||||
airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC,
|
||||
|
||||
@@ -1023,6 +1023,8 @@ static int rtk_usb2phy_probe(struct platform_device *pdev)
|
||||
|
||||
rtk_phy->dev = &pdev->dev;
|
||||
rtk_phy->phy_cfg = devm_kzalloc(dev, sizeof(*phy_cfg), GFP_KERNEL);
|
||||
if (!rtk_phy->phy_cfg)
|
||||
return -ENOMEM;
|
||||
|
||||
memcpy(rtk_phy->phy_cfg, phy_cfg, sizeof(*phy_cfg));
|
||||
|
||||
|
||||
@@ -577,6 +577,8 @@ static int rtk_usb3phy_probe(struct platform_device *pdev)
|
||||
|
||||
rtk_phy->dev = &pdev->dev;
|
||||
rtk_phy->phy_cfg = devm_kzalloc(dev, sizeof(*phy_cfg), GFP_KERNEL);
|
||||
if (!rtk_phy->phy_cfg)
|
||||
return -ENOMEM;
|
||||
|
||||
memcpy(rtk_phy->phy_cfg, phy_cfg, sizeof(*phy_cfg));
|
||||
|
||||
|
||||
@@ -79,6 +79,7 @@ config POWER_RESET_EP93XX
|
||||
bool "Cirrus EP93XX reset driver" if COMPILE_TEST
|
||||
depends on MFD_SYSCON
|
||||
default ARCH_EP93XX
|
||||
select AUXILIARY_BUS
|
||||
help
|
||||
This driver provides restart support for Cirrus EP93XX SoC.
|
||||
|
||||
|
||||
@@ -449,9 +449,29 @@ static u8
|
||||
[BQ27XXX_REG_AP] = 0x18,
|
||||
BQ27XXX_DM_REG_ROWS,
|
||||
},
|
||||
bq27426_regs[BQ27XXX_REG_MAX] = {
|
||||
[BQ27XXX_REG_CTRL] = 0x00,
|
||||
[BQ27XXX_REG_TEMP] = 0x02,
|
||||
[BQ27XXX_REG_INT_TEMP] = 0x1e,
|
||||
[BQ27XXX_REG_VOLT] = 0x04,
|
||||
[BQ27XXX_REG_AI] = 0x10,
|
||||
[BQ27XXX_REG_FLAGS] = 0x06,
|
||||
[BQ27XXX_REG_TTE] = INVALID_REG_ADDR,
|
||||
[BQ27XXX_REG_TTF] = INVALID_REG_ADDR,
|
||||
[BQ27XXX_REG_TTES] = INVALID_REG_ADDR,
|
||||
[BQ27XXX_REG_TTECP] = INVALID_REG_ADDR,
|
||||
[BQ27XXX_REG_NAC] = 0x08,
|
||||
[BQ27XXX_REG_RC] = 0x0c,
|
||||
[BQ27XXX_REG_FCC] = 0x0e,
|
||||
[BQ27XXX_REG_CYCT] = INVALID_REG_ADDR,
|
||||
[BQ27XXX_REG_AE] = INVALID_REG_ADDR,
|
||||
[BQ27XXX_REG_SOC] = 0x1c,
|
||||
[BQ27XXX_REG_DCAP] = INVALID_REG_ADDR,
|
||||
[BQ27XXX_REG_AP] = 0x18,
|
||||
BQ27XXX_DM_REG_ROWS,
|
||||
},
|
||||
#define bq27411_regs bq27421_regs
|
||||
#define bq27425_regs bq27421_regs
|
||||
#define bq27426_regs bq27421_regs
|
||||
#define bq27441_regs bq27421_regs
|
||||
#define bq27621_regs bq27421_regs
|
||||
bq27z561_regs[BQ27XXX_REG_MAX] = {
|
||||
@@ -769,10 +789,23 @@ static enum power_supply_property bq27421_props[] = {
|
||||
};
|
||||
#define bq27411_props bq27421_props
|
||||
#define bq27425_props bq27421_props
|
||||
#define bq27426_props bq27421_props
|
||||
#define bq27441_props bq27421_props
|
||||
#define bq27621_props bq27421_props
|
||||
|
||||
static enum power_supply_property bq27426_props[] = {
|
||||
POWER_SUPPLY_PROP_STATUS,
|
||||
POWER_SUPPLY_PROP_PRESENT,
|
||||
POWER_SUPPLY_PROP_VOLTAGE_NOW,
|
||||
POWER_SUPPLY_PROP_CURRENT_NOW,
|
||||
POWER_SUPPLY_PROP_CAPACITY,
|
||||
POWER_SUPPLY_PROP_CAPACITY_LEVEL,
|
||||
POWER_SUPPLY_PROP_TEMP,
|
||||
POWER_SUPPLY_PROP_TECHNOLOGY,
|
||||
POWER_SUPPLY_PROP_CHARGE_FULL,
|
||||
POWER_SUPPLY_PROP_CHARGE_NOW,
|
||||
POWER_SUPPLY_PROP_MANUFACTURER,
|
||||
};
|
||||
|
||||
static enum power_supply_property bq27z561_props[] = {
|
||||
POWER_SUPPLY_PROP_STATUS,
|
||||
POWER_SUPPLY_PROP_PRESENT,
|
||||
|
||||
@@ -491,8 +491,6 @@ EXPORT_SYMBOL_GPL(power_supply_get_by_name);
|
||||
*/
|
||||
void power_supply_put(struct power_supply *psy)
|
||||
{
|
||||
might_sleep();
|
||||
|
||||
atomic_dec(&psy->use_cnt);
|
||||
put_device(&psy->dev);
|
||||
}
|
||||
|
||||
@@ -139,6 +139,19 @@ enum {
|
||||
RT9471_PORTSTAT_DCP,
|
||||
};
|
||||
|
||||
enum {
|
||||
RT9471_ICSTAT_SLEEP = 0,
|
||||
RT9471_ICSTAT_VBUSRDY,
|
||||
RT9471_ICSTAT_TRICKLECHG,
|
||||
RT9471_ICSTAT_PRECHG,
|
||||
RT9471_ICSTAT_FASTCHG,
|
||||
RT9471_ICSTAT_IEOC,
|
||||
RT9471_ICSTAT_BGCHG,
|
||||
RT9471_ICSTAT_CHGDONE,
|
||||
RT9471_ICSTAT_CHGFAULT,
|
||||
RT9471_ICSTAT_OTG = 15,
|
||||
};
|
||||
|
||||
struct rt9471_chip {
|
||||
struct device *dev;
|
||||
struct regmap *regmap;
|
||||
@@ -153,8 +166,8 @@ struct rt9471_chip {
|
||||
};
|
||||
|
||||
static const struct reg_field rt9471_reg_fields[F_MAX_FIELDS] = {
|
||||
[F_WDT] = REG_FIELD(RT9471_REG_TOP, 0, 0),
|
||||
[F_WDT_RST] = REG_FIELD(RT9471_REG_TOP, 1, 1),
|
||||
[F_WDT] = REG_FIELD(RT9471_REG_TOP, 0, 1),
|
||||
[F_WDT_RST] = REG_FIELD(RT9471_REG_TOP, 2, 2),
|
||||
[F_CHG_EN] = REG_FIELD(RT9471_REG_FUNC, 0, 0),
|
||||
[F_HZ] = REG_FIELD(RT9471_REG_FUNC, 5, 5),
|
||||
[F_BATFET_DIS] = REG_FIELD(RT9471_REG_FUNC, 7, 7),
|
||||
@@ -255,31 +268,32 @@ static int rt9471_get_ieoc(struct rt9471_chip *chip, int *microamp)
|
||||
|
||||
static int rt9471_get_status(struct rt9471_chip *chip, int *status)
|
||||
{
|
||||
unsigned int chg_ready, chg_done, fault_stat;
|
||||
unsigned int ic_stat;
|
||||
int ret;
|
||||
|
||||
ret = regmap_field_read(chip->rm_fields[F_ST_CHG_RDY], &chg_ready);
|
||||
ret = regmap_field_read(chip->rm_fields[F_IC_STAT], &ic_stat);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = regmap_field_read(chip->rm_fields[F_ST_CHG_DONE], &chg_done);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = regmap_read(chip->regmap, RT9471_REG_STAT1, &fault_stat);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
fault_stat &= RT9471_CHGFAULT_MASK;
|
||||
|
||||
if (chg_ready && chg_done)
|
||||
*status = POWER_SUPPLY_STATUS_FULL;
|
||||
else if (chg_ready && fault_stat)
|
||||
switch (ic_stat) {
|
||||
case RT9471_ICSTAT_VBUSRDY:
|
||||
case RT9471_ICSTAT_CHGFAULT:
|
||||
*status = POWER_SUPPLY_STATUS_NOT_CHARGING;
|
||||
else if (chg_ready && !fault_stat)
|
||||
break;
|
||||
case RT9471_ICSTAT_TRICKLECHG ... RT9471_ICSTAT_BGCHG:
|
||||
*status = POWER_SUPPLY_STATUS_CHARGING;
|
||||
else
|
||||
break;
|
||||
case RT9471_ICSTAT_CHGDONE:
|
||||
*status = POWER_SUPPLY_STATUS_FULL;
|
||||
break;
|
||||
case RT9471_ICSTAT_SLEEP:
|
||||
case RT9471_ICSTAT_OTG:
|
||||
*status = POWER_SUPPLY_STATUS_DISCHARGING;
|
||||
break;
|
||||
default:
|
||||
*status = POWER_SUPPLY_STATUS_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -734,15 +734,22 @@ static int adsp_probe(struct platform_device *pdev)
|
||||
desc->ssctl_id);
|
||||
if (IS_ERR(adsp->sysmon)) {
|
||||
ret = PTR_ERR(adsp->sysmon);
|
||||
goto disable_pm;
|
||||
goto deinit_remove_glink_pdm_ssr;
|
||||
}
|
||||
|
||||
ret = rproc_add(rproc);
|
||||
if (ret)
|
||||
goto disable_pm;
|
||||
goto remove_sysmon;
|
||||
|
||||
return 0;
|
||||
|
||||
remove_sysmon:
|
||||
qcom_remove_sysmon_subdev(adsp->sysmon);
|
||||
deinit_remove_glink_pdm_ssr:
|
||||
qcom_q6v5_deinit(&adsp->q6v5);
|
||||
qcom_remove_glink_subdev(rproc, &adsp->glink_subdev);
|
||||
qcom_remove_pdm_subdev(rproc, &adsp->pdm_subdev);
|
||||
qcom_remove_ssr_subdev(rproc, &adsp->ssr_subdev);
|
||||
disable_pm:
|
||||
qcom_rproc_pds_detach(adsp);
|
||||
|
||||
|
||||
@@ -1162,6 +1162,9 @@ static int q6v5_mba_load(struct q6v5 *qproc)
|
||||
goto disable_active_clks;
|
||||
}
|
||||
|
||||
if (qproc->has_mba_logs)
|
||||
qcom_pil_info_store("mba", qproc->mba_phys, MBA_LOG_SIZE);
|
||||
|
||||
writel(qproc->mba_phys, qproc->rmb_base + RMB_MBA_IMAGE_REG);
|
||||
if (qproc->dp_size) {
|
||||
writel(qproc->mba_phys + SZ_1M, qproc->rmb_base + RMB_PMI_CODE_START_REG);
|
||||
@@ -1172,9 +1175,6 @@ static int q6v5_mba_load(struct q6v5 *qproc)
|
||||
if (ret)
|
||||
goto reclaim_mba;
|
||||
|
||||
if (qproc->has_mba_logs)
|
||||
qcom_pil_info_store("mba", qproc->mba_phys, MBA_LOG_SIZE);
|
||||
|
||||
ret = q6v5_rmb_mba_wait(qproc, 0, 5000);
|
||||
if (ret == -ETIMEDOUT) {
|
||||
dev_err(qproc->dev, "MBA boot timed out\n");
|
||||
|
||||
@@ -759,16 +759,16 @@ static int adsp_probe(struct platform_device *pdev)
|
||||
|
||||
ret = adsp_init_clock(adsp);
|
||||
if (ret)
|
||||
goto free_rproc;
|
||||
goto unassign_mem;
|
||||
|
||||
ret = adsp_init_regulator(adsp);
|
||||
if (ret)
|
||||
goto free_rproc;
|
||||
goto unassign_mem;
|
||||
|
||||
ret = adsp_pds_attach(&pdev->dev, adsp->proxy_pds,
|
||||
desc->proxy_pd_names);
|
||||
if (ret < 0)
|
||||
goto free_rproc;
|
||||
goto unassign_mem;
|
||||
adsp->proxy_pd_count = ret;
|
||||
|
||||
ret = qcom_q6v5_init(&adsp->q6v5, pdev, rproc, desc->crash_reason_smem, desc->load_state,
|
||||
@@ -784,18 +784,28 @@ static int adsp_probe(struct platform_device *pdev)
|
||||
desc->ssctl_id);
|
||||
if (IS_ERR(adsp->sysmon)) {
|
||||
ret = PTR_ERR(adsp->sysmon);
|
||||
goto detach_proxy_pds;
|
||||
goto deinit_remove_pdm_smd_glink;
|
||||
}
|
||||
|
||||
qcom_add_ssr_subdev(rproc, &adsp->ssr_subdev, desc->ssr_name);
|
||||
ret = rproc_add(rproc);
|
||||
if (ret)
|
||||
goto detach_proxy_pds;
|
||||
goto remove_ssr_sysmon;
|
||||
|
||||
return 0;
|
||||
|
||||
remove_ssr_sysmon:
|
||||
qcom_remove_ssr_subdev(rproc, &adsp->ssr_subdev);
|
||||
qcom_remove_sysmon_subdev(adsp->sysmon);
|
||||
deinit_remove_pdm_smd_glink:
|
||||
qcom_remove_pdm_subdev(rproc, &adsp->pdm_subdev);
|
||||
qcom_remove_smd_subdev(rproc, &adsp->smd_subdev);
|
||||
qcom_remove_glink_subdev(rproc, &adsp->glink_subdev);
|
||||
qcom_q6v5_deinit(&adsp->q6v5);
|
||||
detach_proxy_pds:
|
||||
adsp_pds_detach(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
|
||||
unassign_mem:
|
||||
adsp_unassign_memory_region(adsp);
|
||||
free_rproc:
|
||||
device_init_wakeup(adsp->dev, false);
|
||||
|
||||
@@ -907,6 +917,7 @@ static const struct adsp_data sm8250_adsp_resource = {
|
||||
.crash_reason_smem = 423,
|
||||
.firmware_name = "adsp.mdt",
|
||||
.pas_id = 1,
|
||||
.minidump_id = 5,
|
||||
.auto_boot = true,
|
||||
.proxy_pd_names = (char*[]){
|
||||
"lcx",
|
||||
@@ -1124,6 +1135,7 @@ static const struct adsp_data sm8350_cdsp_resource = {
|
||||
.crash_reason_smem = 601,
|
||||
.firmware_name = "cdsp.mdt",
|
||||
.pas_id = 18,
|
||||
.minidump_id = 7,
|
||||
.auto_boot = true,
|
||||
.proxy_pd_names = (char*[]){
|
||||
"cx",
|
||||
|
||||
@@ -1204,7 +1204,8 @@ void qcom_glink_native_rx(struct qcom_glink *glink)
|
||||
ret = qcom_glink_rx_open_ack(glink, param1);
|
||||
break;
|
||||
case GLINK_CMD_OPEN:
|
||||
ret = qcom_glink_rx_defer(glink, param2);
|
||||
/* upper 16 bits of param2 are the "prio" field */
|
||||
ret = qcom_glink_rx_defer(glink, param2 & 0xffff);
|
||||
break;
|
||||
case GLINK_CMD_TX_DATA:
|
||||
case GLINK_CMD_TX_DATA_CONT:
|
||||
|
||||
@@ -183,7 +183,7 @@ static const char *atmel_qspi_reg_name(u32 offset, char *tmp, size_t sz)
|
||||
case QSPI_MR:
|
||||
return "MR";
|
||||
case QSPI_RD:
|
||||
return "MR";
|
||||
return "RD";
|
||||
case QSPI_TD:
|
||||
return "TD";
|
||||
case QSPI_SR:
|
||||
|
||||
@@ -480,6 +480,10 @@ uvc_video_complete(struct usb_ep *ep, struct usb_request *req)
|
||||
* up later.
|
||||
*/
|
||||
list_add_tail(&to_queue->list, &video->req_free);
|
||||
/*
|
||||
* There is a new free request - wake up the pump.
|
||||
*/
|
||||
queue_work(video->async_wq, &video->pump);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&video->req_lock, flags);
|
||||
|
||||
@@ -105,7 +105,9 @@ static int spear_ehci_hcd_drv_probe(struct platform_device *pdev)
|
||||
/* registers start at offset 0x0 */
|
||||
hcd_to_ehci(hcd)->caps = hcd->regs;
|
||||
|
||||
clk_prepare_enable(sehci->clk);
|
||||
retval = clk_prepare_enable(sehci->clk);
|
||||
if (retval)
|
||||
goto err_put_hcd;
|
||||
retval = usb_add_hcd(hcd, irq, IRQF_SHARED);
|
||||
if (retval)
|
||||
goto err_stop_ehci;
|
||||
@@ -130,8 +132,7 @@ static void spear_ehci_hcd_drv_remove(struct platform_device *pdev)
|
||||
|
||||
usb_remove_hcd(hcd);
|
||||
|
||||
if (sehci->clk)
|
||||
clk_disable_unprepare(sehci->clk);
|
||||
clk_disable_unprepare(sehci->clk);
|
||||
usb_put_hcd(hcd);
|
||||
}
|
||||
|
||||
|
||||
+24
-11
@@ -27,6 +27,8 @@ static struct usb_class_driver chaoskey_class;
|
||||
static int chaoskey_rng_read(struct hwrng *rng, void *data,
|
||||
size_t max, bool wait);
|
||||
|
||||
static DEFINE_MUTEX(chaoskey_list_lock);
|
||||
|
||||
#define usb_dbg(usb_if, format, arg...) \
|
||||
dev_dbg(&(usb_if)->dev, format, ## arg)
|
||||
|
||||
@@ -233,6 +235,7 @@ static void chaoskey_disconnect(struct usb_interface *interface)
|
||||
usb_deregister_dev(interface, &chaoskey_class);
|
||||
|
||||
usb_set_intfdata(interface, NULL);
|
||||
mutex_lock(&chaoskey_list_lock);
|
||||
mutex_lock(&dev->lock);
|
||||
|
||||
dev->present = false;
|
||||
@@ -244,6 +247,7 @@ static void chaoskey_disconnect(struct usb_interface *interface)
|
||||
} else
|
||||
mutex_unlock(&dev->lock);
|
||||
|
||||
mutex_unlock(&chaoskey_list_lock);
|
||||
usb_dbg(interface, "disconnect done");
|
||||
}
|
||||
|
||||
@@ -251,6 +255,7 @@ static int chaoskey_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct chaoskey *dev;
|
||||
struct usb_interface *interface;
|
||||
int rv = 0;
|
||||
|
||||
/* get the interface from minor number and driver information */
|
||||
interface = usb_find_interface(&chaoskey_driver, iminor(inode));
|
||||
@@ -266,18 +271,23 @@ static int chaoskey_open(struct inode *inode, struct file *file)
|
||||
}
|
||||
|
||||
file->private_data = dev;
|
||||
mutex_lock(&chaoskey_list_lock);
|
||||
mutex_lock(&dev->lock);
|
||||
++dev->open;
|
||||
if (dev->present)
|
||||
++dev->open;
|
||||
else
|
||||
rv = -ENODEV;
|
||||
mutex_unlock(&dev->lock);
|
||||
mutex_unlock(&chaoskey_list_lock);
|
||||
|
||||
usb_dbg(interface, "open success");
|
||||
return 0;
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int chaoskey_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct chaoskey *dev = file->private_data;
|
||||
struct usb_interface *interface;
|
||||
int rv = 0;
|
||||
|
||||
if (dev == NULL)
|
||||
return -ENODEV;
|
||||
@@ -286,14 +296,15 @@ static int chaoskey_release(struct inode *inode, struct file *file)
|
||||
|
||||
usb_dbg(interface, "release");
|
||||
|
||||
mutex_lock(&chaoskey_list_lock);
|
||||
mutex_lock(&dev->lock);
|
||||
|
||||
usb_dbg(interface, "open count at release is %d", dev->open);
|
||||
|
||||
if (dev->open <= 0) {
|
||||
usb_dbg(interface, "invalid open count (%d)", dev->open);
|
||||
mutex_unlock(&dev->lock);
|
||||
return -ENODEV;
|
||||
rv = -ENODEV;
|
||||
goto bail;
|
||||
}
|
||||
|
||||
--dev->open;
|
||||
@@ -302,13 +313,15 @@ static int chaoskey_release(struct inode *inode, struct file *file)
|
||||
if (dev->open == 0) {
|
||||
mutex_unlock(&dev->lock);
|
||||
chaoskey_free(dev);
|
||||
} else
|
||||
mutex_unlock(&dev->lock);
|
||||
} else
|
||||
mutex_unlock(&dev->lock);
|
||||
|
||||
goto destruction;
|
||||
}
|
||||
}
|
||||
bail:
|
||||
mutex_unlock(&dev->lock);
|
||||
destruction:
|
||||
mutex_unlock(&chaoskey_list_lock);
|
||||
usb_dbg(interface, "release success");
|
||||
return 0;
|
||||
return rv;
|
||||
}
|
||||
|
||||
static void chaos_read_callback(struct urb *urb)
|
||||
|
||||
@@ -277,28 +277,45 @@ static ssize_t iowarrior_read(struct file *file, char __user *buffer,
|
||||
struct iowarrior *dev;
|
||||
int read_idx;
|
||||
int offset;
|
||||
int retval;
|
||||
|
||||
dev = file->private_data;
|
||||
|
||||
if (file->f_flags & O_NONBLOCK) {
|
||||
retval = mutex_trylock(&dev->mutex);
|
||||
if (!retval)
|
||||
return -EAGAIN;
|
||||
} else {
|
||||
retval = mutex_lock_interruptible(&dev->mutex);
|
||||
if (retval)
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
|
||||
/* verify that the device wasn't unplugged */
|
||||
if (!dev || !dev->present)
|
||||
return -ENODEV;
|
||||
if (!dev->present) {
|
||||
retval = -ENODEV;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
dev_dbg(&dev->interface->dev, "minor %d, count = %zd\n",
|
||||
dev->minor, count);
|
||||
|
||||
/* read count must be packet size (+ time stamp) */
|
||||
if ((count != dev->report_size)
|
||||
&& (count != (dev->report_size + 1)))
|
||||
return -EINVAL;
|
||||
&& (count != (dev->report_size + 1))) {
|
||||
retval = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* repeat until no buffer overrun in callback handler occur */
|
||||
do {
|
||||
atomic_set(&dev->overflow_flag, 0);
|
||||
if ((read_idx = read_index(dev)) == -1) {
|
||||
/* queue empty */
|
||||
if (file->f_flags & O_NONBLOCK)
|
||||
return -EAGAIN;
|
||||
if (file->f_flags & O_NONBLOCK) {
|
||||
retval = -EAGAIN;
|
||||
goto exit;
|
||||
}
|
||||
else {
|
||||
//next line will return when there is either new data, or the device is unplugged
|
||||
int r = wait_event_interruptible(dev->read_wait,
|
||||
@@ -309,28 +326,37 @@ static ssize_t iowarrior_read(struct file *file, char __user *buffer,
|
||||
-1));
|
||||
if (r) {
|
||||
//we were interrupted by a signal
|
||||
return -ERESTART;
|
||||
retval = -ERESTART;
|
||||
goto exit;
|
||||
}
|
||||
if (!dev->present) {
|
||||
//The device was unplugged
|
||||
return -ENODEV;
|
||||
retval = -ENODEV;
|
||||
goto exit;
|
||||
}
|
||||
if (read_idx == -1) {
|
||||
// Can this happen ???
|
||||
return 0;
|
||||
retval = 0;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
offset = read_idx * (dev->report_size + 1);
|
||||
if (copy_to_user(buffer, dev->read_queue + offset, count)) {
|
||||
return -EFAULT;
|
||||
retval = -EFAULT;
|
||||
goto exit;
|
||||
}
|
||||
} while (atomic_read(&dev->overflow_flag));
|
||||
|
||||
read_idx = ++read_idx == MAX_INTERRUPT_BUFFER ? 0 : read_idx;
|
||||
atomic_set(&dev->read_idx, read_idx);
|
||||
mutex_unlock(&dev->mutex);
|
||||
return count;
|
||||
|
||||
exit:
|
||||
mutex_unlock(&dev->mutex);
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -885,7 +911,6 @@ error:
|
||||
static void iowarrior_disconnect(struct usb_interface *interface)
|
||||
{
|
||||
struct iowarrior *dev = usb_get_intfdata(interface);
|
||||
int minor = dev->minor;
|
||||
|
||||
usb_deregister_dev(interface, &iowarrior_class);
|
||||
|
||||
@@ -909,9 +934,6 @@ static void iowarrior_disconnect(struct usb_interface *interface)
|
||||
mutex_unlock(&dev->mutex);
|
||||
iowarrior_delete(dev);
|
||||
}
|
||||
|
||||
dev_info(&interface->dev, "I/O-Warror #%d now disconnected\n",
|
||||
minor - IOWARRIOR_MINOR_BASE);
|
||||
}
|
||||
|
||||
/* usb specific object needed to register this driver with the usb subsystem */
|
||||
|
||||
@@ -441,7 +441,10 @@ static ssize_t yurex_write(struct file *file, const char __user *user_buffer,
|
||||
if (count == 0)
|
||||
goto error;
|
||||
|
||||
mutex_lock(&dev->io_mutex);
|
||||
retval = mutex_lock_interruptible(&dev->io_mutex);
|
||||
if (retval < 0)
|
||||
return -EINTR;
|
||||
|
||||
if (dev->disconnected) { /* already disconnected */
|
||||
mutex_unlock(&dev->io_mutex);
|
||||
retval = -ENODEV;
|
||||
|
||||
@@ -644,6 +644,10 @@ static int ucsi_ccg_sync_control(struct ucsi *ucsi, u64 command)
|
||||
uc->has_multiple_dp) {
|
||||
con_index = (uc->last_cmd_sent >> 16) &
|
||||
UCSI_CMD_CONNECTOR_MASK;
|
||||
if (con_index == 0) {
|
||||
ret = -EINVAL;
|
||||
goto unlock;
|
||||
}
|
||||
con = &uc->ucsi->connector[con_index - 1];
|
||||
ucsi_ccg_update_set_new_cam_cmd(uc, con, &command);
|
||||
}
|
||||
@@ -651,6 +655,7 @@ static int ucsi_ccg_sync_control(struct ucsi *ucsi, u64 command)
|
||||
ret = ucsi_sync_control_common(ucsi, command);
|
||||
|
||||
pm_runtime_put_sync(uc->dev);
|
||||
unlock:
|
||||
mutex_unlock(&uc->lock);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -185,7 +185,7 @@ static void pmic_glink_ucsi_connector_status(struct ucsi_connector *con)
|
||||
struct pmic_glink_ucsi *ucsi = ucsi_get_drvdata(con->ucsi);
|
||||
int orientation;
|
||||
|
||||
if (con->num >= PMIC_GLINK_MAX_PORTS ||
|
||||
if (con->num > PMIC_GLINK_MAX_PORTS ||
|
||||
!ucsi->port_orientation[con->num - 1])
|
||||
return;
|
||||
|
||||
|
||||
@@ -368,7 +368,6 @@ static int map_direct_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_direct_mr
|
||||
unsigned long lgcd = 0;
|
||||
int log_entity_size;
|
||||
unsigned long size;
|
||||
u64 start = 0;
|
||||
int err;
|
||||
struct page *pg;
|
||||
unsigned int nsg;
|
||||
@@ -379,10 +378,9 @@ static int map_direct_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_direct_mr
|
||||
struct device *dma = mvdev->vdev.dma_dev;
|
||||
|
||||
for (map = vhost_iotlb_itree_first(iotlb, mr->start, mr->end - 1);
|
||||
map; map = vhost_iotlb_itree_next(map, start, mr->end - 1)) {
|
||||
map; map = vhost_iotlb_itree_next(map, mr->start, mr->end - 1)) {
|
||||
size = maplen(map, mr);
|
||||
lgcd = gcd(lgcd, size);
|
||||
start += size;
|
||||
}
|
||||
log_entity_size = ilog2(lgcd);
|
||||
|
||||
|
||||
@@ -423,6 +423,7 @@ static int mlx5vf_add_migration_pages(struct mlx5_vhca_data_buffer *buf,
|
||||
unsigned long filled;
|
||||
unsigned int to_fill;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
to_fill = min_t(unsigned int, npages, PAGE_SIZE / sizeof(*page_list));
|
||||
page_list = kvzalloc(to_fill * sizeof(*page_list), GFP_KERNEL_ACCOUNT);
|
||||
@@ -443,7 +444,7 @@ static int mlx5vf_add_migration_pages(struct mlx5_vhca_data_buffer *buf,
|
||||
GFP_KERNEL_ACCOUNT);
|
||||
|
||||
if (ret)
|
||||
goto err;
|
||||
goto err_append;
|
||||
buf->allocated_length += filled * PAGE_SIZE;
|
||||
/* clean input for another bulk allocation */
|
||||
memset(page_list, 0, filled * sizeof(*page_list));
|
||||
@@ -454,6 +455,9 @@ static int mlx5vf_add_migration_pages(struct mlx5_vhca_data_buffer *buf,
|
||||
kvfree(page_list);
|
||||
return 0;
|
||||
|
||||
err_append:
|
||||
for (i = filled - 1; i >= 0; i--)
|
||||
__free_page(page_list[i]);
|
||||
err:
|
||||
kvfree(page_list);
|
||||
return ret;
|
||||
|
||||
@@ -640,14 +640,11 @@ mlx5vf_pci_save_device_data(struct mlx5vf_pci_core_device *mvdev, bool track)
|
||||
O_RDONLY);
|
||||
if (IS_ERR(migf->filp)) {
|
||||
ret = PTR_ERR(migf->filp);
|
||||
goto end;
|
||||
kfree(migf);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
migf->mvdev = mvdev;
|
||||
ret = mlx5vf_cmd_alloc_pd(migf);
|
||||
if (ret)
|
||||
goto out_free;
|
||||
|
||||
stream_open(migf->filp->f_inode, migf->filp);
|
||||
mutex_init(&migf->lock);
|
||||
init_waitqueue_head(&migf->poll_wait);
|
||||
@@ -663,6 +660,11 @@ mlx5vf_pci_save_device_data(struct mlx5vf_pci_core_device *mvdev, bool track)
|
||||
INIT_LIST_HEAD(&migf->buf_list);
|
||||
INIT_LIST_HEAD(&migf->avail_list);
|
||||
spin_lock_init(&migf->list_lock);
|
||||
|
||||
ret = mlx5vf_cmd_alloc_pd(migf);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = mlx5vf_cmd_query_vhca_migration_state(mvdev, &length, &full_size, 0);
|
||||
if (ret)
|
||||
goto out_pd;
|
||||
@@ -692,10 +694,8 @@ out_save:
|
||||
mlx5vf_free_data_buffer(buf);
|
||||
out_pd:
|
||||
mlx5fv_cmd_clean_migf_resources(migf);
|
||||
out_free:
|
||||
out:
|
||||
fput(migf->filp);
|
||||
end:
|
||||
kfree(migf);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
@@ -1016,13 +1016,19 @@ mlx5vf_pci_resume_device_data(struct mlx5vf_pci_core_device *mvdev)
|
||||
O_WRONLY);
|
||||
if (IS_ERR(migf->filp)) {
|
||||
ret = PTR_ERR(migf->filp);
|
||||
goto end;
|
||||
kfree(migf);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
stream_open(migf->filp->f_inode, migf->filp);
|
||||
mutex_init(&migf->lock);
|
||||
INIT_LIST_HEAD(&migf->buf_list);
|
||||
INIT_LIST_HEAD(&migf->avail_list);
|
||||
spin_lock_init(&migf->list_lock);
|
||||
migf->mvdev = mvdev;
|
||||
ret = mlx5vf_cmd_alloc_pd(migf);
|
||||
if (ret)
|
||||
goto out_free;
|
||||
goto out;
|
||||
|
||||
buf = mlx5vf_alloc_data_buffer(migf, 0, DMA_TO_DEVICE);
|
||||
if (IS_ERR(buf)) {
|
||||
@@ -1041,20 +1047,13 @@ mlx5vf_pci_resume_device_data(struct mlx5vf_pci_core_device *mvdev)
|
||||
migf->buf_header[0] = buf;
|
||||
migf->load_state = MLX5_VF_LOAD_STATE_READ_HEADER;
|
||||
|
||||
stream_open(migf->filp->f_inode, migf->filp);
|
||||
mutex_init(&migf->lock);
|
||||
INIT_LIST_HEAD(&migf->buf_list);
|
||||
INIT_LIST_HEAD(&migf->avail_list);
|
||||
spin_lock_init(&migf->list_lock);
|
||||
return migf;
|
||||
out_buf:
|
||||
mlx5vf_free_data_buffer(migf->buf[0]);
|
||||
out_pd:
|
||||
mlx5vf_cmd_dealloc_pd(migf);
|
||||
out_free:
|
||||
out:
|
||||
fput(migf->filp);
|
||||
end:
|
||||
kfree(migf);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
|
||||
@@ -313,6 +313,10 @@ static int vfio_virt_config_read(struct vfio_pci_core_device *vdev, int pos,
|
||||
return count;
|
||||
}
|
||||
|
||||
static struct perm_bits direct_ro_perms = {
|
||||
.readfn = vfio_direct_config_read,
|
||||
};
|
||||
|
||||
/* Default capability regions to read-only, no-virtualization */
|
||||
static struct perm_bits cap_perms[PCI_CAP_ID_MAX + 1] = {
|
||||
[0 ... PCI_CAP_ID_MAX] = { .readfn = vfio_direct_config_read }
|
||||
@@ -1897,9 +1901,17 @@ static ssize_t vfio_config_do_rw(struct vfio_pci_core_device *vdev, char __user
|
||||
cap_start = *ppos;
|
||||
} else {
|
||||
if (*ppos >= PCI_CFG_SPACE_SIZE) {
|
||||
WARN_ON(cap_id > PCI_EXT_CAP_ID_MAX);
|
||||
/*
|
||||
* We can get a cap_id that exceeds PCI_EXT_CAP_ID_MAX
|
||||
* if we're hiding an unknown capability at the start
|
||||
* of the extended capability list. Use default, ro
|
||||
* access, which will virtualize the id and next values.
|
||||
*/
|
||||
if (cap_id > PCI_EXT_CAP_ID_MAX)
|
||||
perm = &direct_ro_perms;
|
||||
else
|
||||
perm = &ecap_perms[cap_id];
|
||||
|
||||
perm = &ecap_perms[cap_id];
|
||||
cap_start = vfio_find_cap_start(vdev, *ppos);
|
||||
} else {
|
||||
WARN_ON(cap_id > PCI_CAP_ID_MAX);
|
||||
|
||||
@@ -313,7 +313,7 @@ int xenbus_dev_probe(struct device *_dev)
|
||||
if (err) {
|
||||
dev_warn(&dev->dev, "watch_otherend on %s failed.\n",
|
||||
dev->nodename);
|
||||
return err;
|
||||
goto fail_remove;
|
||||
}
|
||||
|
||||
dev->spurious_threshold = 1;
|
||||
@@ -322,6 +322,12 @@ int xenbus_dev_probe(struct device *_dev)
|
||||
dev->nodename);
|
||||
|
||||
return 0;
|
||||
fail_remove:
|
||||
if (drv->remove) {
|
||||
down(&dev->reclaim_sem);
|
||||
drv->remove(dev);
|
||||
up(&dev->reclaim_sem);
|
||||
}
|
||||
fail_put:
|
||||
module_put(drv->driver.owner);
|
||||
fail:
|
||||
|
||||
@@ -584,6 +584,16 @@ static ssize_t exfat_file_write_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
if (ret < 0)
|
||||
goto unlock;
|
||||
|
||||
if (iocb->ki_flags & IOCB_DIRECT) {
|
||||
unsigned long align = pos | iov_iter_alignment(iter);
|
||||
|
||||
if (!IS_ALIGNED(align, i_blocksize(inode)) &&
|
||||
!IS_ALIGNED(align, bdev_logical_block_size(inode->i_sb->s_bdev))) {
|
||||
ret = -EINVAL;
|
||||
goto unlock;
|
||||
}
|
||||
}
|
||||
|
||||
if (pos > valid_size) {
|
||||
ret = exfat_extend_valid_size(file, pos);
|
||||
if (ret < 0 && ret != -ENOSPC) {
|
||||
|
||||
+53
-1
@@ -185,6 +185,56 @@ static inline ext4_fsblk_t ext4_fsmap_next_pblk(struct ext4_fsmap *fmr)
|
||||
return fmr->fmr_physical + fmr->fmr_length;
|
||||
}
|
||||
|
||||
static int ext4_getfsmap_meta_helper(struct super_block *sb,
|
||||
ext4_group_t agno, ext4_grpblk_t start,
|
||||
ext4_grpblk_t len, void *priv)
|
||||
{
|
||||
struct ext4_getfsmap_info *info = priv;
|
||||
struct ext4_fsmap *p;
|
||||
struct ext4_fsmap *tmp;
|
||||
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
||||
ext4_fsblk_t fsb, fs_start, fs_end;
|
||||
int error;
|
||||
|
||||
fs_start = fsb = (EXT4_C2B(sbi, start) +
|
||||
ext4_group_first_block_no(sb, agno));
|
||||
fs_end = fs_start + EXT4_C2B(sbi, len);
|
||||
|
||||
/* Return relevant extents from the meta_list */
|
||||
list_for_each_entry_safe(p, tmp, &info->gfi_meta_list, fmr_list) {
|
||||
if (p->fmr_physical < info->gfi_next_fsblk) {
|
||||
list_del(&p->fmr_list);
|
||||
kfree(p);
|
||||
continue;
|
||||
}
|
||||
if (p->fmr_physical <= fs_start ||
|
||||
p->fmr_physical + p->fmr_length <= fs_end) {
|
||||
/* Emit the retained free extent record if present */
|
||||
if (info->gfi_lastfree.fmr_owner) {
|
||||
error = ext4_getfsmap_helper(sb, info,
|
||||
&info->gfi_lastfree);
|
||||
if (error)
|
||||
return error;
|
||||
info->gfi_lastfree.fmr_owner = 0;
|
||||
}
|
||||
error = ext4_getfsmap_helper(sb, info, p);
|
||||
if (error)
|
||||
return error;
|
||||
fsb = p->fmr_physical + p->fmr_length;
|
||||
if (info->gfi_next_fsblk < fsb)
|
||||
info->gfi_next_fsblk = fsb;
|
||||
list_del(&p->fmr_list);
|
||||
kfree(p);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (info->gfi_next_fsblk < fsb)
|
||||
info->gfi_next_fsblk = fsb;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Transform a blockgroup's free record into a fsmap */
|
||||
static int ext4_getfsmap_datadev_helper(struct super_block *sb,
|
||||
ext4_group_t agno, ext4_grpblk_t start,
|
||||
@@ -539,6 +589,7 @@ static int ext4_getfsmap_datadev(struct super_block *sb,
|
||||
error = ext4_mballoc_query_range(sb, info->gfi_agno,
|
||||
EXT4_B2C(sbi, info->gfi_low.fmr_physical),
|
||||
EXT4_B2C(sbi, info->gfi_high.fmr_physical),
|
||||
ext4_getfsmap_meta_helper,
|
||||
ext4_getfsmap_datadev_helper, info);
|
||||
if (error)
|
||||
goto err;
|
||||
@@ -560,7 +611,8 @@ static int ext4_getfsmap_datadev(struct super_block *sb,
|
||||
|
||||
/* Report any gaps at the end of the bg */
|
||||
info->gfi_last = true;
|
||||
error = ext4_getfsmap_datadev_helper(sb, end_ag, last_cluster, 0, info);
|
||||
error = ext4_getfsmap_datadev_helper(sb, end_ag, last_cluster + 1,
|
||||
0, info);
|
||||
if (error)
|
||||
goto err;
|
||||
|
||||
|
||||
+14
-4
@@ -6999,13 +6999,14 @@ int
|
||||
ext4_mballoc_query_range(
|
||||
struct super_block *sb,
|
||||
ext4_group_t group,
|
||||
ext4_grpblk_t start,
|
||||
ext4_grpblk_t first,
|
||||
ext4_grpblk_t end,
|
||||
ext4_mballoc_query_range_fn meta_formatter,
|
||||
ext4_mballoc_query_range_fn formatter,
|
||||
void *priv)
|
||||
{
|
||||
void *bitmap;
|
||||
ext4_grpblk_t next;
|
||||
ext4_grpblk_t start, next;
|
||||
struct ext4_buddy e4b;
|
||||
int error;
|
||||
|
||||
@@ -7016,10 +7017,19 @@ ext4_mballoc_query_range(
|
||||
|
||||
ext4_lock_group(sb, group);
|
||||
|
||||
start = max(e4b.bd_info->bb_first_free, start);
|
||||
start = max(e4b.bd_info->bb_first_free, first);
|
||||
if (end >= EXT4_CLUSTERS_PER_GROUP(sb))
|
||||
end = EXT4_CLUSTERS_PER_GROUP(sb) - 1;
|
||||
|
||||
if (meta_formatter && start != first) {
|
||||
if (start > end)
|
||||
start = end;
|
||||
ext4_unlock_group(sb, group);
|
||||
error = meta_formatter(sb, group, first, start - first,
|
||||
priv);
|
||||
if (error)
|
||||
goto out_unload;
|
||||
ext4_lock_group(sb, group);
|
||||
}
|
||||
while (start <= end) {
|
||||
start = mb_find_next_zero_bit(bitmap, end + 1, start);
|
||||
if (start > end)
|
||||
|
||||
@@ -259,6 +259,7 @@ ext4_mballoc_query_range(
|
||||
ext4_group_t agno,
|
||||
ext4_grpblk_t start,
|
||||
ext4_grpblk_t end,
|
||||
ext4_mballoc_query_range_fn meta_formatter,
|
||||
ext4_mballoc_query_range_fn formatter,
|
||||
void *priv);
|
||||
|
||||
|
||||
+4
-4
@@ -354,9 +354,9 @@ __u32 ext4_free_group_clusters(struct super_block *sb,
|
||||
__u32 ext4_free_inodes_count(struct super_block *sb,
|
||||
struct ext4_group_desc *bg)
|
||||
{
|
||||
return le16_to_cpu(bg->bg_free_inodes_count_lo) |
|
||||
return le16_to_cpu(READ_ONCE(bg->bg_free_inodes_count_lo)) |
|
||||
(EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ?
|
||||
(__u32)le16_to_cpu(bg->bg_free_inodes_count_hi) << 16 : 0);
|
||||
(__u32)le16_to_cpu(READ_ONCE(bg->bg_free_inodes_count_hi)) << 16 : 0);
|
||||
}
|
||||
|
||||
__u32 ext4_used_dirs_count(struct super_block *sb,
|
||||
@@ -410,9 +410,9 @@ void ext4_free_group_clusters_set(struct super_block *sb,
|
||||
void ext4_free_inodes_set(struct super_block *sb,
|
||||
struct ext4_group_desc *bg, __u32 count)
|
||||
{
|
||||
bg->bg_free_inodes_count_lo = cpu_to_le16((__u16)count);
|
||||
WRITE_ONCE(bg->bg_free_inodes_count_lo, cpu_to_le16((__u16)count));
|
||||
if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT)
|
||||
bg->bg_free_inodes_count_hi = cpu_to_le16(count >> 16);
|
||||
WRITE_ONCE(bg->bg_free_inodes_count_hi, cpu_to_le16(count >> 16));
|
||||
}
|
||||
|
||||
void ext4_used_dirs_set(struct super_block *sb,
|
||||
|
||||
@@ -155,11 +155,9 @@ struct nfsd_file *nfs_open_local_fh(nfs_uuid_t *uuid,
|
||||
/* We have an implied reference to net thanks to nfsd_serv_try_get */
|
||||
localio = nfs_to->nfsd_open_local_fh(net, uuid->dom, rpc_clnt,
|
||||
cred, nfs_fh, fmode);
|
||||
if (IS_ERR(localio)) {
|
||||
rcu_read_lock();
|
||||
nfs_to->nfsd_serv_put(net);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
if (IS_ERR(localio))
|
||||
nfs_to_nfsd_net_put(net);
|
||||
|
||||
return localio;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_open_local_fh);
|
||||
|
||||
+25
-6
@@ -40,15 +40,24 @@
|
||||
#define EXPKEY_HASHMAX (1 << EXPKEY_HASHBITS)
|
||||
#define EXPKEY_HASHMASK (EXPKEY_HASHMAX -1)
|
||||
|
||||
static void expkey_put(struct kref *ref)
|
||||
static void expkey_put_work(struct work_struct *work)
|
||||
{
|
||||
struct svc_expkey *key = container_of(ref, struct svc_expkey, h.ref);
|
||||
struct svc_expkey *key =
|
||||
container_of(to_rcu_work(work), struct svc_expkey, ek_rcu_work);
|
||||
|
||||
if (test_bit(CACHE_VALID, &key->h.flags) &&
|
||||
!test_bit(CACHE_NEGATIVE, &key->h.flags))
|
||||
path_put(&key->ek_path);
|
||||
auth_domain_put(key->ek_client);
|
||||
kfree_rcu(key, ek_rcu);
|
||||
kfree(key);
|
||||
}
|
||||
|
||||
static void expkey_put(struct kref *ref)
|
||||
{
|
||||
struct svc_expkey *key = container_of(ref, struct svc_expkey, h.ref);
|
||||
|
||||
INIT_RCU_WORK(&key->ek_rcu_work, expkey_put_work);
|
||||
queue_rcu_work(system_wq, &key->ek_rcu_work);
|
||||
}
|
||||
|
||||
static int expkey_upcall(struct cache_detail *cd, struct cache_head *h)
|
||||
@@ -355,16 +364,26 @@ static void export_stats_destroy(struct export_stats *stats)
|
||||
EXP_STATS_COUNTERS_NUM);
|
||||
}
|
||||
|
||||
static void svc_export_put(struct kref *ref)
|
||||
static void svc_export_put_work(struct work_struct *work)
|
||||
{
|
||||
struct svc_export *exp = container_of(ref, struct svc_export, h.ref);
|
||||
struct svc_export *exp =
|
||||
container_of(to_rcu_work(work), struct svc_export, ex_rcu_work);
|
||||
|
||||
path_put(&exp->ex_path);
|
||||
auth_domain_put(exp->ex_client);
|
||||
nfsd4_fslocs_free(&exp->ex_fslocs);
|
||||
export_stats_destroy(exp->ex_stats);
|
||||
kfree(exp->ex_stats);
|
||||
kfree(exp->ex_uuid);
|
||||
kfree_rcu(exp, ex_rcu);
|
||||
kfree(exp);
|
||||
}
|
||||
|
||||
static void svc_export_put(struct kref *ref)
|
||||
{
|
||||
struct svc_export *exp = container_of(ref, struct svc_export, h.ref);
|
||||
|
||||
INIT_RCU_WORK(&exp->ex_rcu_work, svc_export_put_work);
|
||||
queue_rcu_work(system_wq, &exp->ex_rcu_work);
|
||||
}
|
||||
|
||||
static int svc_export_upcall(struct cache_detail *cd, struct cache_head *h)
|
||||
|
||||
+2
-2
@@ -75,7 +75,7 @@ struct svc_export {
|
||||
u32 ex_layout_types;
|
||||
struct nfsd4_deviceid_map *ex_devid_map;
|
||||
struct cache_detail *cd;
|
||||
struct rcu_head ex_rcu;
|
||||
struct rcu_work ex_rcu_work;
|
||||
unsigned long ex_xprtsec_modes;
|
||||
struct export_stats *ex_stats;
|
||||
};
|
||||
@@ -92,7 +92,7 @@ struct svc_expkey {
|
||||
u32 ek_fsid[6];
|
||||
|
||||
struct path ek_path;
|
||||
struct rcu_head ek_rcu;
|
||||
struct rcu_work ek_rcu_work;
|
||||
};
|
||||
|
||||
#define EX_ISSYNC(exp) (!((exp)->ex_flags & NFSEXP_ASYNC))
|
||||
|
||||
+7
-7
@@ -391,19 +391,19 @@ nfsd_file_put(struct nfsd_file *nf)
|
||||
}
|
||||
|
||||
/**
|
||||
* nfsd_file_put_local - put the reference to nfsd_file and local nfsd_serv
|
||||
* @nf: nfsd_file of which to put the references
|
||||
* nfsd_file_put_local - put nfsd_file reference and arm nfsd_serv_put in caller
|
||||
* @nf: nfsd_file of which to put the reference
|
||||
*
|
||||
* First put the reference of the nfsd_file and then put the
|
||||
* reference to the associated nn->nfsd_serv.
|
||||
* First save the associated net to return to caller, then put
|
||||
* the reference of the nfsd_file.
|
||||
*/
|
||||
void
|
||||
nfsd_file_put_local(struct nfsd_file *nf) __must_hold(rcu)
|
||||
struct net *
|
||||
nfsd_file_put_local(struct nfsd_file *nf)
|
||||
{
|
||||
struct net *net = nf->nf_net;
|
||||
|
||||
nfsd_file_put(nf);
|
||||
nfsd_serv_put(net);
|
||||
return net;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -55,7 +55,7 @@ void nfsd_file_cache_shutdown(void);
|
||||
int nfsd_file_cache_start_net(struct net *net);
|
||||
void nfsd_file_cache_shutdown_net(struct net *net);
|
||||
void nfsd_file_put(struct nfsd_file *nf);
|
||||
void nfsd_file_put_local(struct nfsd_file *nf);
|
||||
struct net *nfsd_file_put_local(struct nfsd_file *nf);
|
||||
struct nfsd_file *nfsd_file_get(struct nfsd_file *nf);
|
||||
struct file *nfsd_file_file(struct nfsd_file *nf);
|
||||
void nfsd_file_close_inode_sync(struct inode *inode);
|
||||
|
||||
@@ -1461,6 +1461,8 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb)
|
||||
ses = c->cn_session;
|
||||
}
|
||||
spin_unlock(&clp->cl_lock);
|
||||
if (!c)
|
||||
return;
|
||||
|
||||
err = setup_callback_client(clp, &conn, ses);
|
||||
if (err) {
|
||||
|
||||
+5
-2
@@ -1292,7 +1292,7 @@ static void nfsd4_stop_copy(struct nfsd4_copy *copy)
|
||||
nfs4_put_copy(copy);
|
||||
}
|
||||
|
||||
static struct nfsd4_copy *nfsd4_get_copy(struct nfs4_client *clp)
|
||||
static struct nfsd4_copy *nfsd4_unhash_copy(struct nfs4_client *clp)
|
||||
{
|
||||
struct nfsd4_copy *copy = NULL;
|
||||
|
||||
@@ -1301,6 +1301,9 @@ static struct nfsd4_copy *nfsd4_get_copy(struct nfs4_client *clp)
|
||||
copy = list_first_entry(&clp->async_copies, struct nfsd4_copy,
|
||||
copies);
|
||||
refcount_inc(©->refcount);
|
||||
copy->cp_clp = NULL;
|
||||
if (!list_empty(©->copies))
|
||||
list_del_init(©->copies);
|
||||
}
|
||||
spin_unlock(&clp->async_lock);
|
||||
return copy;
|
||||
@@ -1310,7 +1313,7 @@ void nfsd4_shutdown_copy(struct nfs4_client *clp)
|
||||
{
|
||||
struct nfsd4_copy *copy;
|
||||
|
||||
while ((copy = nfsd4_get_copy(clp)) != NULL)
|
||||
while ((copy = nfsd4_unhash_copy(clp)) != NULL)
|
||||
nfsd4_stop_copy(copy);
|
||||
}
|
||||
#ifdef CONFIG_NFSD_V4_2_INTER_SSC
|
||||
|
||||
@@ -659,7 +659,8 @@ nfs4_reset_recoverydir(char *recdir)
|
||||
return status;
|
||||
status = -ENOTDIR;
|
||||
if (d_is_dir(path.dentry)) {
|
||||
strcpy(user_recovery_dirname, recdir);
|
||||
strscpy(user_recovery_dirname, recdir,
|
||||
sizeof(user_recovery_dirname));
|
||||
status = 0;
|
||||
}
|
||||
path_put(&path);
|
||||
|
||||
+1
-1
@@ -222,7 +222,7 @@ static int ntfs_extend_initialized_size(struct file *file,
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
folio_zero_range(folio, zerofrom, folio_size(folio));
|
||||
folio_zero_range(folio, zerofrom, folio_size(folio) - zerofrom);
|
||||
|
||||
err = ntfs_write_end(file, mapping, pos, len, len, folio, NULL);
|
||||
if (err < 0)
|
||||
|
||||
@@ -546,10 +546,14 @@ xfs_can_free_eofblocks(
|
||||
return false;
|
||||
|
||||
/*
|
||||
* Check if there is an post-EOF extent to free.
|
||||
* Check if there is an post-EOF extent to free. If there are any
|
||||
* delalloc blocks attached to the inode (data fork delalloc
|
||||
* reservations or CoW extents of any kind), we need to free them so
|
||||
* that inactivation doesn't fail to erase them.
|
||||
*/
|
||||
xfs_ilock(ip, XFS_ILOCK_SHARED);
|
||||
if (xfs_iext_lookup_extent(ip, &ip->i_df, end_fsb, &icur, &imap))
|
||||
if (ip->i_delayed_blks ||
|
||||
xfs_iext_lookup_extent(ip, &ip->i_df, end_fsb, &icur, &imap))
|
||||
found_blocks = true;
|
||||
xfs_iunlock(ip, XFS_ILOCK_SHARED);
|
||||
return found_blocks;
|
||||
|
||||
@@ -55,7 +55,7 @@ struct nfsd_localio_operations {
|
||||
const struct cred *,
|
||||
const struct nfs_fh *,
|
||||
const fmode_t);
|
||||
void (*nfsd_file_put_local)(struct nfsd_file *);
|
||||
struct net *(*nfsd_file_put_local)(struct nfsd_file *);
|
||||
struct file *(*nfsd_file_file)(struct nfsd_file *);
|
||||
} ____cacheline_aligned;
|
||||
|
||||
@@ -66,7 +66,7 @@ struct nfsd_file *nfs_open_local_fh(nfs_uuid_t *,
|
||||
struct rpc_clnt *, const struct cred *,
|
||||
const struct nfs_fh *, const fmode_t);
|
||||
|
||||
static inline void nfs_to_nfsd_file_put_local(struct nfsd_file *localio)
|
||||
static inline void nfs_to_nfsd_net_put(struct net *net)
|
||||
{
|
||||
/*
|
||||
* Once reference to nfsd_serv is dropped, NFSD could be
|
||||
@@ -74,10 +74,22 @@ static inline void nfs_to_nfsd_file_put_local(struct nfsd_file *localio)
|
||||
* by always taking RCU.
|
||||
*/
|
||||
rcu_read_lock();
|
||||
nfs_to->nfsd_file_put_local(localio);
|
||||
nfs_to->nfsd_serv_put(net);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static inline void nfs_to_nfsd_file_put_local(struct nfsd_file *localio)
|
||||
{
|
||||
/*
|
||||
* Must not hold RCU otherwise nfsd_file_put() can easily trigger:
|
||||
* "Voluntary context switch within RCU read-side critical section!"
|
||||
* by scheduling deep in underlying filesystem (e.g. XFS).
|
||||
*/
|
||||
struct net *net = nfs_to->nfsd_file_put_local(localio);
|
||||
|
||||
nfs_to_nfsd_net_put(net);
|
||||
}
|
||||
|
||||
#else /* CONFIG_NFS_LOCALIO */
|
||||
static inline void nfsd_localio_ops_init(void)
|
||||
{
|
||||
|
||||
+27
-11
@@ -1317,7 +1317,8 @@ static void mgmt_set_powered_complete(struct hci_dev *hdev, void *data, int err)
|
||||
struct mgmt_mode *cp;
|
||||
|
||||
/* Make sure cmd still outstanding. */
|
||||
if (cmd != pending_find(MGMT_OP_SET_POWERED, hdev))
|
||||
if (err == -ECANCELED ||
|
||||
cmd != pending_find(MGMT_OP_SET_POWERED, hdev))
|
||||
return;
|
||||
|
||||
cp = cmd->param;
|
||||
@@ -1350,7 +1351,13 @@ static void mgmt_set_powered_complete(struct hci_dev *hdev, void *data, int err)
|
||||
static int set_powered_sync(struct hci_dev *hdev, void *data)
|
||||
{
|
||||
struct mgmt_pending_cmd *cmd = data;
|
||||
struct mgmt_mode *cp = cmd->param;
|
||||
struct mgmt_mode *cp;
|
||||
|
||||
/* Make sure cmd still outstanding. */
|
||||
if (cmd != pending_find(MGMT_OP_SET_POWERED, hdev))
|
||||
return -ECANCELED;
|
||||
|
||||
cp = cmd->param;
|
||||
|
||||
BT_DBG("%s", hdev->name);
|
||||
|
||||
@@ -1510,7 +1517,8 @@ static void mgmt_set_discoverable_complete(struct hci_dev *hdev, void *data,
|
||||
bt_dev_dbg(hdev, "err %d", err);
|
||||
|
||||
/* Make sure cmd still outstanding. */
|
||||
if (cmd != pending_find(MGMT_OP_SET_DISCOVERABLE, hdev))
|
||||
if (err == -ECANCELED ||
|
||||
cmd != pending_find(MGMT_OP_SET_DISCOVERABLE, hdev))
|
||||
return;
|
||||
|
||||
hci_dev_lock(hdev);
|
||||
@@ -1684,7 +1692,8 @@ static void mgmt_set_connectable_complete(struct hci_dev *hdev, void *data,
|
||||
bt_dev_dbg(hdev, "err %d", err);
|
||||
|
||||
/* Make sure cmd still outstanding. */
|
||||
if (cmd != pending_find(MGMT_OP_SET_CONNECTABLE, hdev))
|
||||
if (err == -ECANCELED ||
|
||||
cmd != pending_find(MGMT_OP_SET_CONNECTABLE, hdev))
|
||||
return;
|
||||
|
||||
hci_dev_lock(hdev);
|
||||
@@ -1916,7 +1925,7 @@ static void set_ssp_complete(struct hci_dev *hdev, void *data, int err)
|
||||
bool changed;
|
||||
|
||||
/* Make sure cmd still outstanding. */
|
||||
if (cmd != pending_find(MGMT_OP_SET_SSP, hdev))
|
||||
if (err == -ECANCELED || cmd != pending_find(MGMT_OP_SET_SSP, hdev))
|
||||
return;
|
||||
|
||||
if (err) {
|
||||
@@ -3782,7 +3791,8 @@ static void set_name_complete(struct hci_dev *hdev, void *data, int err)
|
||||
|
||||
bt_dev_dbg(hdev, "err %d", err);
|
||||
|
||||
if (cmd != pending_find(MGMT_OP_SET_LOCAL_NAME, hdev))
|
||||
if (err == -ECANCELED ||
|
||||
cmd != pending_find(MGMT_OP_SET_LOCAL_NAME, hdev))
|
||||
return;
|
||||
|
||||
if (status) {
|
||||
@@ -3957,7 +3967,8 @@ static void set_default_phy_complete(struct hci_dev *hdev, void *data, int err)
|
||||
struct sk_buff *skb = cmd->skb;
|
||||
u8 status = mgmt_status(err);
|
||||
|
||||
if (cmd != pending_find(MGMT_OP_SET_PHY_CONFIGURATION, hdev))
|
||||
if (err == -ECANCELED ||
|
||||
cmd != pending_find(MGMT_OP_SET_PHY_CONFIGURATION, hdev))
|
||||
return;
|
||||
|
||||
if (!status) {
|
||||
@@ -5848,13 +5859,16 @@ static void start_discovery_complete(struct hci_dev *hdev, void *data, int err)
|
||||
{
|
||||
struct mgmt_pending_cmd *cmd = data;
|
||||
|
||||
bt_dev_dbg(hdev, "err %d", err);
|
||||
|
||||
if (err == -ECANCELED)
|
||||
return;
|
||||
|
||||
if (cmd != pending_find(MGMT_OP_START_DISCOVERY, hdev) &&
|
||||
cmd != pending_find(MGMT_OP_START_LIMITED_DISCOVERY, hdev) &&
|
||||
cmd != pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev))
|
||||
return;
|
||||
|
||||
bt_dev_dbg(hdev, "err %d", err);
|
||||
|
||||
mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err),
|
||||
cmd->param, 1);
|
||||
mgmt_pending_remove(cmd);
|
||||
@@ -6087,7 +6101,8 @@ static void stop_discovery_complete(struct hci_dev *hdev, void *data, int err)
|
||||
{
|
||||
struct mgmt_pending_cmd *cmd = data;
|
||||
|
||||
if (cmd != pending_find(MGMT_OP_STOP_DISCOVERY, hdev))
|
||||
if (err == -ECANCELED ||
|
||||
cmd != pending_find(MGMT_OP_STOP_DISCOVERY, hdev))
|
||||
return;
|
||||
|
||||
bt_dev_dbg(hdev, "err %d", err);
|
||||
@@ -8078,7 +8093,8 @@ static void read_local_oob_ext_data_complete(struct hci_dev *hdev, void *data,
|
||||
u8 status = mgmt_status(err);
|
||||
u16 eir_len;
|
||||
|
||||
if (cmd != pending_find(MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev))
|
||||
if (err == -ECANCELED ||
|
||||
cmd != pending_find(MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev))
|
||||
return;
|
||||
|
||||
if (!status) {
|
||||
|
||||
@@ -268,6 +268,8 @@ static struct sk_buff *hsr_init_skb(struct hsr_port *master)
|
||||
skb->dev = master->dev;
|
||||
skb->priority = TC_PRIO_CONTROL;
|
||||
|
||||
skb_reset_network_header(skb);
|
||||
skb_reset_transport_header(skb);
|
||||
if (dev_hard_header(skb, skb->dev, ETH_P_PRP,
|
||||
hsr->sup_multicast_addr,
|
||||
skb->dev->dev_addr, skb->len) <= 0)
|
||||
@@ -275,8 +277,6 @@ static struct sk_buff *hsr_init_skb(struct hsr_port *master)
|
||||
|
||||
skb_reset_mac_header(skb);
|
||||
skb_reset_mac_len(skb);
|
||||
skb_reset_network_header(skb);
|
||||
skb_reset_transport_header(skb);
|
||||
|
||||
return skb;
|
||||
out:
|
||||
|
||||
@@ -1189,7 +1189,7 @@ no_ownership:
|
||||
|
||||
drop:
|
||||
__inet_csk_reqsk_queue_drop(sk_listener, oreq, true);
|
||||
reqsk_put(req);
|
||||
reqsk_put(oreq);
|
||||
}
|
||||
|
||||
static bool reqsk_queue_hash_req(struct request_sock *req,
|
||||
|
||||
+30
-14
@@ -137,7 +137,7 @@ static struct mr_table *ipmr_mr_table_iter(struct net *net,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct mr_table *ipmr_get_table(struct net *net, u32 id)
|
||||
static struct mr_table *__ipmr_get_table(struct net *net, u32 id)
|
||||
{
|
||||
struct mr_table *mrt;
|
||||
|
||||
@@ -148,6 +148,16 @@ static struct mr_table *ipmr_get_table(struct net *net, u32 id)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct mr_table *ipmr_get_table(struct net *net, u32 id)
|
||||
{
|
||||
struct mr_table *mrt;
|
||||
|
||||
rcu_read_lock();
|
||||
mrt = __ipmr_get_table(net, id);
|
||||
rcu_read_unlock();
|
||||
return mrt;
|
||||
}
|
||||
|
||||
static int ipmr_fib_lookup(struct net *net, struct flowi4 *flp4,
|
||||
struct mr_table **mrt)
|
||||
{
|
||||
@@ -189,7 +199,7 @@ static int ipmr_rule_action(struct fib_rule *rule, struct flowi *flp,
|
||||
|
||||
arg->table = fib_rule_get_table(rule, arg);
|
||||
|
||||
mrt = ipmr_get_table(rule->fr_net, arg->table);
|
||||
mrt = __ipmr_get_table(rule->fr_net, arg->table);
|
||||
if (!mrt)
|
||||
return -EAGAIN;
|
||||
res->mrt = mrt;
|
||||
@@ -315,6 +325,8 @@ static struct mr_table *ipmr_get_table(struct net *net, u32 id)
|
||||
return net->ipv4.mrt;
|
||||
}
|
||||
|
||||
#define __ipmr_get_table ipmr_get_table
|
||||
|
||||
static int ipmr_fib_lookup(struct net *net, struct flowi4 *flp4,
|
||||
struct mr_table **mrt)
|
||||
{
|
||||
@@ -403,7 +415,7 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id)
|
||||
if (id != RT_TABLE_DEFAULT && id >= 1000000000)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
mrt = ipmr_get_table(net, id);
|
||||
mrt = __ipmr_get_table(net, id);
|
||||
if (mrt)
|
||||
return mrt;
|
||||
|
||||
@@ -1374,7 +1386,7 @@ int ip_mroute_setsockopt(struct sock *sk, int optname, sockptr_t optval,
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
mrt = ipmr_get_table(net, raw_sk(sk)->ipmr_table ? : RT_TABLE_DEFAULT);
|
||||
mrt = __ipmr_get_table(net, raw_sk(sk)->ipmr_table ? : RT_TABLE_DEFAULT);
|
||||
if (!mrt) {
|
||||
ret = -ENOENT;
|
||||
goto out_unlock;
|
||||
@@ -2262,11 +2274,13 @@ int ipmr_get_route(struct net *net, struct sk_buff *skb,
|
||||
struct mr_table *mrt;
|
||||
int err;
|
||||
|
||||
mrt = ipmr_get_table(net, RT_TABLE_DEFAULT);
|
||||
if (!mrt)
|
||||
return -ENOENT;
|
||||
|
||||
rcu_read_lock();
|
||||
mrt = __ipmr_get_table(net, RT_TABLE_DEFAULT);
|
||||
if (!mrt) {
|
||||
rcu_read_unlock();
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
cache = ipmr_cache_find(mrt, saddr, daddr);
|
||||
if (!cache && skb->dev) {
|
||||
int vif = ipmr_find_vif(mrt, skb->dev);
|
||||
@@ -2550,7 +2564,7 @@ static int ipmr_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
|
||||
grp = tb[RTA_DST] ? nla_get_in_addr(tb[RTA_DST]) : 0;
|
||||
tableid = tb[RTA_TABLE] ? nla_get_u32(tb[RTA_TABLE]) : 0;
|
||||
|
||||
mrt = ipmr_get_table(net, tableid ? tableid : RT_TABLE_DEFAULT);
|
||||
mrt = __ipmr_get_table(net, tableid ? tableid : RT_TABLE_DEFAULT);
|
||||
if (!mrt) {
|
||||
err = -ENOENT;
|
||||
goto errout_free;
|
||||
@@ -2604,7 +2618,7 @@ static int ipmr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
if (filter.table_id) {
|
||||
struct mr_table *mrt;
|
||||
|
||||
mrt = ipmr_get_table(sock_net(skb->sk), filter.table_id);
|
||||
mrt = __ipmr_get_table(sock_net(skb->sk), filter.table_id);
|
||||
if (!mrt) {
|
||||
if (rtnl_msg_family(cb->nlh) != RTNL_FAMILY_IPMR)
|
||||
return skb->len;
|
||||
@@ -2712,7 +2726,7 @@ static int rtm_to_ipmr_mfcc(struct net *net, struct nlmsghdr *nlh,
|
||||
break;
|
||||
}
|
||||
}
|
||||
mrt = ipmr_get_table(net, tblid);
|
||||
mrt = __ipmr_get_table(net, tblid);
|
||||
if (!mrt) {
|
||||
ret = -ENOENT;
|
||||
goto out;
|
||||
@@ -2920,13 +2934,15 @@ static void *ipmr_vif_seq_start(struct seq_file *seq, loff_t *pos)
|
||||
struct net *net = seq_file_net(seq);
|
||||
struct mr_table *mrt;
|
||||
|
||||
mrt = ipmr_get_table(net, RT_TABLE_DEFAULT);
|
||||
if (!mrt)
|
||||
rcu_read_lock();
|
||||
mrt = __ipmr_get_table(net, RT_TABLE_DEFAULT);
|
||||
if (!mrt) {
|
||||
rcu_read_unlock();
|
||||
return ERR_PTR(-ENOENT);
|
||||
}
|
||||
|
||||
iter->mrt = mrt;
|
||||
|
||||
rcu_read_lock();
|
||||
return mr_vif_seq_start(seq, pos);
|
||||
}
|
||||
|
||||
|
||||
+29
-12
@@ -2592,6 +2592,24 @@ static struct inet6_dev *addrconf_add_dev(struct net_device *dev)
|
||||
return idev;
|
||||
}
|
||||
|
||||
static void delete_tempaddrs(struct inet6_dev *idev,
|
||||
struct inet6_ifaddr *ifp)
|
||||
{
|
||||
struct inet6_ifaddr *ift, *tmp;
|
||||
|
||||
write_lock_bh(&idev->lock);
|
||||
list_for_each_entry_safe(ift, tmp, &idev->tempaddr_list, tmp_list) {
|
||||
if (ift->ifpub != ifp)
|
||||
continue;
|
||||
|
||||
in6_ifa_hold(ift);
|
||||
write_unlock_bh(&idev->lock);
|
||||
ipv6_del_addr(ift);
|
||||
write_lock_bh(&idev->lock);
|
||||
}
|
||||
write_unlock_bh(&idev->lock);
|
||||
}
|
||||
|
||||
static void manage_tempaddrs(struct inet6_dev *idev,
|
||||
struct inet6_ifaddr *ifp,
|
||||
__u32 valid_lft, __u32 prefered_lft,
|
||||
@@ -3146,11 +3164,12 @@ static int inet6_addr_del(struct net *net, int ifindex, u32 ifa_flags,
|
||||
in6_ifa_hold(ifp);
|
||||
read_unlock_bh(&idev->lock);
|
||||
|
||||
if (!(ifp->flags & IFA_F_TEMPORARY) &&
|
||||
(ifa_flags & IFA_F_MANAGETEMPADDR))
|
||||
manage_tempaddrs(idev, ifp, 0, 0, false,
|
||||
jiffies);
|
||||
ipv6_del_addr(ifp);
|
||||
|
||||
if (!(ifp->flags & IFA_F_TEMPORARY) &&
|
||||
(ifp->flags & IFA_F_MANAGETEMPADDR))
|
||||
delete_tempaddrs(idev, ifp);
|
||||
|
||||
addrconf_verify_rtnl(net);
|
||||
if (ipv6_addr_is_multicast(pfx)) {
|
||||
ipv6_mc_config(net->ipv6.mc_autojoin_sk,
|
||||
@@ -4974,14 +4993,12 @@ static int inet6_addr_modify(struct net *net, struct inet6_ifaddr *ifp,
|
||||
}
|
||||
|
||||
if (was_managetempaddr || ifp->flags & IFA_F_MANAGETEMPADDR) {
|
||||
if (was_managetempaddr &&
|
||||
!(ifp->flags & IFA_F_MANAGETEMPADDR)) {
|
||||
cfg->valid_lft = 0;
|
||||
cfg->preferred_lft = 0;
|
||||
}
|
||||
manage_tempaddrs(ifp->idev, ifp, cfg->valid_lft,
|
||||
cfg->preferred_lft, !was_managetempaddr,
|
||||
jiffies);
|
||||
if (was_managetempaddr && !(ifp->flags & IFA_F_MANAGETEMPADDR))
|
||||
delete_tempaddrs(ifp->idev, ifp);
|
||||
else
|
||||
manage_tempaddrs(ifp->idev, ifp, cfg->valid_lft,
|
||||
cfg->preferred_lft, !was_managetempaddr,
|
||||
jiffies);
|
||||
}
|
||||
|
||||
addrconf_verify_rtnl(net);
|
||||
|
||||
+28
-12
@@ -125,7 +125,7 @@ static struct mr_table *ip6mr_mr_table_iter(struct net *net,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct mr_table *ip6mr_get_table(struct net *net, u32 id)
|
||||
static struct mr_table *__ip6mr_get_table(struct net *net, u32 id)
|
||||
{
|
||||
struct mr_table *mrt;
|
||||
|
||||
@@ -136,6 +136,16 @@ static struct mr_table *ip6mr_get_table(struct net *net, u32 id)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct mr_table *ip6mr_get_table(struct net *net, u32 id)
|
||||
{
|
||||
struct mr_table *mrt;
|
||||
|
||||
rcu_read_lock();
|
||||
mrt = __ip6mr_get_table(net, id);
|
||||
rcu_read_unlock();
|
||||
return mrt;
|
||||
}
|
||||
|
||||
static int ip6mr_fib_lookup(struct net *net, struct flowi6 *flp6,
|
||||
struct mr_table **mrt)
|
||||
{
|
||||
@@ -177,7 +187,7 @@ static int ip6mr_rule_action(struct fib_rule *rule, struct flowi *flp,
|
||||
|
||||
arg->table = fib_rule_get_table(rule, arg);
|
||||
|
||||
mrt = ip6mr_get_table(rule->fr_net, arg->table);
|
||||
mrt = __ip6mr_get_table(rule->fr_net, arg->table);
|
||||
if (!mrt)
|
||||
return -EAGAIN;
|
||||
res->mrt = mrt;
|
||||
@@ -304,6 +314,8 @@ static struct mr_table *ip6mr_get_table(struct net *net, u32 id)
|
||||
return net->ipv6.mrt6;
|
||||
}
|
||||
|
||||
#define __ip6mr_get_table ip6mr_get_table
|
||||
|
||||
static int ip6mr_fib_lookup(struct net *net, struct flowi6 *flp6,
|
||||
struct mr_table **mrt)
|
||||
{
|
||||
@@ -382,7 +394,7 @@ static struct mr_table *ip6mr_new_table(struct net *net, u32 id)
|
||||
{
|
||||
struct mr_table *mrt;
|
||||
|
||||
mrt = ip6mr_get_table(net, id);
|
||||
mrt = __ip6mr_get_table(net, id);
|
||||
if (mrt)
|
||||
return mrt;
|
||||
|
||||
@@ -411,13 +423,15 @@ static void *ip6mr_vif_seq_start(struct seq_file *seq, loff_t *pos)
|
||||
struct net *net = seq_file_net(seq);
|
||||
struct mr_table *mrt;
|
||||
|
||||
mrt = ip6mr_get_table(net, RT6_TABLE_DFLT);
|
||||
if (!mrt)
|
||||
rcu_read_lock();
|
||||
mrt = __ip6mr_get_table(net, RT6_TABLE_DFLT);
|
||||
if (!mrt) {
|
||||
rcu_read_unlock();
|
||||
return ERR_PTR(-ENOENT);
|
||||
}
|
||||
|
||||
iter->mrt = mrt;
|
||||
|
||||
rcu_read_lock();
|
||||
return mr_vif_seq_start(seq, pos);
|
||||
}
|
||||
|
||||
@@ -2275,11 +2289,13 @@ int ip6mr_get_route(struct net *net, struct sk_buff *skb, struct rtmsg *rtm,
|
||||
struct mfc6_cache *cache;
|
||||
struct rt6_info *rt = dst_rt6_info(skb_dst(skb));
|
||||
|
||||
mrt = ip6mr_get_table(net, RT6_TABLE_DFLT);
|
||||
if (!mrt)
|
||||
return -ENOENT;
|
||||
|
||||
rcu_read_lock();
|
||||
mrt = __ip6mr_get_table(net, RT6_TABLE_DFLT);
|
||||
if (!mrt) {
|
||||
rcu_read_unlock();
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
cache = ip6mr_cache_find(mrt, &rt->rt6i_src.addr, &rt->rt6i_dst.addr);
|
||||
if (!cache && skb->dev) {
|
||||
int vif = ip6mr_find_vif(mrt, skb->dev);
|
||||
@@ -2559,7 +2575,7 @@ static int ip6mr_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
|
||||
grp = nla_get_in6_addr(tb[RTA_DST]);
|
||||
tableid = tb[RTA_TABLE] ? nla_get_u32(tb[RTA_TABLE]) : 0;
|
||||
|
||||
mrt = ip6mr_get_table(net, tableid ?: RT_TABLE_DEFAULT);
|
||||
mrt = __ip6mr_get_table(net, tableid ?: RT_TABLE_DEFAULT);
|
||||
if (!mrt) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "MR table does not exist");
|
||||
return -ENOENT;
|
||||
@@ -2606,7 +2622,7 @@ static int ip6mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
if (filter.table_id) {
|
||||
struct mr_table *mrt;
|
||||
|
||||
mrt = ip6mr_get_table(sock_net(skb->sk), filter.table_id);
|
||||
mrt = __ip6mr_get_table(sock_net(skb->sk), filter.table_id);
|
||||
if (!mrt) {
|
||||
if (rtnl_msg_family(cb->nlh) != RTNL_FAMILY_IP6MR)
|
||||
return skb->len;
|
||||
|
||||
+17
-9
@@ -1236,7 +1236,9 @@ static int iucv_sock_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* receive/dequeue next skb:
|
||||
* the function understands MSG_PEEK and, thus, does not dequeue skb */
|
||||
* the function understands MSG_PEEK and, thus, does not dequeue skb
|
||||
* only refcount is increased.
|
||||
*/
|
||||
skb = skb_recv_datagram(sk, flags, &err);
|
||||
if (!skb) {
|
||||
if (sk->sk_shutdown & RCV_SHUTDOWN)
|
||||
@@ -1252,9 +1254,8 @@ static int iucv_sock_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||
|
||||
cskb = skb;
|
||||
if (skb_copy_datagram_msg(cskb, offset, msg, copied)) {
|
||||
if (!(flags & MSG_PEEK))
|
||||
skb_queue_head(&sk->sk_receive_queue, skb);
|
||||
return -EFAULT;
|
||||
err = -EFAULT;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
/* SOCK_SEQPACKET: set MSG_TRUNC if recv buf size is too small */
|
||||
@@ -1271,11 +1272,8 @@ static int iucv_sock_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||
err = put_cmsg(msg, SOL_IUCV, SCM_IUCV_TRGCLS,
|
||||
sizeof(IUCV_SKB_CB(skb)->class),
|
||||
(void *)&IUCV_SKB_CB(skb)->class);
|
||||
if (err) {
|
||||
if (!(flags & MSG_PEEK))
|
||||
skb_queue_head(&sk->sk_receive_queue, skb);
|
||||
return err;
|
||||
}
|
||||
if (err)
|
||||
goto err_out;
|
||||
|
||||
/* Mark read part of skb as used */
|
||||
if (!(flags & MSG_PEEK)) {
|
||||
@@ -1331,8 +1329,18 @@ done:
|
||||
/* SOCK_SEQPACKET: return real length if MSG_TRUNC is set */
|
||||
if (sk->sk_type == SOCK_SEQPACKET && (flags & MSG_TRUNC))
|
||||
copied = rlen;
|
||||
if (flags & MSG_PEEK)
|
||||
skb_unref(skb);
|
||||
|
||||
return copied;
|
||||
|
||||
err_out:
|
||||
if (!(flags & MSG_PEEK))
|
||||
skb_queue_head(&sk->sk_receive_queue, skb);
|
||||
else
|
||||
skb_unref(skb);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static inline __poll_t iucv_accept_poll(struct sock *parent)
|
||||
|
||||
+19
-3
@@ -1870,15 +1870,31 @@ static __net_exit void l2tp_pre_exit_net(struct net *net)
|
||||
}
|
||||
}
|
||||
|
||||
static int l2tp_idr_item_unexpected(int id, void *p, void *data)
|
||||
{
|
||||
const char *idr_name = data;
|
||||
|
||||
pr_err("l2tp: %s IDR not empty at net %d exit\n", idr_name, id);
|
||||
WARN_ON_ONCE(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static __net_exit void l2tp_exit_net(struct net *net)
|
||||
{
|
||||
struct l2tp_net *pn = l2tp_pernet(net);
|
||||
|
||||
WARN_ON_ONCE(!idr_is_empty(&pn->l2tp_v2_session_idr));
|
||||
/* Our per-net IDRs should be empty. Check that is so, to
|
||||
* help catch cleanup races or refcnt leaks.
|
||||
*/
|
||||
idr_for_each(&pn->l2tp_v2_session_idr, l2tp_idr_item_unexpected,
|
||||
"v2_session");
|
||||
idr_for_each(&pn->l2tp_v3_session_idr, l2tp_idr_item_unexpected,
|
||||
"v3_session");
|
||||
idr_for_each(&pn->l2tp_tunnel_idr, l2tp_idr_item_unexpected,
|
||||
"tunnel");
|
||||
|
||||
idr_destroy(&pn->l2tp_v2_session_idr);
|
||||
WARN_ON_ONCE(!idr_is_empty(&pn->l2tp_v3_session_idr));
|
||||
idr_destroy(&pn->l2tp_v3_session_idr);
|
||||
WARN_ON_ONCE(!idr_is_empty(&pn->l2tp_tunnel_idr));
|
||||
idr_destroy(&pn->l2tp_tunnel_idr);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -1098,7 +1098,7 @@ static int llc_ui_setsockopt(struct socket *sock, int level, int optname,
|
||||
lock_sock(sk);
|
||||
if (unlikely(level != SOL_LLC || optlen != sizeof(int)))
|
||||
goto out;
|
||||
rc = copy_from_sockptr(&opt, optval, sizeof(opt));
|
||||
rc = copy_safe_from_sockptr(&opt, sizeof(opt), optval, optlen);
|
||||
if (rc)
|
||||
goto out;
|
||||
rc = -EINVAL;
|
||||
|
||||
+11
-10
@@ -2176,9 +2176,14 @@ netlink_ack_tlv_len(struct netlink_sock *nlk, int err,
|
||||
return tlvlen;
|
||||
}
|
||||
|
||||
static bool nlmsg_check_in_payload(const struct nlmsghdr *nlh, const void *addr)
|
||||
{
|
||||
return !WARN_ON(addr < nlmsg_data(nlh) ||
|
||||
addr - (const void *) nlh >= nlh->nlmsg_len);
|
||||
}
|
||||
|
||||
static void
|
||||
netlink_ack_tlv_fill(struct sk_buff *in_skb, struct sk_buff *skb,
|
||||
const struct nlmsghdr *nlh, int err,
|
||||
netlink_ack_tlv_fill(struct sk_buff *skb, const struct nlmsghdr *nlh, int err,
|
||||
const struct netlink_ext_ack *extack)
|
||||
{
|
||||
if (extack->_msg)
|
||||
@@ -2190,9 +2195,7 @@ netlink_ack_tlv_fill(struct sk_buff *in_skb, struct sk_buff *skb,
|
||||
if (!err)
|
||||
return;
|
||||
|
||||
if (extack->bad_attr &&
|
||||
!WARN_ON((u8 *)extack->bad_attr < in_skb->data ||
|
||||
(u8 *)extack->bad_attr >= in_skb->data + in_skb->len))
|
||||
if (extack->bad_attr && nlmsg_check_in_payload(nlh, extack->bad_attr))
|
||||
WARN_ON(nla_put_u32(skb, NLMSGERR_ATTR_OFFS,
|
||||
(u8 *)extack->bad_attr - (const u8 *)nlh));
|
||||
if (extack->policy)
|
||||
@@ -2201,9 +2204,7 @@ netlink_ack_tlv_fill(struct sk_buff *in_skb, struct sk_buff *skb,
|
||||
if (extack->miss_type)
|
||||
WARN_ON(nla_put_u32(skb, NLMSGERR_ATTR_MISS_TYPE,
|
||||
extack->miss_type));
|
||||
if (extack->miss_nest &&
|
||||
!WARN_ON((u8 *)extack->miss_nest < in_skb->data ||
|
||||
(u8 *)extack->miss_nest > in_skb->data + in_skb->len))
|
||||
if (extack->miss_nest && nlmsg_check_in_payload(nlh, extack->miss_nest))
|
||||
WARN_ON(nla_put_u32(skb, NLMSGERR_ATTR_MISS_NEST,
|
||||
(u8 *)extack->miss_nest - (const u8 *)nlh));
|
||||
}
|
||||
@@ -2232,7 +2233,7 @@ static int netlink_dump_done(struct netlink_sock *nlk, struct sk_buff *skb,
|
||||
if (extack_len) {
|
||||
nlh->nlmsg_flags |= NLM_F_ACK_TLVS;
|
||||
if (skb_tailroom(skb) >= extack_len) {
|
||||
netlink_ack_tlv_fill(cb->skb, skb, cb->nlh,
|
||||
netlink_ack_tlv_fill(skb, cb->nlh,
|
||||
nlk->dump_done_errno, extack);
|
||||
nlmsg_end(skb, nlh);
|
||||
}
|
||||
@@ -2491,7 +2492,7 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err,
|
||||
}
|
||||
|
||||
if (tlvlen)
|
||||
netlink_ack_tlv_fill(in_skb, skb, nlh, err, extack);
|
||||
netlink_ack_tlv_fill(skb, nlh, err, extack);
|
||||
|
||||
nlmsg_end(skb, rep);
|
||||
|
||||
|
||||
@@ -707,9 +707,10 @@ static int rxrpc_setsockopt(struct socket *sock, int level, int optname,
|
||||
ret = -EISCONN;
|
||||
if (rx->sk.sk_state != RXRPC_UNBOUND)
|
||||
goto error;
|
||||
ret = copy_from_sockptr(&min_sec_level, optval,
|
||||
sizeof(unsigned int));
|
||||
if (ret < 0)
|
||||
ret = copy_safe_from_sockptr(&min_sec_level,
|
||||
sizeof(min_sec_level),
|
||||
optval, optlen);
|
||||
if (ret)
|
||||
goto error;
|
||||
ret = -EINVAL;
|
||||
if (min_sec_level > RXRPC_SECURITY_MAX)
|
||||
|
||||
@@ -331,6 +331,12 @@ static bool fq_fastpath_check(const struct Qdisc *sch, struct sk_buff *skb,
|
||||
*/
|
||||
if (q->internal.qlen >= 8)
|
||||
return false;
|
||||
|
||||
/* Ordering invariants fall apart if some delayed flows
|
||||
* are ready but we haven't serviced them, yet.
|
||||
*/
|
||||
if (q->time_next_delayed_flow <= now)
|
||||
return false;
|
||||
}
|
||||
|
||||
sk = skb->sk;
|
||||
|
||||
@@ -233,25 +233,34 @@ static int svc_rdma_proc_init(void)
|
||||
|
||||
rc = percpu_counter_init(&svcrdma_stat_read, 0, GFP_KERNEL);
|
||||
if (rc)
|
||||
goto out_err;
|
||||
goto err;
|
||||
rc = percpu_counter_init(&svcrdma_stat_recv, 0, GFP_KERNEL);
|
||||
if (rc)
|
||||
goto out_err;
|
||||
goto err_read;
|
||||
rc = percpu_counter_init(&svcrdma_stat_sq_starve, 0, GFP_KERNEL);
|
||||
if (rc)
|
||||
goto out_err;
|
||||
goto err_recv;
|
||||
rc = percpu_counter_init(&svcrdma_stat_write, 0, GFP_KERNEL);
|
||||
if (rc)
|
||||
goto out_err;
|
||||
goto err_sq;
|
||||
|
||||
svcrdma_table_header = register_sysctl("sunrpc/svc_rdma",
|
||||
svcrdma_parm_table);
|
||||
if (!svcrdma_table_header)
|
||||
goto err_write;
|
||||
|
||||
return 0;
|
||||
|
||||
out_err:
|
||||
err_write:
|
||||
rc = -ENOMEM;
|
||||
percpu_counter_destroy(&svcrdma_stat_write);
|
||||
err_sq:
|
||||
percpu_counter_destroy(&svcrdma_stat_sq_starve);
|
||||
err_recv:
|
||||
percpu_counter_destroy(&svcrdma_stat_recv);
|
||||
err_read:
|
||||
percpu_counter_destroy(&svcrdma_stat_read);
|
||||
err:
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
@@ -96,6 +96,8 @@ static int audit_caps(struct apparmor_audit_data *ad, struct aa_profile *profile
|
||||
return error;
|
||||
} else {
|
||||
aa_put_profile(ent->profile);
|
||||
if (profile != ent->profile)
|
||||
cap_clear(ent->caps);
|
||||
ent->profile = aa_get_profile(profile);
|
||||
cap_raise(ent->caps, cap);
|
||||
}
|
||||
|
||||
@@ -172,6 +172,7 @@ static void test_format_fill_silence(struct kunit *test)
|
||||
u32 i, j;
|
||||
|
||||
buffer = kunit_kzalloc(test, SILENCE_BUFFER_SIZE, GFP_KERNEL);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buffer);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(buf_samples); i++) {
|
||||
for (j = 0; j < ARRAY_SIZE(valid_fmt); j++)
|
||||
@@ -208,8 +209,12 @@ static void test_playback_avail(struct kunit *test)
|
||||
struct snd_pcm_runtime *r = kunit_kzalloc(test, sizeof(*r), GFP_KERNEL);
|
||||
u32 i;
|
||||
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, r);
|
||||
|
||||
r->status = kunit_kzalloc(test, sizeof(*r->status), GFP_KERNEL);
|
||||
r->control = kunit_kzalloc(test, sizeof(*r->control), GFP_KERNEL);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, r->status);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, r->control);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(p_avail_data); i++) {
|
||||
r->buffer_size = p_avail_data[i].buffer_size;
|
||||
@@ -232,8 +237,12 @@ static void test_capture_avail(struct kunit *test)
|
||||
struct snd_pcm_runtime *r = kunit_kzalloc(test, sizeof(*r), GFP_KERNEL);
|
||||
u32 i;
|
||||
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, r);
|
||||
|
||||
r->status = kunit_kzalloc(test, sizeof(*r->status), GFP_KERNEL);
|
||||
r->control = kunit_kzalloc(test, sizeof(*r->control), GFP_KERNEL);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, r->status);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, r->control);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(c_avail_data); i++) {
|
||||
r->buffer_size = c_avail_data[i].buffer_size;
|
||||
@@ -247,6 +256,7 @@ static void test_capture_avail(struct kunit *test)
|
||||
static void test_card_set_id(struct kunit *test)
|
||||
{
|
||||
struct snd_card *card = kunit_kzalloc(test, sizeof(*card), GFP_KERNEL);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, card);
|
||||
|
||||
snd_card_set_id(card, VALID_NAME);
|
||||
KUNIT_EXPECT_STREQ(test, card->id, VALID_NAME);
|
||||
@@ -280,6 +290,7 @@ static void test_pcm_format_name(struct kunit *test)
|
||||
static void test_card_add_component(struct kunit *test)
|
||||
{
|
||||
struct snd_card *card = kunit_kzalloc(test, sizeof(*card), GFP_KERNEL);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, card);
|
||||
|
||||
snd_component_add(card, TEST_FIRST_COMPONENT);
|
||||
KUNIT_ASSERT_STREQ(test, card->components, TEST_FIRST_COMPONENT);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user