mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
Merge 6845376713 ("ARM: Spectre-BHB: provide empty stub for non-config") into android-mainline
Steps on the way to 5.17-rc8 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I3db0421bb0261efba4eb8f52a1e6a62aaaafed1b
This commit is contained in:
@@ -25,7 +25,13 @@ enum {
|
||||
SPECTRE_V2_METHOD_LOOP8 = BIT(__SPECTRE_V2_METHOD_LOOP8),
|
||||
};
|
||||
|
||||
#ifdef CONFIG_GENERIC_CPU_VULNERABILITIES
|
||||
void spectre_v2_update_state(unsigned int state, unsigned int methods);
|
||||
#else
|
||||
static inline void spectre_v2_update_state(unsigned int state,
|
||||
unsigned int methods)
|
||||
{}
|
||||
#endif
|
||||
|
||||
int spectre_bhb_update_vectors(unsigned int method);
|
||||
|
||||
|
||||
@@ -1040,9 +1040,9 @@ vector_bhb_loop8_\name:
|
||||
|
||||
@ bhb workaround
|
||||
mov r0, #8
|
||||
1: b . + 4
|
||||
3: b . + 4
|
||||
subs r0, r0, #1
|
||||
bne 1b
|
||||
bne 3b
|
||||
dsb
|
||||
isb
|
||||
b 2b
|
||||
|
||||
@@ -9,7 +9,7 @@ long soft_nmi_interrupt(struct pt_regs *regs);
|
||||
static inline void arch_touch_nmi_watchdog(void) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_NMI_IPI) && defined(CONFIG_STACKTRACE)
|
||||
#ifdef CONFIG_NMI_IPI
|
||||
extern void arch_trigger_cpumask_backtrace(const cpumask_t *mask,
|
||||
bool exclude_self);
|
||||
#define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace
|
||||
|
||||
@@ -2,6 +2,7 @@ menu "CPU errata selection"
|
||||
|
||||
config RISCV_ERRATA_ALTERNATIVE
|
||||
bool "RISC-V alternative scheme"
|
||||
depends on !XIP_KERNEL
|
||||
default y
|
||||
help
|
||||
This Kconfig allows the kernel to automatically patch the
|
||||
|
||||
@@ -14,8 +14,8 @@ config SOC_SIFIVE
|
||||
select CLK_SIFIVE
|
||||
select CLK_SIFIVE_PRCI
|
||||
select SIFIVE_PLIC
|
||||
select RISCV_ERRATA_ALTERNATIVE
|
||||
select ERRATA_SIFIVE
|
||||
select RISCV_ERRATA_ALTERNATIVE if !XIP_KERNEL
|
||||
select ERRATA_SIFIVE if !XIP_KERNEL
|
||||
help
|
||||
This enables support for SiFive SoC platform hardware.
|
||||
|
||||
|
||||
@@ -13,6 +13,19 @@
|
||||
#include <linux/pgtable.h>
|
||||
#include <asm/sections.h>
|
||||
|
||||
/*
|
||||
* The auipc+jalr instruction pair can reach any PC-relative offset
|
||||
* in the range [-2^31 - 2^11, 2^31 - 2^11)
|
||||
*/
|
||||
static bool riscv_insn_valid_32bit_offset(ptrdiff_t val)
|
||||
{
|
||||
#ifdef CONFIG_32BIT
|
||||
return true;
|
||||
#else
|
||||
return (-(1L << 31) - (1L << 11)) <= val && val < ((1L << 31) - (1L << 11));
|
||||
#endif
|
||||
}
|
||||
|
||||
static int apply_r_riscv_32_rela(struct module *me, u32 *location, Elf_Addr v)
|
||||
{
|
||||
if (v != (u32)v) {
|
||||
@@ -95,7 +108,7 @@ static int apply_r_riscv_pcrel_hi20_rela(struct module *me, u32 *location,
|
||||
ptrdiff_t offset = (void *)v - (void *)location;
|
||||
s32 hi20;
|
||||
|
||||
if (offset != (s32)offset) {
|
||||
if (!riscv_insn_valid_32bit_offset(offset)) {
|
||||
pr_err(
|
||||
"%s: target %016llx can not be addressed by the 32-bit offset from PC = %p\n",
|
||||
me->name, (long long)v, location);
|
||||
@@ -197,10 +210,9 @@ static int apply_r_riscv_call_plt_rela(struct module *me, u32 *location,
|
||||
Elf_Addr v)
|
||||
{
|
||||
ptrdiff_t offset = (void *)v - (void *)location;
|
||||
s32 fill_v = offset;
|
||||
u32 hi20, lo12;
|
||||
|
||||
if (offset != fill_v) {
|
||||
if (!riscv_insn_valid_32bit_offset(offset)) {
|
||||
/* Only emit the plt entry if offset over 32-bit range */
|
||||
if (IS_ENABLED(CONFIG_MODULE_SECTIONS)) {
|
||||
offset = module_emit_plt_entry(me, v);
|
||||
@@ -224,10 +236,9 @@ static int apply_r_riscv_call_rela(struct module *me, u32 *location,
|
||||
Elf_Addr v)
|
||||
{
|
||||
ptrdiff_t offset = (void *)v - (void *)location;
|
||||
s32 fill_v = offset;
|
||||
u32 hi20, lo12;
|
||||
|
||||
if (offset != fill_v) {
|
||||
if (!riscv_insn_valid_32bit_offset(offset)) {
|
||||
pr_err(
|
||||
"%s: target %016llx can not be addressed by the 32-bit offset from PC = %p\n",
|
||||
me->name, (long long)v, location);
|
||||
|
||||
@@ -2718,7 +2718,8 @@ static bool blk_mq_attempt_bio_merge(struct request_queue *q,
|
||||
|
||||
static struct request *blk_mq_get_new_requests(struct request_queue *q,
|
||||
struct blk_plug *plug,
|
||||
struct bio *bio)
|
||||
struct bio *bio,
|
||||
unsigned int nsegs)
|
||||
{
|
||||
struct blk_mq_alloc_data data = {
|
||||
.q = q,
|
||||
@@ -2730,6 +2731,11 @@ static struct request *blk_mq_get_new_requests(struct request_queue *q,
|
||||
if (unlikely(bio_queue_enter(bio)))
|
||||
return NULL;
|
||||
|
||||
if (blk_mq_attempt_bio_merge(q, bio, nsegs))
|
||||
goto queue_exit;
|
||||
|
||||
rq_qos_throttle(q, bio);
|
||||
|
||||
if (plug) {
|
||||
data.nr_tags = plug->nr_ios;
|
||||
plug->nr_ios = 1;
|
||||
@@ -2742,12 +2748,13 @@ static struct request *blk_mq_get_new_requests(struct request_queue *q,
|
||||
rq_qos_cleanup(q, bio);
|
||||
if (bio->bi_opf & REQ_NOWAIT)
|
||||
bio_wouldblock_error(bio);
|
||||
queue_exit:
|
||||
blk_queue_exit(q);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct request *blk_mq_get_cached_request(struct request_queue *q,
|
||||
struct blk_plug *plug, struct bio *bio)
|
||||
struct blk_plug *plug, struct bio **bio, unsigned int nsegs)
|
||||
{
|
||||
struct request *rq;
|
||||
|
||||
@@ -2757,12 +2764,19 @@ static inline struct request *blk_mq_get_cached_request(struct request_queue *q,
|
||||
if (!rq || rq->q != q)
|
||||
return NULL;
|
||||
|
||||
if (blk_mq_get_hctx_type(bio->bi_opf) != rq->mq_hctx->type)
|
||||
if (blk_mq_attempt_bio_merge(q, *bio, nsegs)) {
|
||||
*bio = NULL;
|
||||
return NULL;
|
||||
if (op_is_flush(rq->cmd_flags) != op_is_flush(bio->bi_opf))
|
||||
}
|
||||
|
||||
rq_qos_throttle(q, *bio);
|
||||
|
||||
if (blk_mq_get_hctx_type((*bio)->bi_opf) != rq->mq_hctx->type)
|
||||
return NULL;
|
||||
if (op_is_flush(rq->cmd_flags) != op_is_flush((*bio)->bi_opf))
|
||||
return NULL;
|
||||
|
||||
rq->cmd_flags = bio->bi_opf;
|
||||
rq->cmd_flags = (*bio)->bi_opf;
|
||||
plug->cached_rq = rq_list_next(rq);
|
||||
INIT_LIST_HEAD(&rq->queuelist);
|
||||
return rq;
|
||||
@@ -2800,14 +2814,11 @@ void blk_mq_submit_bio(struct bio *bio)
|
||||
if (!bio_integrity_prep(bio))
|
||||
return;
|
||||
|
||||
if (blk_mq_attempt_bio_merge(q, bio, nr_segs))
|
||||
return;
|
||||
|
||||
rq_qos_throttle(q, bio);
|
||||
|
||||
rq = blk_mq_get_cached_request(q, plug, bio);
|
||||
rq = blk_mq_get_cached_request(q, plug, &bio, nr_segs);
|
||||
if (!rq) {
|
||||
rq = blk_mq_get_new_requests(q, plug, bio);
|
||||
if (!bio)
|
||||
return;
|
||||
rq = blk_mq_get_new_requests(q, plug, bio, nr_segs);
|
||||
if (unlikely(!rq))
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1406,6 +1406,13 @@ static inline u32 man_trk_ctl_single_full_frame_bit_get(struct drm_i915_private
|
||||
PSR2_MAN_TRK_CTL_SF_SINGLE_FULL_FRAME;
|
||||
}
|
||||
|
||||
static inline u32 man_trk_ctl_partial_frame_bit_get(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
return IS_ALDERLAKE_P(dev_priv) ?
|
||||
ADLP_PSR2_MAN_TRK_CTL_SF_PARTIAL_FRAME_UPDATE :
|
||||
PSR2_MAN_TRK_CTL_SF_PARTIAL_FRAME_UPDATE;
|
||||
}
|
||||
|
||||
static void psr_force_hw_tracking_exit(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
|
||||
@@ -1510,7 +1517,13 @@ static void psr2_man_trk_ctl_calc(struct intel_crtc_state *crtc_state,
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
u32 val = PSR2_MAN_TRK_CTL_ENABLE;
|
||||
u32 val = 0;
|
||||
|
||||
if (!IS_ALDERLAKE_P(dev_priv))
|
||||
val = PSR2_MAN_TRK_CTL_ENABLE;
|
||||
|
||||
/* SF partial frame enable has to be set even on full update */
|
||||
val |= man_trk_ctl_partial_frame_bit_get(dev_priv);
|
||||
|
||||
if (full_update) {
|
||||
/*
|
||||
@@ -1530,7 +1543,6 @@ static void psr2_man_trk_ctl_calc(struct intel_crtc_state *crtc_state,
|
||||
} else {
|
||||
drm_WARN_ON(crtc_state->uapi.crtc->dev, clip->y1 % 4 || clip->y2 % 4);
|
||||
|
||||
val |= PSR2_MAN_TRK_CTL_SF_PARTIAL_FRAME_UPDATE;
|
||||
val |= PSR2_MAN_TRK_CTL_SU_REGION_START_ADDR(clip->y1 / 4 + 1);
|
||||
val |= PSR2_MAN_TRK_CTL_SU_REGION_END_ADDR(clip->y2 / 4 + 1);
|
||||
}
|
||||
|
||||
@@ -4829,6 +4829,7 @@ enum {
|
||||
#define ADLP_PSR2_MAN_TRK_CTL_SU_REGION_START_ADDR(val) REG_FIELD_PREP(ADLP_PSR2_MAN_TRK_CTL_SU_REGION_START_ADDR_MASK, val)
|
||||
#define ADLP_PSR2_MAN_TRK_CTL_SU_REGION_END_ADDR_MASK REG_GENMASK(12, 0)
|
||||
#define ADLP_PSR2_MAN_TRK_CTL_SU_REGION_END_ADDR(val) REG_FIELD_PREP(ADLP_PSR2_MAN_TRK_CTL_SU_REGION_END_ADDR_MASK, val)
|
||||
#define ADLP_PSR2_MAN_TRK_CTL_SF_PARTIAL_FRAME_UPDATE REG_BIT(31)
|
||||
#define ADLP_PSR2_MAN_TRK_CTL_SF_SINGLE_FULL_FRAME REG_BIT(14)
|
||||
#define ADLP_PSR2_MAN_TRK_CTL_SF_CONTINUOS_FULL_FRAME REG_BIT(13)
|
||||
|
||||
|
||||
@@ -111,10 +111,10 @@
|
||||
/* format 13 is semi-planar YUV411 VUVU */
|
||||
#define SUN8I_MIXER_FBFMT_YUV411 14
|
||||
/* format 15 doesn't exist */
|
||||
/* format 16 is P010 YVU */
|
||||
#define SUN8I_MIXER_FBFMT_P010_YUV 17
|
||||
/* format 18 is P210 YVU */
|
||||
#define SUN8I_MIXER_FBFMT_P210_YUV 19
|
||||
#define SUN8I_MIXER_FBFMT_P010_YUV 16
|
||||
/* format 17 is P010 YVU */
|
||||
#define SUN8I_MIXER_FBFMT_P210_YUV 18
|
||||
/* format 19 is P210 YVU */
|
||||
/* format 20 is packed YVU444 10-bit */
|
||||
/* format 21 is packed YUV444 10-bit */
|
||||
|
||||
|
||||
@@ -2005,7 +2005,11 @@ setup_hw(struct hfc_pci *hc)
|
||||
}
|
||||
/* Allocate memory for FIFOS */
|
||||
/* the memory needs to be on a 32k boundary within the first 4G */
|
||||
dma_set_mask(&hc->pdev->dev, 0xFFFF8000);
|
||||
if (dma_set_mask(&hc->pdev->dev, 0xFFFF8000)) {
|
||||
printk(KERN_WARNING
|
||||
"HFC-PCI: No usable DMA configuration!\n");
|
||||
return -EIO;
|
||||
}
|
||||
buffer = dma_alloc_coherent(&hc->pdev->dev, 0x8000, &hc->hw.dmahandle,
|
||||
GFP_KERNEL);
|
||||
/* We silently assume the address is okay if nonzero */
|
||||
|
||||
@@ -192,7 +192,7 @@ void dsp_pipeline_destroy(struct dsp_pipeline *pipeline)
|
||||
int dsp_pipeline_build(struct dsp_pipeline *pipeline, const char *cfg)
|
||||
{
|
||||
int found = 0;
|
||||
char *dup, *tok, *name, *args;
|
||||
char *dup, *next, *tok, *name, *args;
|
||||
struct dsp_element_entry *entry, *n;
|
||||
struct dsp_pipeline_entry *pipeline_entry;
|
||||
struct mISDN_dsp_element *elem;
|
||||
@@ -203,10 +203,10 @@ int dsp_pipeline_build(struct dsp_pipeline *pipeline, const char *cfg)
|
||||
if (!list_empty(&pipeline->list))
|
||||
_dsp_pipeline_destroy(pipeline);
|
||||
|
||||
dup = kstrdup(cfg, GFP_ATOMIC);
|
||||
dup = next = kstrdup(cfg, GFP_ATOMIC);
|
||||
if (!dup)
|
||||
return 0;
|
||||
while ((tok = strsep(&dup, "|"))) {
|
||||
while ((tok = strsep(&next, "|"))) {
|
||||
if (!strlen(tok))
|
||||
continue;
|
||||
name = strsep(&tok, "(");
|
||||
|
||||
@@ -1908,7 +1908,7 @@ static int mmc_blk_card_busy(struct mmc_card *card, struct request *req)
|
||||
|
||||
cb_data.card = card;
|
||||
cb_data.status = 0;
|
||||
err = __mmc_poll_for_busy(card->host, MMC_BLK_TIMEOUT_MS,
|
||||
err = __mmc_poll_for_busy(card->host, 0, MMC_BLK_TIMEOUT_MS,
|
||||
&mmc_blk_busy_cb, &cb_data);
|
||||
|
||||
/*
|
||||
|
||||
@@ -1962,7 +1962,7 @@ static int mmc_sleep(struct mmc_host *host)
|
||||
goto out_release;
|
||||
}
|
||||
|
||||
err = __mmc_poll_for_busy(host, timeout_ms, &mmc_sleep_busy_cb, host);
|
||||
err = __mmc_poll_for_busy(host, 0, timeout_ms, &mmc_sleep_busy_cb, host);
|
||||
|
||||
out_release:
|
||||
mmc_retune_release(host);
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
|
||||
#define MMC_BKOPS_TIMEOUT_MS (120 * 1000) /* 120s */
|
||||
#define MMC_SANITIZE_TIMEOUT_MS (240 * 1000) /* 240s */
|
||||
#define MMC_OP_COND_PERIOD_US (1 * 1000) /* 1ms */
|
||||
#define MMC_OP_COND_TIMEOUT_MS 1000 /* 1s */
|
||||
|
||||
static const u8 tuning_blk_pattern_4bit[] = {
|
||||
0xff, 0x0f, 0xff, 0x00, 0xff, 0xcc, 0xc3, 0xcc,
|
||||
@@ -232,7 +234,9 @@ int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
|
||||
cmd.arg = mmc_host_is_spi(host) ? 0 : ocr;
|
||||
cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R3 | MMC_CMD_BCR;
|
||||
|
||||
err = __mmc_poll_for_busy(host, 1000, &__mmc_send_op_cond_cb, &cb_data);
|
||||
err = __mmc_poll_for_busy(host, MMC_OP_COND_PERIOD_US,
|
||||
MMC_OP_COND_TIMEOUT_MS,
|
||||
&__mmc_send_op_cond_cb, &cb_data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -495,13 +499,14 @@ static int mmc_busy_cb(void *cb_data, bool *busy)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __mmc_poll_for_busy(struct mmc_host *host, unsigned int timeout_ms,
|
||||
int __mmc_poll_for_busy(struct mmc_host *host, unsigned int period_us,
|
||||
unsigned int timeout_ms,
|
||||
int (*busy_cb)(void *cb_data, bool *busy),
|
||||
void *cb_data)
|
||||
{
|
||||
int err;
|
||||
unsigned long timeout;
|
||||
unsigned int udelay = 32, udelay_max = 32768;
|
||||
unsigned int udelay = period_us ? period_us : 32, udelay_max = 32768;
|
||||
bool expired = false;
|
||||
bool busy = false;
|
||||
|
||||
@@ -546,7 +551,7 @@ int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
|
||||
cb_data.retry_crc_err = retry_crc_err;
|
||||
cb_data.busy_cmd = busy_cmd;
|
||||
|
||||
return __mmc_poll_for_busy(host, timeout_ms, &mmc_busy_cb, &cb_data);
|
||||
return __mmc_poll_for_busy(host, 0, timeout_ms, &mmc_busy_cb, &cb_data);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mmc_poll_for_busy);
|
||||
|
||||
|
||||
@@ -41,7 +41,8 @@ int mmc_can_ext_csd(struct mmc_card *card);
|
||||
int mmc_switch_status(struct mmc_card *card, bool crc_err_fatal);
|
||||
bool mmc_prepare_busy_cmd(struct mmc_host *host, struct mmc_command *cmd,
|
||||
unsigned int timeout_ms);
|
||||
int __mmc_poll_for_busy(struct mmc_host *host, unsigned int timeout_ms,
|
||||
int __mmc_poll_for_busy(struct mmc_host *host, unsigned int period_us,
|
||||
unsigned int timeout_ms,
|
||||
int (*busy_cb)(void *cb_data, bool *busy),
|
||||
void *cb_data);
|
||||
int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
|
||||
|
||||
@@ -1672,7 +1672,7 @@ static int sd_poweroff_notify(struct mmc_card *card)
|
||||
|
||||
cb_data.card = card;
|
||||
cb_data.reg_buf = reg_buf;
|
||||
err = __mmc_poll_for_busy(card->host, SD_POWEROFF_NOTIFY_TIMEOUT_MS,
|
||||
err = __mmc_poll_for_busy(card->host, 0, SD_POWEROFF_NOTIFY_TIMEOUT_MS,
|
||||
&sd_busy_poweroff_notify_cb, &cb_data);
|
||||
|
||||
out:
|
||||
|
||||
@@ -173,6 +173,8 @@ struct meson_host {
|
||||
int irq;
|
||||
|
||||
bool vqmmc_enabled;
|
||||
bool needs_pre_post_req;
|
||||
|
||||
};
|
||||
|
||||
#define CMD_CFG_LENGTH_MASK GENMASK(8, 0)
|
||||
@@ -663,6 +665,8 @@ static void meson_mmc_request_done(struct mmc_host *mmc,
|
||||
struct meson_host *host = mmc_priv(mmc);
|
||||
|
||||
host->cmd = NULL;
|
||||
if (host->needs_pre_post_req)
|
||||
meson_mmc_post_req(mmc, mrq, 0);
|
||||
mmc_request_done(host->mmc, mrq);
|
||||
}
|
||||
|
||||
@@ -880,7 +884,7 @@ static int meson_mmc_validate_dram_access(struct mmc_host *mmc, struct mmc_data
|
||||
static void meson_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
||||
{
|
||||
struct meson_host *host = mmc_priv(mmc);
|
||||
bool needs_pre_post_req = mrq->data &&
|
||||
host->needs_pre_post_req = mrq->data &&
|
||||
!(mrq->data->host_cookie & SD_EMMC_PRE_REQ_DONE);
|
||||
|
||||
/*
|
||||
@@ -896,22 +900,19 @@ static void meson_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
||||
}
|
||||
}
|
||||
|
||||
if (needs_pre_post_req) {
|
||||
if (host->needs_pre_post_req) {
|
||||
meson_mmc_get_transfer_mode(mmc, mrq);
|
||||
if (!meson_mmc_desc_chain_mode(mrq->data))
|
||||
needs_pre_post_req = false;
|
||||
host->needs_pre_post_req = false;
|
||||
}
|
||||
|
||||
if (needs_pre_post_req)
|
||||
if (host->needs_pre_post_req)
|
||||
meson_mmc_pre_req(mmc, mrq);
|
||||
|
||||
/* Stop execution */
|
||||
writel(0, host->regs + SD_EMMC_START);
|
||||
|
||||
meson_mmc_start_cmd(mmc, mrq->sbc ?: mrq->cmd);
|
||||
|
||||
if (needs_pre_post_req)
|
||||
meson_mmc_post_req(mmc, mrq, 0);
|
||||
}
|
||||
|
||||
static void meson_mmc_read_resp(struct mmc_host *mmc, struct mmc_command *cmd)
|
||||
|
||||
@@ -2936,7 +2936,7 @@ mt753x_phylink_validate(struct dsa_switch *ds, int port,
|
||||
|
||||
phylink_set_port_modes(mask);
|
||||
|
||||
if (state->interface != PHY_INTERFACE_MODE_TRGMII ||
|
||||
if (state->interface != PHY_INTERFACE_MODE_TRGMII &&
|
||||
!phy_interface_mode_is_8023z(state->interface)) {
|
||||
phylink_set(mask, 10baseT_Half);
|
||||
phylink_set(mask, 10baseT_Full);
|
||||
|
||||
@@ -405,12 +405,12 @@ static int mcf8390_init(struct net_device *dev)
|
||||
static int mcf8390_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct net_device *dev;
|
||||
struct resource *mem, *irq;
|
||||
struct resource *mem;
|
||||
resource_size_t msize;
|
||||
int ret;
|
||||
int ret, irq;
|
||||
|
||||
irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
if (irq == NULL) {
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0) {
|
||||
dev_err(&pdev->dev, "no IRQ specified?\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
@@ -433,7 +433,7 @@ static int mcf8390_probe(struct platform_device *pdev)
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
platform_set_drvdata(pdev, dev);
|
||||
|
||||
dev->irq = irq->start;
|
||||
dev->irq = irq;
|
||||
dev->base_addr = mem->start;
|
||||
|
||||
ret = mcf8390_init(dev);
|
||||
|
||||
@@ -132,6 +132,7 @@ int arc_mdio_probe(struct arc_emac_priv *priv)
|
||||
{
|
||||
struct arc_emac_mdio_bus_data *data = &priv->bus_data;
|
||||
struct device_node *np = priv->dev->of_node;
|
||||
const char *name = "Synopsys MII Bus";
|
||||
struct mii_bus *bus;
|
||||
int error;
|
||||
|
||||
@@ -142,7 +143,7 @@ int arc_mdio_probe(struct arc_emac_priv *priv)
|
||||
priv->bus = bus;
|
||||
bus->priv = priv;
|
||||
bus->parent = priv->dev;
|
||||
bus->name = "Synopsys MII Bus";
|
||||
bus->name = name;
|
||||
bus->read = &arc_mdio_read;
|
||||
bus->write = &arc_mdio_write;
|
||||
bus->reset = &arc_mdio_reset;
|
||||
@@ -167,7 +168,7 @@ int arc_mdio_probe(struct arc_emac_priv *priv)
|
||||
if (error) {
|
||||
mdiobus_free(bus);
|
||||
return dev_err_probe(priv->dev, error,
|
||||
"cannot register MDIO bus %s\n", bus->name);
|
||||
"cannot register MDIO bus %s\n", name);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -40,6 +40,13 @@
|
||||
void bcmgenet_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
||||
{
|
||||
struct bcmgenet_priv *priv = netdev_priv(dev);
|
||||
struct device *kdev = &priv->pdev->dev;
|
||||
|
||||
if (!device_can_wakeup(kdev)) {
|
||||
wol->supported = 0;
|
||||
wol->wolopts = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
wol->supported = WAKE_MAGIC | WAKE_MAGICSECURE | WAKE_FILTER;
|
||||
wol->wolopts = priv->wolopts;
|
||||
|
||||
@@ -1573,7 +1573,14 @@ static int macb_poll(struct napi_struct *napi, int budget)
|
||||
if (work_done < budget) {
|
||||
napi_complete_done(napi, work_done);
|
||||
|
||||
/* Packets received while interrupts were disabled */
|
||||
/* RSR bits only seem to propagate to raise interrupts when
|
||||
* interrupts are enabled at the time, so if bits are already
|
||||
* set due to packets received while interrupts were disabled,
|
||||
* they will not cause another interrupt to be generated when
|
||||
* interrupts are re-enabled.
|
||||
* Check for this case here. This has been seen to happen
|
||||
* around 30% of the time under heavy network load.
|
||||
*/
|
||||
status = macb_readl(bp, RSR);
|
||||
if (status) {
|
||||
if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
|
||||
@@ -1581,6 +1588,22 @@ static int macb_poll(struct napi_struct *napi, int budget)
|
||||
napi_reschedule(napi);
|
||||
} else {
|
||||
queue_writel(queue, IER, bp->rx_intr_mask);
|
||||
|
||||
/* In rare cases, packets could have been received in
|
||||
* the window between the check above and re-enabling
|
||||
* interrupts. Therefore, a double-check is required
|
||||
* to avoid losing a wakeup. This can potentially race
|
||||
* with the interrupt handler doing the same actions
|
||||
* if an interrupt is raised just after enabling them,
|
||||
* but this should be harmless.
|
||||
*/
|
||||
status = macb_readl(bp, RSR);
|
||||
if (unlikely(status)) {
|
||||
queue_writel(queue, IDR, bp->rx_intr_mask);
|
||||
if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
|
||||
queue_writel(queue, ISR, MACB_BIT(RCOMP));
|
||||
napi_schedule(napi);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1464,6 +1464,7 @@ static int gfar_get_ts_info(struct net_device *dev,
|
||||
ptp_node = of_find_compatible_node(NULL, NULL, "fsl,etsec-ptp");
|
||||
if (ptp_node) {
|
||||
ptp_dev = of_find_device_by_node(ptp_node);
|
||||
of_node_put(ptp_node);
|
||||
if (ptp_dev)
|
||||
ptp = platform_get_drvdata(ptp_dev);
|
||||
}
|
||||
|
||||
@@ -742,10 +742,8 @@ static void i40e_dbg_dump_vf(struct i40e_pf *pf, int vf_id)
|
||||
vsi = pf->vsi[vf->lan_vsi_idx];
|
||||
dev_info(&pf->pdev->dev, "vf %2d: VSI id=%d, seid=%d, qps=%d\n",
|
||||
vf_id, vf->lan_vsi_id, vsi->seid, vf->num_queue_pairs);
|
||||
dev_info(&pf->pdev->dev, " num MDD=%lld, invalid msg=%lld, valid msg=%lld\n",
|
||||
vf->num_mdd_events,
|
||||
vf->num_invalid_msgs,
|
||||
vf->num_valid_msgs);
|
||||
dev_info(&pf->pdev->dev, " num MDD=%lld\n",
|
||||
vf->num_mdd_events);
|
||||
} else {
|
||||
dev_info(&pf->pdev->dev, "invalid VF id %d\n", vf_id);
|
||||
}
|
||||
|
||||
@@ -1917,19 +1917,17 @@ sriov_configure_out:
|
||||
/***********************virtual channel routines******************/
|
||||
|
||||
/**
|
||||
* i40e_vc_send_msg_to_vf_ex
|
||||
* i40e_vc_send_msg_to_vf
|
||||
* @vf: pointer to the VF info
|
||||
* @v_opcode: virtual channel opcode
|
||||
* @v_retval: virtual channel return value
|
||||
* @msg: pointer to the msg buffer
|
||||
* @msglen: msg length
|
||||
* @is_quiet: true for not printing unsuccessful return values, false otherwise
|
||||
*
|
||||
* send msg to VF
|
||||
**/
|
||||
static int i40e_vc_send_msg_to_vf_ex(struct i40e_vf *vf, u32 v_opcode,
|
||||
u32 v_retval, u8 *msg, u16 msglen,
|
||||
bool is_quiet)
|
||||
static int i40e_vc_send_msg_to_vf(struct i40e_vf *vf, u32 v_opcode,
|
||||
u32 v_retval, u8 *msg, u16 msglen)
|
||||
{
|
||||
struct i40e_pf *pf;
|
||||
struct i40e_hw *hw;
|
||||
@@ -1944,25 +1942,6 @@ static int i40e_vc_send_msg_to_vf_ex(struct i40e_vf *vf, u32 v_opcode,
|
||||
hw = &pf->hw;
|
||||
abs_vf_id = vf->vf_id + hw->func_caps.vf_base_id;
|
||||
|
||||
/* single place to detect unsuccessful return values */
|
||||
if (v_retval && !is_quiet) {
|
||||
vf->num_invalid_msgs++;
|
||||
dev_info(&pf->pdev->dev, "VF %d failed opcode %d, retval: %d\n",
|
||||
vf->vf_id, v_opcode, v_retval);
|
||||
if (vf->num_invalid_msgs >
|
||||
I40E_DEFAULT_NUM_INVALID_MSGS_ALLOWED) {
|
||||
dev_err(&pf->pdev->dev,
|
||||
"Number of invalid messages exceeded for VF %d\n",
|
||||
vf->vf_id);
|
||||
dev_err(&pf->pdev->dev, "Use PF Control I/F to enable the VF\n");
|
||||
set_bit(I40E_VF_STATE_DISABLED, &vf->vf_states);
|
||||
}
|
||||
} else {
|
||||
vf->num_valid_msgs++;
|
||||
/* reset the invalid counter, if a valid message is received. */
|
||||
vf->num_invalid_msgs = 0;
|
||||
}
|
||||
|
||||
aq_ret = i40e_aq_send_msg_to_vf(hw, abs_vf_id, v_opcode, v_retval,
|
||||
msg, msglen, NULL);
|
||||
if (aq_ret) {
|
||||
@@ -1975,23 +1954,6 @@ static int i40e_vc_send_msg_to_vf_ex(struct i40e_vf *vf, u32 v_opcode,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_vc_send_msg_to_vf
|
||||
* @vf: pointer to the VF info
|
||||
* @v_opcode: virtual channel opcode
|
||||
* @v_retval: virtual channel return value
|
||||
* @msg: pointer to the msg buffer
|
||||
* @msglen: msg length
|
||||
*
|
||||
* send msg to VF
|
||||
**/
|
||||
static int i40e_vc_send_msg_to_vf(struct i40e_vf *vf, u32 v_opcode,
|
||||
u32 v_retval, u8 *msg, u16 msglen)
|
||||
{
|
||||
return i40e_vc_send_msg_to_vf_ex(vf, v_opcode, v_retval,
|
||||
msg, msglen, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_vc_send_resp_to_vf
|
||||
* @vf: pointer to the VF info
|
||||
@@ -2822,7 +2784,6 @@ error_param:
|
||||
* i40e_check_vf_permission
|
||||
* @vf: pointer to the VF info
|
||||
* @al: MAC address list from virtchnl
|
||||
* @is_quiet: set true for printing msg without opcode info, false otherwise
|
||||
*
|
||||
* Check that the given list of MAC addresses is allowed. Will return -EPERM
|
||||
* if any address in the list is not valid. Checks the following conditions:
|
||||
@@ -2837,8 +2798,7 @@ error_param:
|
||||
* addresses might not be accurate.
|
||||
**/
|
||||
static inline int i40e_check_vf_permission(struct i40e_vf *vf,
|
||||
struct virtchnl_ether_addr_list *al,
|
||||
bool *is_quiet)
|
||||
struct virtchnl_ether_addr_list *al)
|
||||
{
|
||||
struct i40e_pf *pf = vf->pf;
|
||||
struct i40e_vsi *vsi = pf->vsi[vf->lan_vsi_idx];
|
||||
@@ -2846,7 +2806,6 @@ static inline int i40e_check_vf_permission(struct i40e_vf *vf,
|
||||
int mac2add_cnt = 0;
|
||||
int i;
|
||||
|
||||
*is_quiet = false;
|
||||
for (i = 0; i < al->num_elements; i++) {
|
||||
struct i40e_mac_filter *f;
|
||||
u8 *addr = al->list[i].addr;
|
||||
@@ -2870,7 +2829,6 @@ static inline int i40e_check_vf_permission(struct i40e_vf *vf,
|
||||
!ether_addr_equal(addr, vf->default_lan_addr.addr)) {
|
||||
dev_err(&pf->pdev->dev,
|
||||
"VF attempting to override administratively set MAC address, bring down and up the VF interface to resume normal operation\n");
|
||||
*is_quiet = true;
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
@@ -2921,7 +2879,6 @@ static int i40e_vc_add_mac_addr_msg(struct i40e_vf *vf, u8 *msg)
|
||||
(struct virtchnl_ether_addr_list *)msg;
|
||||
struct i40e_pf *pf = vf->pf;
|
||||
struct i40e_vsi *vsi = NULL;
|
||||
bool is_quiet = false;
|
||||
i40e_status ret = 0;
|
||||
int i;
|
||||
|
||||
@@ -2938,7 +2895,7 @@ static int i40e_vc_add_mac_addr_msg(struct i40e_vf *vf, u8 *msg)
|
||||
*/
|
||||
spin_lock_bh(&vsi->mac_filter_hash_lock);
|
||||
|
||||
ret = i40e_check_vf_permission(vf, al, &is_quiet);
|
||||
ret = i40e_check_vf_permission(vf, al);
|
||||
if (ret) {
|
||||
spin_unlock_bh(&vsi->mac_filter_hash_lock);
|
||||
goto error_param;
|
||||
@@ -2976,8 +2933,8 @@ static int i40e_vc_add_mac_addr_msg(struct i40e_vf *vf, u8 *msg)
|
||||
|
||||
error_param:
|
||||
/* send the response to the VF */
|
||||
return i40e_vc_send_msg_to_vf_ex(vf, VIRTCHNL_OP_ADD_ETH_ADDR,
|
||||
ret, NULL, 0, is_quiet);
|
||||
return i40e_vc_send_msg_to_vf(vf, VIRTCHNL_OP_ADD_ETH_ADDR,
|
||||
ret, NULL, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -10,8 +10,6 @@
|
||||
|
||||
#define I40E_VIRTCHNL_SUPPORTED_QTYPES 2
|
||||
|
||||
#define I40E_DEFAULT_NUM_INVALID_MSGS_ALLOWED 10
|
||||
|
||||
#define I40E_VLAN_PRIORITY_SHIFT 13
|
||||
#define I40E_VLAN_MASK 0xFFF
|
||||
#define I40E_PRIORITY_MASK 0xE000
|
||||
@@ -92,9 +90,6 @@ struct i40e_vf {
|
||||
u8 num_queue_pairs; /* num of qps assigned to VF vsis */
|
||||
u8 num_req_queues; /* num of requested qps */
|
||||
u64 num_mdd_events; /* num of mdd events detected */
|
||||
/* num of continuous malformed or invalid msgs detected */
|
||||
u64 num_invalid_msgs;
|
||||
u64 num_valid_msgs; /* num of valid msgs detected */
|
||||
|
||||
unsigned long vf_caps; /* vf's adv. capabilities */
|
||||
unsigned long vf_states; /* vf's runtime states */
|
||||
|
||||
@@ -288,6 +288,7 @@ struct iavf_adapter {
|
||||
#define IAVF_FLAG_REINIT_ITR_NEEDED BIT(16)
|
||||
#define IAVF_FLAG_QUEUES_DISABLED BIT(17)
|
||||
#define IAVF_FLAG_SETUP_NETDEV_FEATURES BIT(18)
|
||||
#define IAVF_FLAG_REINIT_MSIX_NEEDED BIT(20)
|
||||
/* duplicates for common code */
|
||||
#define IAVF_FLAG_DCB_ENABLED 0
|
||||
/* flags for admin queue service task */
|
||||
|
||||
@@ -2120,7 +2120,7 @@ int iavf_parse_vf_resource_msg(struct iavf_adapter *adapter)
|
||||
"Requested %d queues, but PF only gave us %d.\n",
|
||||
num_req_queues,
|
||||
adapter->vsi_res->num_queue_pairs);
|
||||
adapter->flags |= IAVF_FLAG_REINIT_ITR_NEEDED;
|
||||
adapter->flags |= IAVF_FLAG_REINIT_MSIX_NEEDED;
|
||||
adapter->num_req_queues = adapter->vsi_res->num_queue_pairs;
|
||||
iavf_schedule_reset(adapter);
|
||||
|
||||
@@ -2727,7 +2727,8 @@ continue_reset:
|
||||
err);
|
||||
adapter->aq_required = 0;
|
||||
|
||||
if (adapter->flags & IAVF_FLAG_REINIT_ITR_NEEDED) {
|
||||
if ((adapter->flags & IAVF_FLAG_REINIT_MSIX_NEEDED) ||
|
||||
(adapter->flags & IAVF_FLAG_REINIT_ITR_NEEDED)) {
|
||||
err = iavf_reinit_interrupt_scheme(adapter);
|
||||
if (err)
|
||||
goto reset_err;
|
||||
@@ -2799,12 +2800,13 @@ continue_reset:
|
||||
if (err)
|
||||
goto reset_err;
|
||||
|
||||
if (adapter->flags & IAVF_FLAG_REINIT_ITR_NEEDED) {
|
||||
if ((adapter->flags & IAVF_FLAG_REINIT_MSIX_NEEDED) ||
|
||||
(adapter->flags & IAVF_FLAG_REINIT_ITR_NEEDED)) {
|
||||
err = iavf_request_traffic_irqs(adapter, netdev->name);
|
||||
if (err)
|
||||
goto reset_err;
|
||||
|
||||
adapter->flags &= ~IAVF_FLAG_REINIT_ITR_NEEDED;
|
||||
adapter->flags &= ~IAVF_FLAG_REINIT_MSIX_NEEDED;
|
||||
}
|
||||
|
||||
iavf_configure(adapter);
|
||||
@@ -2819,6 +2821,9 @@ continue_reset:
|
||||
iavf_change_state(adapter, __IAVF_DOWN);
|
||||
wake_up(&adapter->down_waitqueue);
|
||||
}
|
||||
|
||||
adapter->flags &= ~IAVF_FLAG_REINIT_ITR_NEEDED;
|
||||
|
||||
mutex_unlock(&adapter->client_lock);
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
|
||||
|
||||
@@ -1834,6 +1834,22 @@ void iavf_request_reset(struct iavf_adapter *adapter)
|
||||
adapter->current_op = VIRTCHNL_OP_UNKNOWN;
|
||||
}
|
||||
|
||||
/**
|
||||
* iavf_netdev_features_vlan_strip_set - update vlan strip status
|
||||
* @netdev: ptr to netdev being adjusted
|
||||
* @enable: enable or disable vlan strip
|
||||
*
|
||||
* Helper function to change vlan strip status in netdev->features.
|
||||
*/
|
||||
static void iavf_netdev_features_vlan_strip_set(struct net_device *netdev,
|
||||
const bool enable)
|
||||
{
|
||||
if (enable)
|
||||
netdev->features |= NETIF_F_HW_VLAN_CTAG_RX;
|
||||
else
|
||||
netdev->features &= ~NETIF_F_HW_VLAN_CTAG_RX;
|
||||
}
|
||||
|
||||
/**
|
||||
* iavf_virtchnl_completion
|
||||
* @adapter: adapter structure
|
||||
@@ -2057,8 +2073,18 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter,
|
||||
}
|
||||
break;
|
||||
case VIRTCHNL_OP_ENABLE_VLAN_STRIPPING:
|
||||
dev_warn(&adapter->pdev->dev, "Changing VLAN Stripping is not allowed when Port VLAN is configured\n");
|
||||
/* Vlan stripping could not be enabled by ethtool.
|
||||
* Disable it in netdev->features.
|
||||
*/
|
||||
iavf_netdev_features_vlan_strip_set(netdev, false);
|
||||
break;
|
||||
case VIRTCHNL_OP_DISABLE_VLAN_STRIPPING:
|
||||
dev_warn(&adapter->pdev->dev, "Changing VLAN Stripping is not allowed when Port VLAN is configured\n");
|
||||
/* Vlan stripping could not be disabled by ethtool.
|
||||
* Enable it in netdev->features.
|
||||
*/
|
||||
iavf_netdev_features_vlan_strip_set(netdev, true);
|
||||
break;
|
||||
default:
|
||||
dev_err(&adapter->pdev->dev, "PF returned error %d (%s) to our request %d\n",
|
||||
@@ -2312,6 +2338,20 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter,
|
||||
spin_unlock_bh(&adapter->adv_rss_lock);
|
||||
}
|
||||
break;
|
||||
case VIRTCHNL_OP_ENABLE_VLAN_STRIPPING:
|
||||
/* PF enabled vlan strip on this VF.
|
||||
* Update netdev->features if needed to be in sync with ethtool.
|
||||
*/
|
||||
if (!v_retval)
|
||||
iavf_netdev_features_vlan_strip_set(netdev, true);
|
||||
break;
|
||||
case VIRTCHNL_OP_DISABLE_VLAN_STRIPPING:
|
||||
/* PF disabled vlan strip on this VF.
|
||||
* Update netdev->features if needed to be in sync with ethtool.
|
||||
*/
|
||||
if (!v_retval)
|
||||
iavf_netdev_features_vlan_strip_set(netdev, false);
|
||||
break;
|
||||
default:
|
||||
if (adapter->current_op && (v_opcode != adapter->current_op))
|
||||
dev_warn(&adapter->pdev->dev, "Expected response %d from PF, received %d\n",
|
||||
|
||||
@@ -483,6 +483,7 @@ enum ice_pf_flags {
|
||||
ICE_FLAG_MDD_AUTO_RESET_VF,
|
||||
ICE_FLAG_LINK_LENIENT_MODE_ENA,
|
||||
ICE_FLAG_PLUG_AUX_DEV,
|
||||
ICE_FLAG_MTU_CHANGED,
|
||||
ICE_PF_FLAGS_NBITS /* must be last */
|
||||
};
|
||||
|
||||
@@ -897,7 +898,16 @@ static inline void ice_set_rdma_cap(struct ice_pf *pf)
|
||||
*/
|
||||
static inline void ice_clear_rdma_cap(struct ice_pf *pf)
|
||||
{
|
||||
ice_unplug_aux_dev(pf);
|
||||
/* We can directly unplug aux device here only if the flag bit
|
||||
* ICE_FLAG_PLUG_AUX_DEV is not set because ice_unplug_aux_dev()
|
||||
* could race with ice_plug_aux_dev() called from
|
||||
* ice_service_task(). In this case we only clear that bit now and
|
||||
* aux device will be unplugged later once ice_plug_aux_device()
|
||||
* called from ice_service_task() finishes (see ice_service_task()).
|
||||
*/
|
||||
if (!test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags))
|
||||
ice_unplug_aux_dev(pf);
|
||||
|
||||
clear_bit(ICE_FLAG_RDMA_ENA, pf->flags);
|
||||
clear_bit(ICE_FLAG_AUX_ENA, pf->flags);
|
||||
}
|
||||
|
||||
@@ -2298,7 +2298,7 @@ ice_set_link_ksettings(struct net_device *netdev,
|
||||
if (err)
|
||||
goto done;
|
||||
|
||||
curr_link_speed = pi->phy.link_info.link_speed;
|
||||
curr_link_speed = pi->phy.curr_user_speed_req;
|
||||
adv_link_speed = ice_ksettings_find_adv_link_speed(ks);
|
||||
|
||||
/* If speed didn't get set, set it to what it currently is.
|
||||
|
||||
@@ -2255,9 +2255,30 @@ static void ice_service_task(struct work_struct *work)
|
||||
return;
|
||||
}
|
||||
|
||||
if (test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags))
|
||||
if (test_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags)) {
|
||||
/* Plug aux device per request */
|
||||
ice_plug_aux_dev(pf);
|
||||
|
||||
/* Mark plugging as done but check whether unplug was
|
||||
* requested during ice_plug_aux_dev() call
|
||||
* (e.g. from ice_clear_rdma_cap()) and if so then
|
||||
* plug aux device.
|
||||
*/
|
||||
if (!test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags))
|
||||
ice_unplug_aux_dev(pf);
|
||||
}
|
||||
|
||||
if (test_and_clear_bit(ICE_FLAG_MTU_CHANGED, pf->flags)) {
|
||||
struct iidc_event *event;
|
||||
|
||||
event = kzalloc(sizeof(*event), GFP_KERNEL);
|
||||
if (event) {
|
||||
set_bit(IIDC_EVENT_AFTER_MTU_CHANGE, event->type);
|
||||
ice_send_event_to_aux(pf, event);
|
||||
kfree(event);
|
||||
}
|
||||
}
|
||||
|
||||
ice_clean_adminq_subtask(pf);
|
||||
ice_check_media_subtask(pf);
|
||||
ice_check_for_hang_subtask(pf);
|
||||
@@ -3023,7 +3044,7 @@ static irqreturn_t ice_misc_intr(int __always_unused irq, void *data)
|
||||
struct iidc_event *event;
|
||||
|
||||
ena_mask &= ~ICE_AUX_CRIT_ERR;
|
||||
event = kzalloc(sizeof(*event), GFP_KERNEL);
|
||||
event = kzalloc(sizeof(*event), GFP_ATOMIC);
|
||||
if (event) {
|
||||
set_bit(IIDC_EVENT_CRIT_ERR, event->type);
|
||||
/* report the entire OICR value to AUX driver */
|
||||
@@ -6822,7 +6843,6 @@ static int ice_change_mtu(struct net_device *netdev, int new_mtu)
|
||||
struct ice_netdev_priv *np = netdev_priv(netdev);
|
||||
struct ice_vsi *vsi = np->vsi;
|
||||
struct ice_pf *pf = vsi->back;
|
||||
struct iidc_event *event;
|
||||
u8 count = 0;
|
||||
int err = 0;
|
||||
|
||||
@@ -6857,14 +6877,6 @@ static int ice_change_mtu(struct net_device *netdev, int new_mtu)
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
event = kzalloc(sizeof(*event), GFP_KERNEL);
|
||||
if (!event)
|
||||
return -ENOMEM;
|
||||
|
||||
set_bit(IIDC_EVENT_BEFORE_MTU_CHANGE, event->type);
|
||||
ice_send_event_to_aux(pf, event);
|
||||
clear_bit(IIDC_EVENT_BEFORE_MTU_CHANGE, event->type);
|
||||
|
||||
netdev->mtu = (unsigned int)new_mtu;
|
||||
|
||||
/* if VSI is up, bring it down and then back up */
|
||||
@@ -6872,21 +6884,18 @@ static int ice_change_mtu(struct net_device *netdev, int new_mtu)
|
||||
err = ice_down(vsi);
|
||||
if (err) {
|
||||
netdev_err(netdev, "change MTU if_down err %d\n", err);
|
||||
goto event_after;
|
||||
return err;
|
||||
}
|
||||
|
||||
err = ice_up(vsi);
|
||||
if (err) {
|
||||
netdev_err(netdev, "change MTU if_up err %d\n", err);
|
||||
goto event_after;
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
netdev_dbg(netdev, "changed MTU to %d\n", new_mtu);
|
||||
event_after:
|
||||
set_bit(IIDC_EVENT_AFTER_MTU_CHANGE, event->type);
|
||||
ice_send_event_to_aux(pf, event);
|
||||
kfree(event);
|
||||
set_bit(ICE_FLAG_MTU_CHANGED, pf->flags);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -2182,24 +2182,6 @@ ice_vc_send_msg_to_vf(struct ice_vf *vf, u32 v_opcode,
|
||||
|
||||
dev = ice_pf_to_dev(pf);
|
||||
|
||||
/* single place to detect unsuccessful return values */
|
||||
if (v_retval) {
|
||||
vf->num_inval_msgs++;
|
||||
dev_info(dev, "VF %d failed opcode %d, retval: %d\n", vf->vf_id,
|
||||
v_opcode, v_retval);
|
||||
if (vf->num_inval_msgs > ICE_DFLT_NUM_INVAL_MSGS_ALLOWED) {
|
||||
dev_err(dev, "Number of invalid messages exceeded for VF %d\n",
|
||||
vf->vf_id);
|
||||
dev_err(dev, "Use PF Control I/F to enable the VF\n");
|
||||
set_bit(ICE_VF_STATE_DIS, vf->vf_states);
|
||||
return -EIO;
|
||||
}
|
||||
} else {
|
||||
vf->num_valid_msgs++;
|
||||
/* reset the invalid counter, if a valid message is received. */
|
||||
vf->num_inval_msgs = 0;
|
||||
}
|
||||
|
||||
aq_ret = ice_aq_send_msg_to_vf(&pf->hw, vf->vf_id, v_opcode, v_retval,
|
||||
msg, msglen, NULL);
|
||||
if (aq_ret && pf->hw.mailboxq.sq_last_status != ICE_AQ_RC_ENOSYS) {
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#define ICE_MAX_MACADDR_PER_VF 18
|
||||
|
||||
/* Malicious Driver Detection */
|
||||
#define ICE_DFLT_NUM_INVAL_MSGS_ALLOWED 10
|
||||
#define ICE_MDD_EVENTS_THRESHOLD 30
|
||||
|
||||
/* Static VF transaction/status register def */
|
||||
@@ -134,8 +133,6 @@ struct ice_vf {
|
||||
unsigned int max_tx_rate; /* Maximum Tx bandwidth limit in Mbps */
|
||||
DECLARE_BITMAP(vf_states, ICE_VF_STATES_NBITS); /* VF runtime states */
|
||||
|
||||
u64 num_inval_msgs; /* number of continuous invalid msgs */
|
||||
u64 num_valid_msgs; /* number of valid msgs detected */
|
||||
unsigned long vf_caps; /* VF's adv. capabilities */
|
||||
u8 num_req_qs; /* num of queue pairs requested by VF */
|
||||
u16 num_mac;
|
||||
|
||||
@@ -260,9 +260,9 @@ static int xrx200_hw_receive(struct xrx200_chan *ch)
|
||||
|
||||
if (ctl & LTQ_DMA_EOP) {
|
||||
ch->skb_head->protocol = eth_type_trans(ch->skb_head, net_dev);
|
||||
netif_receive_skb(ch->skb_head);
|
||||
net_dev->stats.rx_packets++;
|
||||
net_dev->stats.rx_bytes += ch->skb_head->len;
|
||||
netif_receive_skb(ch->skb_head);
|
||||
ch->skb_head = NULL;
|
||||
ch->skb_tail = NULL;
|
||||
ret = XRX200_DMA_PACKET_COMPLETE;
|
||||
|
||||
@@ -554,6 +554,7 @@ static int prestera_switch_set_base_mac_addr(struct prestera_switch *sw)
|
||||
dev_info(prestera_dev(sw), "using random base mac address\n");
|
||||
}
|
||||
of_node_put(base_mac_np);
|
||||
of_node_put(np);
|
||||
|
||||
return prestera_hw_switch_mac_set(sw, sw->base_mac);
|
||||
}
|
||||
|
||||
@@ -131,11 +131,8 @@ static int cmd_alloc_index(struct mlx5_cmd *cmd)
|
||||
|
||||
static void cmd_free_index(struct mlx5_cmd *cmd, int idx)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&cmd->alloc_lock, flags);
|
||||
lockdep_assert_held(&cmd->alloc_lock);
|
||||
set_bit(idx, &cmd->bitmask);
|
||||
spin_unlock_irqrestore(&cmd->alloc_lock, flags);
|
||||
}
|
||||
|
||||
static void cmd_ent_get(struct mlx5_cmd_work_ent *ent)
|
||||
@@ -145,17 +142,21 @@ static void cmd_ent_get(struct mlx5_cmd_work_ent *ent)
|
||||
|
||||
static void cmd_ent_put(struct mlx5_cmd_work_ent *ent)
|
||||
{
|
||||
struct mlx5_cmd *cmd = ent->cmd;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&cmd->alloc_lock, flags);
|
||||
if (!refcount_dec_and_test(&ent->refcnt))
|
||||
return;
|
||||
goto out;
|
||||
|
||||
if (ent->idx >= 0) {
|
||||
struct mlx5_cmd *cmd = ent->cmd;
|
||||
|
||||
cmd_free_index(cmd, ent->idx);
|
||||
up(ent->page_queue ? &cmd->pages_sem : &cmd->sem);
|
||||
}
|
||||
|
||||
cmd_free_ent(ent);
|
||||
out:
|
||||
spin_unlock_irqrestore(&cmd->alloc_lock, flags);
|
||||
}
|
||||
|
||||
static struct mlx5_cmd_layout *get_inst(struct mlx5_cmd *cmd, int idx)
|
||||
|
||||
@@ -88,9 +88,6 @@ void mlx5e_tir_builder_build_packet_merge(struct mlx5e_tir_builder *builder,
|
||||
(MLX5E_PARAMS_DEFAULT_LRO_WQE_SZ - rough_max_l2_l3_hdr_sz) >> 8);
|
||||
MLX5_SET(tirc, tirc, lro_timeout_period_usecs, pkt_merge_param->timeout);
|
||||
break;
|
||||
case MLX5E_PACKET_MERGE_SHAMPO:
|
||||
MLX5_SET(tirc, tirc, packet_merge_mask, MLX5_TIRC_PACKET_MERGE_MASK_SHAMPO);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -3616,8 +3616,7 @@ static int set_feature_hw_gro(struct net_device *netdev, bool enable)
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = mlx5e_safe_switch_params(priv, &new_params,
|
||||
mlx5e_modify_tirs_packet_merge_ctx, NULL, reset);
|
||||
err = mlx5e_safe_switch_params(priv, &new_params, NULL, NULL, reset);
|
||||
out:
|
||||
mutex_unlock(&priv->state_lock);
|
||||
return err;
|
||||
|
||||
@@ -126,6 +126,10 @@ static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev,
|
||||
return;
|
||||
}
|
||||
|
||||
/* Handle multipath entry with lower priority value */
|
||||
if (mp->mfi && mp->mfi != fi && fi->fib_priority >= mp->mfi->fib_priority)
|
||||
return;
|
||||
|
||||
/* Handle add/replace event */
|
||||
nhs = fib_info_num_path(fi);
|
||||
if (nhs == 1) {
|
||||
@@ -135,12 +139,13 @@ static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev,
|
||||
int i = mlx5_lag_dev_get_netdev_idx(ldev, nh_dev);
|
||||
|
||||
if (i < 0)
|
||||
i = MLX5_LAG_NORMAL_AFFINITY;
|
||||
else
|
||||
++i;
|
||||
return;
|
||||
|
||||
i++;
|
||||
mlx5_lag_set_port_affinity(ldev, i);
|
||||
}
|
||||
|
||||
mp->mfi = fi;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -121,9 +121,6 @@ u32 mlx5_chains_get_nf_ft_chain(struct mlx5_fs_chains *chains)
|
||||
|
||||
u32 mlx5_chains_get_prio_range(struct mlx5_fs_chains *chains)
|
||||
{
|
||||
if (!mlx5_chains_prios_supported(chains))
|
||||
return 1;
|
||||
|
||||
if (mlx5_chains_ignore_flow_level_supported(chains))
|
||||
return UINT_MAX;
|
||||
|
||||
|
||||
@@ -1471,6 +1471,7 @@ static int lpc_eth_drv_resume(struct platform_device *pdev)
|
||||
{
|
||||
struct net_device *ndev = platform_get_drvdata(pdev);
|
||||
struct netdata_local *pldat;
|
||||
int ret;
|
||||
|
||||
if (device_may_wakeup(&pdev->dev))
|
||||
disable_irq_wake(ndev->irq);
|
||||
@@ -1480,7 +1481,9 @@ static int lpc_eth_drv_resume(struct platform_device *pdev)
|
||||
pldat = netdev_priv(ndev);
|
||||
|
||||
/* Enable interface clock */
|
||||
clk_enable(pldat->clk);
|
||||
ret = clk_enable(pldat->clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Reset and initialize */
|
||||
__lpc_eth_reset(pldat);
|
||||
|
||||
@@ -3806,11 +3806,11 @@ bool qed_iov_mark_vf_flr(struct qed_hwfn *p_hwfn, u32 *p_disabled_vfs)
|
||||
return found;
|
||||
}
|
||||
|
||||
static void qed_iov_get_link(struct qed_hwfn *p_hwfn,
|
||||
u16 vfid,
|
||||
struct qed_mcp_link_params *p_params,
|
||||
struct qed_mcp_link_state *p_link,
|
||||
struct qed_mcp_link_capabilities *p_caps)
|
||||
static int qed_iov_get_link(struct qed_hwfn *p_hwfn,
|
||||
u16 vfid,
|
||||
struct qed_mcp_link_params *p_params,
|
||||
struct qed_mcp_link_state *p_link,
|
||||
struct qed_mcp_link_capabilities *p_caps)
|
||||
{
|
||||
struct qed_vf_info *p_vf = qed_iov_get_vf_info(p_hwfn,
|
||||
vfid,
|
||||
@@ -3818,7 +3818,7 @@ static void qed_iov_get_link(struct qed_hwfn *p_hwfn,
|
||||
struct qed_bulletin_content *p_bulletin;
|
||||
|
||||
if (!p_vf)
|
||||
return;
|
||||
return -EINVAL;
|
||||
|
||||
p_bulletin = p_vf->bulletin.p_virt;
|
||||
|
||||
@@ -3828,6 +3828,7 @@ static void qed_iov_get_link(struct qed_hwfn *p_hwfn,
|
||||
__qed_vf_get_link_state(p_hwfn, p_link, p_bulletin);
|
||||
if (p_caps)
|
||||
__qed_vf_get_link_caps(p_hwfn, p_caps, p_bulletin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -4686,6 +4687,7 @@ static int qed_get_vf_config(struct qed_dev *cdev,
|
||||
struct qed_public_vf_info *vf_info;
|
||||
struct qed_mcp_link_state link;
|
||||
u32 tx_rate;
|
||||
int ret;
|
||||
|
||||
/* Sanitize request */
|
||||
if (IS_VF(cdev))
|
||||
@@ -4699,7 +4701,9 @@ static int qed_get_vf_config(struct qed_dev *cdev,
|
||||
|
||||
vf_info = qed_iov_get_public_vf_info(hwfn, vf_id, true);
|
||||
|
||||
qed_iov_get_link(hwfn, vf_id, NULL, &link, NULL);
|
||||
ret = qed_iov_get_link(hwfn, vf_id, NULL, &link, NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Fill information about VF */
|
||||
ivi->vf = vf_id;
|
||||
|
||||
@@ -513,6 +513,9 @@ int qed_vf_hw_prepare(struct qed_hwfn *p_hwfn)
|
||||
p_iov->bulletin.size,
|
||||
&p_iov->bulletin.phys,
|
||||
GFP_KERNEL);
|
||||
if (!p_iov->bulletin.p_virt)
|
||||
goto free_pf2vf_reply;
|
||||
|
||||
DP_VERBOSE(p_hwfn, QED_MSG_IOV,
|
||||
"VF's bulletin Board [%p virt 0x%llx phys 0x%08x bytes]\n",
|
||||
p_iov->bulletin.p_virt,
|
||||
@@ -552,6 +555,10 @@ int qed_vf_hw_prepare(struct qed_hwfn *p_hwfn)
|
||||
|
||||
return rc;
|
||||
|
||||
free_pf2vf_reply:
|
||||
dma_free_coherent(&p_hwfn->cdev->pdev->dev,
|
||||
sizeof(union pfvf_tlvs),
|
||||
p_iov->pf2vf_reply, p_iov->pf2vf_reply_phys);
|
||||
free_vf2pf_request:
|
||||
dma_free_coherent(&p_hwfn->cdev->pdev->dev,
|
||||
sizeof(union vfpf_tlvs),
|
||||
|
||||
@@ -3146,7 +3146,7 @@ static int happy_meal_pci_probe(struct pci_dev *pdev,
|
||||
if (err) {
|
||||
printk(KERN_ERR "happymeal(PCI): Cannot register net device, "
|
||||
"aborting.\n");
|
||||
goto err_out_iounmap;
|
||||
goto err_out_free_coherent;
|
||||
}
|
||||
|
||||
pci_set_drvdata(pdev, hp);
|
||||
@@ -3179,6 +3179,10 @@ static int happy_meal_pci_probe(struct pci_dev *pdev,
|
||||
|
||||
return 0;
|
||||
|
||||
err_out_free_coherent:
|
||||
dma_free_coherent(hp->dma_dev, PAGE_SIZE,
|
||||
hp->happy_block, hp->hblock_dvma);
|
||||
|
||||
err_out_iounmap:
|
||||
iounmap(hp->gregs);
|
||||
|
||||
|
||||
@@ -568,7 +568,9 @@ int cpts_register(struct cpts *cpts)
|
||||
for (i = 0; i < CPTS_MAX_EVENTS; i++)
|
||||
list_add(&cpts->pool_data[i].list, &cpts->pool);
|
||||
|
||||
clk_enable(cpts->refclk);
|
||||
err = clk_enable(cpts->refclk);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
cpts_write32(cpts, CPTS_EN, control);
|
||||
cpts_write32(cpts, TS_PEND_EN, int_enable);
|
||||
|
||||
@@ -1183,7 +1183,7 @@ static int xemaclite_of_probe(struct platform_device *ofdev)
|
||||
if (rc) {
|
||||
dev_err(dev,
|
||||
"Cannot register network device, aborting\n");
|
||||
goto error;
|
||||
goto put_node;
|
||||
}
|
||||
|
||||
dev_info(dev,
|
||||
@@ -1191,6 +1191,8 @@ static int xemaclite_of_probe(struct platform_device *ofdev)
|
||||
(unsigned long __force)ndev->mem_start, lp->base_addr, ndev->irq);
|
||||
return 0;
|
||||
|
||||
put_node:
|
||||
of_node_put(lp->phy_node);
|
||||
error:
|
||||
free_netdev(ndev);
|
||||
return rc;
|
||||
|
||||
@@ -274,7 +274,7 @@ static int dp83822_config_intr(struct phy_device *phydev)
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
err = phy_write(phydev, MII_DP83822_MISR1, 0);
|
||||
err = phy_write(phydev, MII_DP83822_MISR2, 0);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
|
||||
@@ -30,8 +30,12 @@
|
||||
#define INTSRC_LINK_DOWN BIT(4)
|
||||
#define INTSRC_REMOTE_FAULT BIT(5)
|
||||
#define INTSRC_ANEG_COMPLETE BIT(6)
|
||||
#define INTSRC_ENERGY_DETECT BIT(7)
|
||||
#define INTSRC_MASK 30
|
||||
|
||||
#define INT_SOURCES (INTSRC_LINK_DOWN | INTSRC_ANEG_COMPLETE | \
|
||||
INTSRC_ENERGY_DETECT)
|
||||
|
||||
#define BANK_ANALOG_DSP 0
|
||||
#define BANK_WOL 1
|
||||
#define BANK_BIST 3
|
||||
@@ -200,7 +204,6 @@ static int meson_gxl_ack_interrupt(struct phy_device *phydev)
|
||||
|
||||
static int meson_gxl_config_intr(struct phy_device *phydev)
|
||||
{
|
||||
u16 val;
|
||||
int ret;
|
||||
|
||||
if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
|
||||
@@ -209,16 +212,9 @@ static int meson_gxl_config_intr(struct phy_device *phydev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
val = INTSRC_ANEG_PR
|
||||
| INTSRC_PARALLEL_FAULT
|
||||
| INTSRC_ANEG_LP_ACK
|
||||
| INTSRC_LINK_DOWN
|
||||
| INTSRC_REMOTE_FAULT
|
||||
| INTSRC_ANEG_COMPLETE;
|
||||
ret = phy_write(phydev, INTSRC_MASK, val);
|
||||
ret = phy_write(phydev, INTSRC_MASK, INT_SOURCES);
|
||||
} else {
|
||||
val = 0;
|
||||
ret = phy_write(phydev, INTSRC_MASK, val);
|
||||
ret = phy_write(phydev, INTSRC_MASK, 0);
|
||||
|
||||
/* Ack any pending IRQ */
|
||||
ret = meson_gxl_ack_interrupt(phydev);
|
||||
@@ -237,10 +233,23 @@ static irqreturn_t meson_gxl_handle_interrupt(struct phy_device *phydev)
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
irq_status &= INT_SOURCES;
|
||||
|
||||
if (irq_status == 0)
|
||||
return IRQ_NONE;
|
||||
|
||||
phy_trigger_machine(phydev);
|
||||
/* Aneg-complete interrupt is used for link-up detection */
|
||||
if (phydev->autoneg == AUTONEG_ENABLE &&
|
||||
irq_status == INTSRC_ENERGY_DETECT)
|
||||
return IRQ_HANDLED;
|
||||
|
||||
/* Give PHY some time before MAC starts sending data. This works
|
||||
* around an issue where network doesn't come up properly.
|
||||
*/
|
||||
if (!(irq_status & INTSRC_LINK_DOWN))
|
||||
phy_queue_state_machine(phydev, msecs_to_jiffies(100));
|
||||
else
|
||||
phy_trigger_machine(phydev);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -84,9 +84,10 @@ static int __must_check __smsc95xx_read_reg(struct usbnet *dev, u32 index,
|
||||
ret = fn(dev, USB_VENDOR_REQUEST_READ_REGISTER, USB_DIR_IN
|
||||
| USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||
0, index, &buf, 4);
|
||||
if (unlikely(ret < 0)) {
|
||||
netdev_warn(dev->net, "Failed to read reg index 0x%08x: %d\n",
|
||||
index, ret);
|
||||
if (ret < 0) {
|
||||
if (ret != -ENODEV)
|
||||
netdev_warn(dev->net, "Failed to read reg index 0x%08x: %d\n",
|
||||
index, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -116,7 +117,7 @@ static int __must_check __smsc95xx_write_reg(struct usbnet *dev, u32 index,
|
||||
ret = fn(dev, USB_VENDOR_REQUEST_WRITE_REGISTER, USB_DIR_OUT
|
||||
| USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||
0, index, &buf, 4);
|
||||
if (unlikely(ret < 0))
|
||||
if (ret < 0 && ret != -ENODEV)
|
||||
netdev_warn(dev->net, "Failed to write reg index 0x%08x: %d\n",
|
||||
index, ret);
|
||||
|
||||
@@ -159,6 +160,9 @@ static int __must_check __smsc95xx_phy_wait_not_busy(struct usbnet *dev,
|
||||
do {
|
||||
ret = __smsc95xx_read_reg(dev, MII_ADDR, &val, in_pm);
|
||||
if (ret < 0) {
|
||||
/* Ignore -ENODEV error during disconnect() */
|
||||
if (ret == -ENODEV)
|
||||
return 0;
|
||||
netdev_warn(dev->net, "Error reading MII_ACCESS\n");
|
||||
return ret;
|
||||
}
|
||||
@@ -194,7 +198,8 @@ static int __smsc95xx_mdio_read(struct usbnet *dev, int phy_id, int idx,
|
||||
addr = mii_address_cmd(phy_id, idx, MII_READ_ | MII_BUSY_);
|
||||
ret = __smsc95xx_write_reg(dev, MII_ADDR, addr, in_pm);
|
||||
if (ret < 0) {
|
||||
netdev_warn(dev->net, "Error writing MII_ADDR\n");
|
||||
if (ret != -ENODEV)
|
||||
netdev_warn(dev->net, "Error writing MII_ADDR\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
@@ -206,7 +211,8 @@ static int __smsc95xx_mdio_read(struct usbnet *dev, int phy_id, int idx,
|
||||
|
||||
ret = __smsc95xx_read_reg(dev, MII_DATA, &val, in_pm);
|
||||
if (ret < 0) {
|
||||
netdev_warn(dev->net, "Error reading MII_DATA\n");
|
||||
if (ret != -ENODEV)
|
||||
netdev_warn(dev->net, "Error reading MII_DATA\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
@@ -214,6 +220,10 @@ static int __smsc95xx_mdio_read(struct usbnet *dev, int phy_id, int idx,
|
||||
|
||||
done:
|
||||
mutex_unlock(&dev->phy_mutex);
|
||||
|
||||
/* Ignore -ENODEV error during disconnect() */
|
||||
if (ret == -ENODEV)
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -235,7 +245,8 @@ static void __smsc95xx_mdio_write(struct usbnet *dev, int phy_id,
|
||||
val = regval;
|
||||
ret = __smsc95xx_write_reg(dev, MII_DATA, val, in_pm);
|
||||
if (ret < 0) {
|
||||
netdev_warn(dev->net, "Error writing MII_DATA\n");
|
||||
if (ret != -ENODEV)
|
||||
netdev_warn(dev->net, "Error writing MII_DATA\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
@@ -243,7 +254,8 @@ static void __smsc95xx_mdio_write(struct usbnet *dev, int phy_id,
|
||||
addr = mii_address_cmd(phy_id, idx, MII_WRITE_ | MII_BUSY_);
|
||||
ret = __smsc95xx_write_reg(dev, MII_ADDR, addr, in_pm);
|
||||
if (ret < 0) {
|
||||
netdev_warn(dev->net, "Error writing MII_ADDR\n");
|
||||
if (ret != -ENODEV)
|
||||
netdev_warn(dev->net, "Error writing MII_ADDR\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
||||
@@ -1612,7 +1612,9 @@ free_nfc_dev:
|
||||
nfc_digital_free_device(dev->nfc_digital_dev);
|
||||
|
||||
error:
|
||||
usb_kill_urb(dev->in_urb);
|
||||
usb_free_urb(dev->in_urb);
|
||||
usb_kill_urb(dev->out_urb);
|
||||
usb_free_urb(dev->out_urb);
|
||||
usb_put_dev(dev->udev);
|
||||
|
||||
|
||||
@@ -703,7 +703,7 @@ static int afs_writepages_region(struct address_space *mapping,
|
||||
struct folio *folio;
|
||||
struct page *head_page;
|
||||
ssize_t ret;
|
||||
int n;
|
||||
int n, skips = 0;
|
||||
|
||||
_enter("%llx,%llx,", start, end);
|
||||
|
||||
@@ -754,8 +754,15 @@ static int afs_writepages_region(struct address_space *mapping,
|
||||
#ifdef CONFIG_AFS_FSCACHE
|
||||
folio_wait_fscache(folio);
|
||||
#endif
|
||||
} else {
|
||||
start += folio_size(folio);
|
||||
}
|
||||
folio_put(folio);
|
||||
if (wbc->sync_mode == WB_SYNC_NONE) {
|
||||
if (skips >= 5 || need_resched())
|
||||
break;
|
||||
skips++;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,11 @@ struct cachefiles_xattr {
|
||||
static const char cachefiles_xattr_cache[] =
|
||||
XATTR_USER_PREFIX "CacheFiles.cache";
|
||||
|
||||
struct cachefiles_vol_xattr {
|
||||
__be32 reserved; /* Reserved, should be 0 */
|
||||
__u8 data[]; /* netfs volume coherency data */
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* set the state xattr on a cache file
|
||||
*/
|
||||
@@ -185,6 +190,7 @@ void cachefiles_prepare_to_write(struct fscache_cookie *cookie)
|
||||
*/
|
||||
bool cachefiles_set_volume_xattr(struct cachefiles_volume *volume)
|
||||
{
|
||||
struct cachefiles_vol_xattr *buf;
|
||||
unsigned int len = volume->vcookie->coherency_len;
|
||||
const void *p = volume->vcookie->coherency;
|
||||
struct dentry *dentry = volume->dentry;
|
||||
@@ -192,10 +198,17 @@ bool cachefiles_set_volume_xattr(struct cachefiles_volume *volume)
|
||||
|
||||
_enter("%x,#%d", volume->vcookie->debug_id, len);
|
||||
|
||||
len += sizeof(*buf);
|
||||
buf = kmalloc(len, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return false;
|
||||
buf->reserved = cpu_to_be32(0);
|
||||
memcpy(buf->data, p, len);
|
||||
|
||||
ret = cachefiles_inject_write_error();
|
||||
if (ret == 0)
|
||||
ret = vfs_setxattr(&init_user_ns, dentry, cachefiles_xattr_cache,
|
||||
p, len, 0);
|
||||
buf, len, 0);
|
||||
if (ret < 0) {
|
||||
trace_cachefiles_vfs_error(NULL, d_inode(dentry), ret,
|
||||
cachefiles_trace_setxattr_error);
|
||||
@@ -209,6 +222,7 @@ bool cachefiles_set_volume_xattr(struct cachefiles_volume *volume)
|
||||
cachefiles_coherency_vol_set_ok);
|
||||
}
|
||||
|
||||
kfree(buf);
|
||||
_leave(" = %d", ret);
|
||||
return ret == 0;
|
||||
}
|
||||
@@ -218,7 +232,7 @@ bool cachefiles_set_volume_xattr(struct cachefiles_volume *volume)
|
||||
*/
|
||||
int cachefiles_check_volume_xattr(struct cachefiles_volume *volume)
|
||||
{
|
||||
struct cachefiles_xattr *buf;
|
||||
struct cachefiles_vol_xattr *buf;
|
||||
struct dentry *dentry = volume->dentry;
|
||||
unsigned int len = volume->vcookie->coherency_len;
|
||||
const void *p = volume->vcookie->coherency;
|
||||
@@ -228,6 +242,7 @@ int cachefiles_check_volume_xattr(struct cachefiles_volume *volume)
|
||||
|
||||
_enter("");
|
||||
|
||||
len += sizeof(*buf);
|
||||
buf = kmalloc(len, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
@@ -245,7 +260,9 @@ int cachefiles_check_volume_xattr(struct cachefiles_volume *volume)
|
||||
"Failed to read xattr with error %zd", xlen);
|
||||
}
|
||||
why = cachefiles_coherency_vol_check_xattr;
|
||||
} else if (memcmp(buf->data, p, len) != 0) {
|
||||
} else if (buf->reserved != cpu_to_be32(0)) {
|
||||
why = cachefiles_coherency_vol_check_resv;
|
||||
} else if (memcmp(buf->data, p, len - sizeof(*buf)) != 0) {
|
||||
why = cachefiles_coherency_vol_check_cmp;
|
||||
} else {
|
||||
why = cachefiles_coherency_vol_check_ok;
|
||||
|
||||
11
fs/pipe.c
11
fs/pipe.c
@@ -253,7 +253,8 @@ pipe_read(struct kiocb *iocb, struct iov_iter *to)
|
||||
*/
|
||||
was_full = pipe_full(pipe->head, pipe->tail, pipe->max_usage);
|
||||
for (;;) {
|
||||
unsigned int head = pipe->head;
|
||||
/* Read ->head with a barrier vs post_one_notification() */
|
||||
unsigned int head = smp_load_acquire(&pipe->head);
|
||||
unsigned int tail = pipe->tail;
|
||||
unsigned int mask = pipe->ring_size - 1;
|
||||
|
||||
@@ -831,10 +832,8 @@ void free_pipe_info(struct pipe_inode_info *pipe)
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_WATCH_QUEUE
|
||||
if (pipe->watch_queue) {
|
||||
if (pipe->watch_queue)
|
||||
watch_queue_clear(pipe->watch_queue);
|
||||
put_watch_queue(pipe->watch_queue);
|
||||
}
|
||||
#endif
|
||||
|
||||
(void) account_pipe_buffers(pipe->user, pipe->nr_accounted, 0);
|
||||
@@ -844,6 +843,10 @@ void free_pipe_info(struct pipe_inode_info *pipe)
|
||||
if (buf->ops)
|
||||
pipe_buf_release(pipe, buf);
|
||||
}
|
||||
#ifdef CONFIG_WATCH_QUEUE
|
||||
if (pipe->watch_queue)
|
||||
put_watch_queue(pipe->watch_queue);
|
||||
#endif
|
||||
if (pipe->tmp_page)
|
||||
__free_page(pipe->tmp_page);
|
||||
kfree(pipe->bufs);
|
||||
|
||||
@@ -3434,7 +3434,6 @@ enum {
|
||||
enum {
|
||||
MLX5_TIRC_PACKET_MERGE_MASK_IPV4_LRO = BIT(0),
|
||||
MLX5_TIRC_PACKET_MERGE_MASK_IPV6_LRO = BIT(1),
|
||||
MLX5_TIRC_PACKET_MERGE_MASK_SHAMPO = BIT(2),
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -9900,8 +9899,8 @@ struct mlx5_ifc_bufferx_reg_bits {
|
||||
u8 reserved_at_0[0x6];
|
||||
u8 lossy[0x1];
|
||||
u8 epsb[0x1];
|
||||
u8 reserved_at_8[0xc];
|
||||
u8 size[0xc];
|
||||
u8 reserved_at_8[0x8];
|
||||
u8 size[0x10];
|
||||
|
||||
u8 xoff_threshold[0x10];
|
||||
u8 xon_threshold[0x10];
|
||||
|
||||
@@ -4602,6 +4602,8 @@ int skb_csum_hwoffload_help(struct sk_buff *skb,
|
||||
|
||||
struct sk_buff *__skb_gso_segment(struct sk_buff *skb,
|
||||
netdev_features_t features, bool tx_path);
|
||||
struct sk_buff *skb_eth_gso_segment(struct sk_buff *skb,
|
||||
netdev_features_t features, __be16 type);
|
||||
struct sk_buff *skb_mac_gso_segment(struct sk_buff *skb,
|
||||
netdev_features_t features);
|
||||
|
||||
|
||||
@@ -87,8 +87,8 @@ extern const int phy_10gbit_features_array[1];
|
||||
*
|
||||
* @PHY_INTERFACE_MODE_NA: Not Applicable - don't touch
|
||||
* @PHY_INTERFACE_MODE_INTERNAL: No interface, MAC and PHY combined
|
||||
* @PHY_INTERFACE_MODE_MII: Median-independent interface
|
||||
* @PHY_INTERFACE_MODE_GMII: Gigabit median-independent interface
|
||||
* @PHY_INTERFACE_MODE_MII: Media-independent interface
|
||||
* @PHY_INTERFACE_MODE_GMII: Gigabit media-independent interface
|
||||
* @PHY_INTERFACE_MODE_SGMII: Serial gigabit media-independent interface
|
||||
* @PHY_INTERFACE_MODE_TBI: Ten Bit Interface
|
||||
* @PHY_INTERFACE_MODE_REVMII: Reverse Media Independent Interface
|
||||
|
||||
@@ -28,7 +28,8 @@ struct watch_type_filter {
|
||||
struct watch_filter {
|
||||
union {
|
||||
struct rcu_head rcu;
|
||||
unsigned long type_filter[2]; /* Bitmask of accepted types */
|
||||
/* Bitmask of accepted types */
|
||||
DECLARE_BITMAP(type_filter, WATCH_TYPE__NR);
|
||||
};
|
||||
u32 nr_filters; /* Number of filters */
|
||||
struct watch_type_filter filters[];
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#define ESP_SKB_FRAG_MAXSIZE (PAGE_SIZE << SKB_FRAG_PAGE_ORDER)
|
||||
|
||||
struct ip_esp_hdr;
|
||||
|
||||
static inline struct ip_esp_hdr *ip_esp_hdr(const struct sk_buff *skb)
|
||||
|
||||
@@ -56,6 +56,7 @@ enum cachefiles_coherency_trace {
|
||||
cachefiles_coherency_set_ok,
|
||||
cachefiles_coherency_vol_check_cmp,
|
||||
cachefiles_coherency_vol_check_ok,
|
||||
cachefiles_coherency_vol_check_resv,
|
||||
cachefiles_coherency_vol_check_xattr,
|
||||
cachefiles_coherency_vol_set_fail,
|
||||
cachefiles_coherency_vol_set_ok,
|
||||
@@ -139,6 +140,7 @@ enum cachefiles_error_trace {
|
||||
EM(cachefiles_coherency_set_ok, "SET ok ") \
|
||||
EM(cachefiles_coherency_vol_check_cmp, "VOL BAD cmp ") \
|
||||
EM(cachefiles_coherency_vol_check_ok, "VOL OK ") \
|
||||
EM(cachefiles_coherency_vol_check_resv, "VOL BAD resv") \
|
||||
EM(cachefiles_coherency_vol_check_xattr,"VOL BAD xatt") \
|
||||
EM(cachefiles_coherency_vol_set_fail, "VOL SET fail") \
|
||||
E_(cachefiles_coherency_vol_set_ok, "VOL SET ok ")
|
||||
|
||||
@@ -7790,7 +7790,7 @@ int ftrace_is_dead(void)
|
||||
|
||||
/**
|
||||
* register_ftrace_function - register a function for profiling
|
||||
* @ops - ops structure that holds the function for profiling.
|
||||
* @ops: ops structure that holds the function for profiling.
|
||||
*
|
||||
* Register a function to be called by all functions in the
|
||||
* kernel.
|
||||
@@ -7817,7 +7817,7 @@ EXPORT_SYMBOL_GPL(register_ftrace_function);
|
||||
|
||||
/**
|
||||
* unregister_ftrace_function - unregister a function for profiling.
|
||||
* @ops - ops structure that holds the function to unregister
|
||||
* @ops: ops structure that holds the function to unregister
|
||||
*
|
||||
* Unregister a function that was added to be called by ftrace profiling.
|
||||
*/
|
||||
|
||||
@@ -1386,6 +1386,26 @@ static int run_osnoise(void)
|
||||
osnoise_stop_tracing();
|
||||
}
|
||||
|
||||
/*
|
||||
* In some cases, notably when running on a nohz_full CPU with
|
||||
* a stopped tick PREEMPT_RCU has no way to account for QSs.
|
||||
* This will eventually cause unwarranted noise as PREEMPT_RCU
|
||||
* will force preemption as the means of ending the current
|
||||
* grace period. We avoid this problem by calling
|
||||
* rcu_momentary_dyntick_idle(), which performs a zero duration
|
||||
* EQS allowing PREEMPT_RCU to end the current grace period.
|
||||
* This call shouldn't be wrapped inside an RCU critical
|
||||
* section.
|
||||
*
|
||||
* Note that in non PREEMPT_RCU kernels QSs are handled through
|
||||
* cond_resched()
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_PREEMPT_RCU)) {
|
||||
local_irq_disable();
|
||||
rcu_momentary_dyntick_idle();
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
* For the non-preemptive kernel config: let threads runs, if
|
||||
* they so wish.
|
||||
@@ -2200,6 +2220,17 @@ static void osnoise_workload_stop(void)
|
||||
if (osnoise_has_registered_instances())
|
||||
return;
|
||||
|
||||
/*
|
||||
* If callbacks were already disabled in a previous stop
|
||||
* call, there is no need to disable then again.
|
||||
*
|
||||
* For instance, this happens when tracing is stopped via:
|
||||
* echo 0 > tracing_on
|
||||
* echo nop > current_tracer.
|
||||
*/
|
||||
if (!trace_osnoise_callback_enabled)
|
||||
return;
|
||||
|
||||
trace_osnoise_callback_enabled = false;
|
||||
/*
|
||||
* Make sure that ftrace_nmi_enter/exit() see
|
||||
|
||||
@@ -54,6 +54,7 @@ static void watch_queue_pipe_buf_release(struct pipe_inode_info *pipe,
|
||||
bit += page->index;
|
||||
|
||||
set_bit(bit, wqueue->notes_bitmap);
|
||||
generic_pipe_buf_release(pipe, buf);
|
||||
}
|
||||
|
||||
// No try_steal function => no stealing
|
||||
@@ -112,7 +113,7 @@ static bool post_one_notification(struct watch_queue *wqueue,
|
||||
buf->offset = offset;
|
||||
buf->len = len;
|
||||
buf->flags = PIPE_BUF_FLAG_WHOLE;
|
||||
pipe->head = head + 1;
|
||||
smp_store_release(&pipe->head, head + 1); /* vs pipe_read() */
|
||||
|
||||
if (!test_and_clear_bit(note, wqueue->notes_bitmap)) {
|
||||
spin_unlock_irq(&pipe->rd_wait.lock);
|
||||
@@ -219,7 +220,6 @@ long watch_queue_set_size(struct pipe_inode_info *pipe, unsigned int nr_notes)
|
||||
struct page **pages;
|
||||
unsigned long *bitmap;
|
||||
unsigned long user_bufs;
|
||||
unsigned int bmsize;
|
||||
int ret, i, nr_pages;
|
||||
|
||||
if (!wqueue)
|
||||
@@ -243,7 +243,8 @@ long watch_queue_set_size(struct pipe_inode_info *pipe, unsigned int nr_notes)
|
||||
goto error;
|
||||
}
|
||||
|
||||
ret = pipe_resize_ring(pipe, nr_notes);
|
||||
nr_notes = nr_pages * WATCH_QUEUE_NOTES_PER_PAGE;
|
||||
ret = pipe_resize_ring(pipe, roundup_pow_of_two(nr_notes));
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
@@ -258,17 +259,15 @@ long watch_queue_set_size(struct pipe_inode_info *pipe, unsigned int nr_notes)
|
||||
pages[i]->index = i * WATCH_QUEUE_NOTES_PER_PAGE;
|
||||
}
|
||||
|
||||
bmsize = (nr_notes + BITS_PER_LONG - 1) / BITS_PER_LONG;
|
||||
bmsize *= sizeof(unsigned long);
|
||||
bitmap = kmalloc(bmsize, GFP_KERNEL);
|
||||
bitmap = bitmap_alloc(nr_notes, GFP_KERNEL);
|
||||
if (!bitmap)
|
||||
goto error_p;
|
||||
|
||||
memset(bitmap, 0xff, bmsize);
|
||||
bitmap_fill(bitmap, nr_notes);
|
||||
wqueue->notes = pages;
|
||||
wqueue->notes_bitmap = bitmap;
|
||||
wqueue->nr_pages = nr_pages;
|
||||
wqueue->nr_notes = nr_pages * WATCH_QUEUE_NOTES_PER_PAGE;
|
||||
wqueue->nr_notes = nr_notes;
|
||||
return 0;
|
||||
|
||||
error_p:
|
||||
@@ -320,7 +319,7 @@ long watch_queue_set_filter(struct pipe_inode_info *pipe,
|
||||
tf[i].info_mask & WATCH_INFO_LENGTH)
|
||||
goto err_filter;
|
||||
/* Ignore any unknown types */
|
||||
if (tf[i].type >= sizeof(wfilter->type_filter) * 8)
|
||||
if (tf[i].type >= WATCH_TYPE__NR)
|
||||
continue;
|
||||
nr_filter++;
|
||||
}
|
||||
@@ -336,7 +335,7 @@ long watch_queue_set_filter(struct pipe_inode_info *pipe,
|
||||
|
||||
q = wfilter->filters;
|
||||
for (i = 0; i < filter.nr_filters; i++) {
|
||||
if (tf[i].type >= sizeof(wfilter->type_filter) * BITS_PER_LONG)
|
||||
if (tf[i].type >= WATCH_TYPE__NR)
|
||||
continue;
|
||||
|
||||
q->type = tf[i].type;
|
||||
@@ -371,6 +370,7 @@ static void __put_watch_queue(struct kref *kref)
|
||||
|
||||
for (i = 0; i < wqueue->nr_pages; i++)
|
||||
__free_page(wqueue->notes[i]);
|
||||
bitmap_free(wqueue->notes_bitmap);
|
||||
|
||||
wfilter = rcu_access_pointer(wqueue->filter);
|
||||
if (wfilter)
|
||||
@@ -566,7 +566,7 @@ void watch_queue_clear(struct watch_queue *wqueue)
|
||||
rcu_read_lock();
|
||||
spin_lock_bh(&wqueue->lock);
|
||||
|
||||
/* Prevent new additions and prevent notifications from happening */
|
||||
/* Prevent new notifications from being stored. */
|
||||
wqueue->defunct = true;
|
||||
|
||||
while (!hlist_empty(&wqueue->watches)) {
|
||||
|
||||
@@ -87,6 +87,13 @@ again:
|
||||
ax25_for_each(s, &ax25_list) {
|
||||
if (s->ax25_dev == ax25_dev) {
|
||||
sk = s->sk;
|
||||
if (!sk) {
|
||||
spin_unlock_bh(&ax25_list_lock);
|
||||
s->ax25_dev = NULL;
|
||||
ax25_disconnect(s, ENETUNREACH);
|
||||
spin_lock_bh(&ax25_list_lock);
|
||||
goto again;
|
||||
}
|
||||
sock_hold(sk);
|
||||
spin_unlock_bh(&ax25_list_lock);
|
||||
lock_sock(sk);
|
||||
|
||||
@@ -276,40 +276,37 @@ EXPORT_SYMBOL(__hci_cmd_sync_status);
|
||||
static void hci_cmd_sync_work(struct work_struct *work)
|
||||
{
|
||||
struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_sync_work);
|
||||
struct hci_cmd_sync_work_entry *entry;
|
||||
hci_cmd_sync_work_func_t func;
|
||||
hci_cmd_sync_work_destroy_t destroy;
|
||||
void *data;
|
||||
|
||||
bt_dev_dbg(hdev, "");
|
||||
|
||||
mutex_lock(&hdev->cmd_sync_work_lock);
|
||||
entry = list_first_entry(&hdev->cmd_sync_work_list,
|
||||
struct hci_cmd_sync_work_entry, list);
|
||||
if (entry) {
|
||||
list_del(&entry->list);
|
||||
func = entry->func;
|
||||
data = entry->data;
|
||||
destroy = entry->destroy;
|
||||
/* Dequeue all entries and run them */
|
||||
while (1) {
|
||||
struct hci_cmd_sync_work_entry *entry;
|
||||
|
||||
mutex_lock(&hdev->cmd_sync_work_lock);
|
||||
entry = list_first_entry_or_null(&hdev->cmd_sync_work_list,
|
||||
struct hci_cmd_sync_work_entry,
|
||||
list);
|
||||
if (entry)
|
||||
list_del(&entry->list);
|
||||
mutex_unlock(&hdev->cmd_sync_work_lock);
|
||||
|
||||
if (!entry)
|
||||
break;
|
||||
|
||||
bt_dev_dbg(hdev, "entry %p", entry);
|
||||
|
||||
if (entry->func) {
|
||||
int err;
|
||||
|
||||
hci_req_sync_lock(hdev);
|
||||
err = entry->func(hdev, entry->data);
|
||||
if (entry->destroy)
|
||||
entry->destroy(hdev, entry->data, err);
|
||||
hci_req_sync_unlock(hdev);
|
||||
}
|
||||
|
||||
kfree(entry);
|
||||
} else {
|
||||
func = NULL;
|
||||
data = NULL;
|
||||
destroy = NULL;
|
||||
}
|
||||
mutex_unlock(&hdev->cmd_sync_work_lock);
|
||||
|
||||
if (func) {
|
||||
int err;
|
||||
|
||||
hci_req_sync_lock(hdev);
|
||||
|
||||
err = func(hdev, data);
|
||||
|
||||
if (destroy)
|
||||
destroy(hdev, data, err);
|
||||
|
||||
hci_req_sync_unlock(hdev);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4541,9 +4541,9 @@ static int set_device_flags(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
hci_dev_unlock(hdev);
|
||||
|
||||
done:
|
||||
if (status == MGMT_STATUS_SUCCESS)
|
||||
device_flags_changed(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
|
||||
supported_flags, current_flags);
|
||||
|
||||
@@ -92,6 +92,31 @@ void dev_remove_offload(struct packet_offload *po)
|
||||
}
|
||||
EXPORT_SYMBOL(dev_remove_offload);
|
||||
|
||||
/**
|
||||
* skb_eth_gso_segment - segmentation handler for ethernet protocols.
|
||||
* @skb: buffer to segment
|
||||
* @features: features for the output path (see dev->features)
|
||||
* @type: Ethernet Protocol ID
|
||||
*/
|
||||
struct sk_buff *skb_eth_gso_segment(struct sk_buff *skb,
|
||||
netdev_features_t features, __be16 type)
|
||||
{
|
||||
struct sk_buff *segs = ERR_PTR(-EPROTONOSUPPORT);
|
||||
struct packet_offload *ptype;
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(ptype, &offload_base, list) {
|
||||
if (ptype->type == type && ptype->callbacks.gso_segment) {
|
||||
segs = ptype->callbacks.gso_segment(skb, features);
|
||||
break;
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
return segs;
|
||||
}
|
||||
EXPORT_SYMBOL(skb_eth_gso_segment);
|
||||
|
||||
/**
|
||||
* skb_mac_gso_segment - mac layer segmentation handler.
|
||||
* @skb: buffer to segment
|
||||
|
||||
@@ -357,7 +357,8 @@ int xdp_rxq_info_reg_mem_model(struct xdp_rxq_info *xdp_rxq,
|
||||
if (IS_ERR(xdp_alloc))
|
||||
return PTR_ERR(xdp_alloc);
|
||||
|
||||
trace_mem_connect(xdp_alloc, xdp_rxq);
|
||||
if (trace_mem_connect_enabled() && xdp_alloc)
|
||||
trace_mem_connect(xdp_alloc, xdp_rxq);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1058,7 +1058,7 @@ static int dsa_tree_setup_switches(struct dsa_switch_tree *dst)
|
||||
static int dsa_tree_setup_master(struct dsa_switch_tree *dst)
|
||||
{
|
||||
struct dsa_port *dp;
|
||||
int err;
|
||||
int err = 0;
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
@@ -1066,13 +1066,13 @@ static int dsa_tree_setup_master(struct dsa_switch_tree *dst)
|
||||
if (dsa_port_is_cpu(dp)) {
|
||||
err = dsa_master_setup(dp->master, dp);
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
rtnl_unlock();
|
||||
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
static void dsa_tree_teardown_master(struct dsa_switch_tree *dst)
|
||||
|
||||
@@ -446,6 +446,7 @@ int esp_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info *
|
||||
struct page *page;
|
||||
struct sk_buff *trailer;
|
||||
int tailen = esp->tailen;
|
||||
unsigned int allocsz;
|
||||
|
||||
/* this is non-NULL only with TCP/UDP Encapsulation */
|
||||
if (x->encap) {
|
||||
@@ -455,6 +456,10 @@ int esp_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info *
|
||||
return err;
|
||||
}
|
||||
|
||||
allocsz = ALIGN(skb->data_len + tailen, L1_CACHE_BYTES);
|
||||
if (allocsz > ESP_SKB_FRAG_MAXSIZE)
|
||||
goto cow;
|
||||
|
||||
if (!skb_cloned(skb)) {
|
||||
if (tailen <= skb_tailroom(skb)) {
|
||||
nfrags = 1;
|
||||
|
||||
@@ -110,8 +110,7 @@ static struct sk_buff *xfrm4_tunnel_gso_segment(struct xfrm_state *x,
|
||||
struct sk_buff *skb,
|
||||
netdev_features_t features)
|
||||
{
|
||||
__skb_push(skb, skb->mac_len);
|
||||
return skb_mac_gso_segment(skb, features);
|
||||
return skb_eth_gso_segment(skb, features, htons(ETH_P_IP));
|
||||
}
|
||||
|
||||
static struct sk_buff *xfrm4_transport_gso_segment(struct xfrm_state *x,
|
||||
@@ -160,6 +159,9 @@ static struct sk_buff *xfrm4_beet_gso_segment(struct xfrm_state *x,
|
||||
skb_shinfo(skb)->gso_type |= SKB_GSO_TCPV4;
|
||||
}
|
||||
|
||||
if (proto == IPPROTO_IPV6)
|
||||
skb_shinfo(skb)->gso_type |= SKB_GSO_IPXIP4;
|
||||
|
||||
__skb_pull(skb, skb_transport_offset(skb));
|
||||
ops = rcu_dereference(inet_offloads[proto]);
|
||||
if (likely(ops && ops->callbacks.gso_segment))
|
||||
|
||||
@@ -482,6 +482,7 @@ int esp6_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info
|
||||
struct page *page;
|
||||
struct sk_buff *trailer;
|
||||
int tailen = esp->tailen;
|
||||
unsigned int allocsz;
|
||||
|
||||
if (x->encap) {
|
||||
int err = esp6_output_encap(x, skb, esp);
|
||||
@@ -490,6 +491,10 @@ int esp6_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info
|
||||
return err;
|
||||
}
|
||||
|
||||
allocsz = ALIGN(skb->data_len + tailen, L1_CACHE_BYTES);
|
||||
if (allocsz > ESP_SKB_FRAG_MAXSIZE)
|
||||
goto cow;
|
||||
|
||||
if (!skb_cloned(skb)) {
|
||||
if (tailen <= skb_tailroom(skb)) {
|
||||
nfrags = 1;
|
||||
|
||||
@@ -145,8 +145,7 @@ static struct sk_buff *xfrm6_tunnel_gso_segment(struct xfrm_state *x,
|
||||
struct sk_buff *skb,
|
||||
netdev_features_t features)
|
||||
{
|
||||
__skb_push(skb, skb->mac_len);
|
||||
return skb_mac_gso_segment(skb, features);
|
||||
return skb_eth_gso_segment(skb, features, htons(ETH_P_IPV6));
|
||||
}
|
||||
|
||||
static struct sk_buff *xfrm6_transport_gso_segment(struct xfrm_state *x,
|
||||
@@ -199,6 +198,9 @@ static struct sk_buff *xfrm6_beet_gso_segment(struct xfrm_state *x,
|
||||
ipv6_skip_exthdr(skb, 0, &proto, &frag);
|
||||
}
|
||||
|
||||
if (proto == IPPROTO_IPIP)
|
||||
skb_shinfo(skb)->gso_type |= SKB_GSO_IPXIP6;
|
||||
|
||||
__skb_pull(skb, skb_transport_offset(skb));
|
||||
ops = rcu_dereference(inet6_offloads[proto]);
|
||||
if (likely(ops && ops->callbacks.gso_segment))
|
||||
|
||||
@@ -45,6 +45,19 @@ static int __xfrm6_output_finish(struct net *net, struct sock *sk, struct sk_buf
|
||||
return xfrm_output(sk, skb);
|
||||
}
|
||||
|
||||
static int xfrm6_noneed_fragment(struct sk_buff *skb)
|
||||
{
|
||||
struct frag_hdr *fh;
|
||||
u8 prevhdr = ipv6_hdr(skb)->nexthdr;
|
||||
|
||||
if (prevhdr != NEXTHDR_FRAGMENT)
|
||||
return 0;
|
||||
fh = (struct frag_hdr *)(skb->data + sizeof(struct ipv6hdr));
|
||||
if (fh->nexthdr == NEXTHDR_ESP || fh->nexthdr == NEXTHDR_AUTH)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
@@ -73,6 +86,9 @@ static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
xfrm6_local_rxpmtu(skb, mtu);
|
||||
kfree_skb(skb);
|
||||
return -EMSGSIZE;
|
||||
} else if (toobig && xfrm6_noneed_fragment(skb)) {
|
||||
skb->ignore_df = 1;
|
||||
goto skip_frag;
|
||||
} else if (!skb->ignore_df && toobig && skb->sk) {
|
||||
xfrm_local_error(skb, mtu);
|
||||
kfree_skb(skb);
|
||||
|
||||
@@ -61,10 +61,6 @@ static void inet_diag_msg_sctpasoc_fill(struct inet_diag_msg *r,
|
||||
r->idiag_timer = SCTP_EVENT_TIMEOUT_T3_RTX;
|
||||
r->idiag_retrans = asoc->rtx_data_chunks;
|
||||
r->idiag_expires = jiffies_to_msecs(t3_rtx->expires - jiffies);
|
||||
} else {
|
||||
r->idiag_timer = 0;
|
||||
r->idiag_retrans = 0;
|
||||
r->idiag_expires = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,13 +140,14 @@ static int inet_sctp_diag_fill(struct sock *sk, struct sctp_association *asoc,
|
||||
r = nlmsg_data(nlh);
|
||||
BUG_ON(!sk_fullsock(sk));
|
||||
|
||||
r->idiag_timer = 0;
|
||||
r->idiag_retrans = 0;
|
||||
r->idiag_expires = 0;
|
||||
if (asoc) {
|
||||
inet_diag_msg_sctpasoc_fill(r, sk, asoc);
|
||||
} else {
|
||||
inet_diag_msg_common_fill(r, sk);
|
||||
r->idiag_state = sk->sk_state;
|
||||
r->idiag_timer = 0;
|
||||
r->idiag_retrans = 0;
|
||||
}
|
||||
|
||||
if (inet_diag_msg_attrs_fill(sk, skb, r, ext, user_ns, net_admin))
|
||||
|
||||
@@ -352,16 +352,18 @@ static int tipc_enable_bearer(struct net *net, const char *name,
|
||||
goto rejected;
|
||||
}
|
||||
|
||||
/* Create monitoring data before accepting activate messages */
|
||||
if (tipc_mon_create(net, bearer_id)) {
|
||||
bearer_disable(net, b);
|
||||
kfree_skb(skb);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
test_and_set_bit_lock(0, &b->up);
|
||||
rcu_assign_pointer(tn->bearer_list[bearer_id], b);
|
||||
if (skb)
|
||||
tipc_bearer_xmit_skb(net, bearer_id, skb, &b->bcast_addr);
|
||||
|
||||
if (tipc_mon_create(net, bearer_id)) {
|
||||
bearer_disable(net, b);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pr_info("Enabled bearer <%s>, priority %u\n", name, prio);
|
||||
|
||||
return res;
|
||||
|
||||
@@ -2286,6 +2286,11 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
|
||||
break;
|
||||
|
||||
case STATE_MSG:
|
||||
/* Validate Gap ACK blocks, drop if invalid */
|
||||
glen = tipc_get_gap_ack_blks(&ga, l, hdr, true);
|
||||
if (glen > dlen)
|
||||
break;
|
||||
|
||||
l->rcv_nxt_state = msg_seqno(hdr) + 1;
|
||||
|
||||
/* Update own tolerance if peer indicates a non-zero value */
|
||||
@@ -2311,10 +2316,6 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
|
||||
break;
|
||||
}
|
||||
|
||||
/* Receive Gap ACK blocks from peer if any */
|
||||
glen = tipc_get_gap_ack_blks(&ga, l, hdr, true);
|
||||
if(glen > dlen)
|
||||
break;
|
||||
tipc_mon_rcv(l->net, data + glen, dlen - glen, l->addr,
|
||||
&l->mon_state, l->bearer_id);
|
||||
|
||||
|
||||
@@ -304,7 +304,10 @@ xfrmi_xmit2(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)
|
||||
if (mtu < IPV6_MIN_MTU)
|
||||
mtu = IPV6_MIN_MTU;
|
||||
|
||||
icmpv6_ndo_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
|
||||
if (skb->len > 1280)
|
||||
icmpv6_ndo_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
|
||||
else
|
||||
goto xmit;
|
||||
} else {
|
||||
if (!(ip_hdr(skb)->frag_off & htons(IP_DF)))
|
||||
goto xmit;
|
||||
|
||||
@@ -630,13 +630,8 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,
|
||||
|
||||
xfrm_smark_init(attrs, &x->props.smark);
|
||||
|
||||
if (attrs[XFRMA_IF_ID]) {
|
||||
if (attrs[XFRMA_IF_ID])
|
||||
x->if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
|
||||
if (!x->if_id) {
|
||||
err = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
err = __xfrm_init_state(x, false, attrs[XFRMA_OFFLOAD_DEV]);
|
||||
if (err)
|
||||
@@ -1432,13 +1427,8 @@ static int xfrm_alloc_userspi(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||
|
||||
mark = xfrm_mark_get(attrs, &m);
|
||||
|
||||
if (attrs[XFRMA_IF_ID]) {
|
||||
if (attrs[XFRMA_IF_ID])
|
||||
if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
|
||||
if (!if_id) {
|
||||
err = -EINVAL;
|
||||
goto out_noput;
|
||||
}
|
||||
}
|
||||
|
||||
if (p->info.seq) {
|
||||
x = xfrm_find_acq_byseq(net, mark, p->info.seq);
|
||||
@@ -1751,13 +1741,8 @@ static struct xfrm_policy *xfrm_policy_construct(struct net *net, struct xfrm_us
|
||||
|
||||
xfrm_mark_get(attrs, &xp->mark);
|
||||
|
||||
if (attrs[XFRMA_IF_ID]) {
|
||||
if (attrs[XFRMA_IF_ID])
|
||||
xp->if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
|
||||
if (!xp->if_id) {
|
||||
err = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
return xp;
|
||||
error:
|
||||
|
||||
@@ -374,6 +374,16 @@ run_cmd() {
|
||||
return $rc
|
||||
}
|
||||
|
||||
run_cmd_bg() {
|
||||
cmd="$*"
|
||||
|
||||
if [ "$VERBOSE" = "1" ]; then
|
||||
printf " COMMAND: %s &\n" "${cmd}"
|
||||
fi
|
||||
|
||||
$cmd 2>&1 &
|
||||
}
|
||||
|
||||
# Find the auto-generated name for this namespace
|
||||
nsname() {
|
||||
eval echo \$NS_$1
|
||||
@@ -670,10 +680,10 @@ setup_nettest_xfrm() {
|
||||
[ ${1} -eq 6 ] && proto="-6" || proto=""
|
||||
port=${2}
|
||||
|
||||
run_cmd ${ns_a} nettest ${proto} -q -D -s -x -p ${port} -t 5 &
|
||||
run_cmd_bg "${ns_a}" nettest "${proto}" -q -D -s -x -p "${port}" -t 5
|
||||
nettest_pids="${nettest_pids} $!"
|
||||
|
||||
run_cmd ${ns_b} nettest ${proto} -q -D -s -x -p ${port} -t 5 &
|
||||
run_cmd_bg "${ns_b}" nettest "${proto}" -q -D -s -x -p "${port}" -t 5
|
||||
nettest_pids="${nettest_pids} $!"
|
||||
}
|
||||
|
||||
@@ -865,7 +875,6 @@ setup_ovs_bridge() {
|
||||
setup() {
|
||||
[ "$(id -u)" -ne 0 ] && echo " need to run as root" && return $ksft_skip
|
||||
|
||||
cleanup
|
||||
for arg do
|
||||
eval setup_${arg} || { echo " ${arg} not supported"; return 1; }
|
||||
done
|
||||
@@ -876,7 +885,7 @@ trace() {
|
||||
|
||||
for arg do
|
||||
[ "${ns_cmd}" = "" ] && ns_cmd="${arg}" && continue
|
||||
${ns_cmd} tcpdump -s 0 -i "${arg}" -w "${name}_${arg}.pcap" 2> /dev/null &
|
||||
${ns_cmd} tcpdump --immediate-mode -s 0 -i "${arg}" -w "${name}_${arg}.pcap" 2> /dev/null &
|
||||
tcpdump_pids="${tcpdump_pids} $!"
|
||||
ns_cmd=
|
||||
done
|
||||
@@ -1836,6 +1845,10 @@ run_test() {
|
||||
|
||||
unset IFS
|
||||
|
||||
# Since cleanup() relies on variables modified by this subshell, it
|
||||
# has to run in this context.
|
||||
trap cleanup EXIT
|
||||
|
||||
if [ "$VERBOSE" = "1" ]; then
|
||||
printf "\n##########################################################################\n\n"
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user