Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Conflicts: drivers/net/ethernet/mellanox/mlx5/core/en_tc.c 6e9d51b1a5cb ("net/mlx5e: Initialize link speed to zero") 1bffcea42926 ("net/mlx5e: Add devlink hairpin queues parameters") https://lore.kernel.org/all/20230324120623.4ebbc66f@canb.auug.org.au/ https://lore.kernel.org/all/20230321211135.47711-1-saeed@kernel.org/ Adjacent changes: drivers/net/phy/phy.c 323fe43cf9ae ("net: phy: Improved PHY error reporting in state machine") 4203d84032e2 ("net: phy: Ensure state transitions are processed from phy_stop()") Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
dc0a7b5200
1
.gitignore
vendored
1
.gitignore
vendored
@ -78,6 +78,7 @@ modules.order
|
||||
# RPM spec file (make rpm-pkg)
|
||||
#
|
||||
/*.spec
|
||||
/rpmbuild/
|
||||
|
||||
#
|
||||
# Debian directory (make deb-pkg)
|
||||
|
@ -23,10 +23,13 @@ metadata is supported, this set will grow:
|
||||
An XDP program can use these kfuncs to read the metadata into stack
|
||||
variables for its own consumption. Or, to pass the metadata on to other
|
||||
consumers, an XDP program can store it into the metadata area carried
|
||||
ahead of the packet.
|
||||
ahead of the packet. Not all packets will necessary have the requested
|
||||
metadata available in which case the driver returns ``-ENODATA``.
|
||||
|
||||
Not all kfuncs have to be implemented by the device driver; when not
|
||||
implemented, the default ones that return ``-EOPNOTSUPP`` will be used.
|
||||
implemented, the default ones that return ``-EOPNOTSUPP`` will be used
|
||||
to indicate the device driver have not implemented this kfunc.
|
||||
|
||||
|
||||
Within an XDP frame, the metadata layout (accessed via ``xdp_buff``) is
|
||||
as follows::
|
||||
|
@ -19157,9 +19157,7 @@ W: http://www.brownhat.org/sis900.html
|
||||
F: drivers/net/ethernet/sis/sis900.*
|
||||
|
||||
SIS FRAMEBUFFER DRIVER
|
||||
M: Thomas Winischhofer <thomas@winischhofer.net>
|
||||
S: Maintained
|
||||
W: http://www.winischhofer.net/linuxsisvga.shtml
|
||||
S: Orphan
|
||||
F: Documentation/fb/sisfb.rst
|
||||
F: drivers/video/fbdev/sis/
|
||||
F: include/video/sisfb.h
|
||||
|
13
Makefile
13
Makefile
@ -2,7 +2,7 @@
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 3
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc2
|
||||
EXTRAVERSION = -rc3
|
||||
NAME = Hurr durr I'ma ninja sloth
|
||||
|
||||
# *DOCUMENTATION*
|
||||
@ -274,8 +274,7 @@ no-dot-config-targets := $(clean-targets) \
|
||||
cscope gtags TAGS tags help% %docs check% coccicheck \
|
||||
$(version_h) headers headers_% archheaders archscripts \
|
||||
%asm-generic kernelversion %src-pkg dt_binding_check \
|
||||
outputmakefile rustavailable rustfmt rustfmtcheck \
|
||||
scripts_package
|
||||
outputmakefile rustavailable rustfmt rustfmtcheck
|
||||
# Installation targets should not require compiler. Unfortunately, vdso_install
|
||||
# is an exception where build artifacts may be updated. This must be fixed.
|
||||
no-compiler-targets := $(no-dot-config-targets) install dtbs_install \
|
||||
@ -1605,7 +1604,7 @@ MRPROPER_FILES += include/config include/generated \
|
||||
certs/signing_key.pem \
|
||||
certs/x509.genkey \
|
||||
vmlinux-gdb.py \
|
||||
*.spec \
|
||||
*.spec rpmbuild \
|
||||
rust/libmacros.so
|
||||
|
||||
# clean - Delete most, but leave enough to build external modules
|
||||
@ -1656,10 +1655,6 @@ distclean: mrproper
|
||||
%pkg: include/config/kernel.release FORCE
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.package $@
|
||||
|
||||
PHONY += scripts_package
|
||||
scripts_package: scripts_basic
|
||||
$(Q)$(MAKE) $(build)=scripts scripts/list-gitignored
|
||||
|
||||
# Brief documentation of the typical targets used
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@ -1886,6 +1881,8 @@ endif
|
||||
|
||||
else # KBUILD_EXTMOD
|
||||
|
||||
filechk_kernel.release = echo $(KERNELRELEASE)
|
||||
|
||||
###
|
||||
# External module support.
|
||||
# When building external modules the kernel used as basis is considered
|
||||
|
@ -116,7 +116,7 @@ __copy_to_user_memcpy(void __user *to, const void *from, unsigned long n)
|
||||
tocopy = n;
|
||||
|
||||
ua_flags = uaccess_save_and_enable();
|
||||
memcpy((void *)to, from, tocopy);
|
||||
__memcpy((void *)to, from, tocopy);
|
||||
uaccess_restore(ua_flags);
|
||||
to += tocopy;
|
||||
from += tocopy;
|
||||
@ -178,7 +178,7 @@ __clear_user_memset(void __user *addr, unsigned long n)
|
||||
tocopy = n;
|
||||
|
||||
ua_flags = uaccess_save_and_enable();
|
||||
memset((void *)addr, 0, tocopy);
|
||||
__memset((void *)addr, 0, tocopy);
|
||||
uaccess_restore(ua_flags);
|
||||
addr += tocopy;
|
||||
n -= tocopy;
|
||||
|
@ -128,8 +128,9 @@ struct snp_psc_desc {
|
||||
struct psc_entry entries[VMGEXIT_PSC_MAX_ENTRY];
|
||||
} __packed;
|
||||
|
||||
/* Guest message request error code */
|
||||
/* Guest message request error codes */
|
||||
#define SNP_GUEST_REQ_INVALID_LEN BIT_ULL(32)
|
||||
#define SNP_GUEST_REQ_ERR_BUSY BIT_ULL(33)
|
||||
|
||||
#define GHCB_MSR_TERM_REQ 0x100
|
||||
#define GHCB_MSR_TERM_REASON_SET_POS 12
|
||||
|
@ -2355,6 +2355,7 @@ static void mce_restart(void)
|
||||
{
|
||||
mce_timer_delete_all();
|
||||
on_each_cpu(mce_cpu_restart, NULL, 1);
|
||||
mce_schedule_work();
|
||||
}
|
||||
|
||||
/* Toggle features for corrected errors */
|
||||
|
@ -368,7 +368,6 @@ ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of,
|
||||
{
|
||||
struct resctrl_schema *s;
|
||||
struct rdtgroup *rdtgrp;
|
||||
struct rdt_domain *dom;
|
||||
struct rdt_resource *r;
|
||||
char *tok, *resname;
|
||||
int ret = 0;
|
||||
@ -397,10 +396,7 @@ ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of,
|
||||
goto out;
|
||||
}
|
||||
|
||||
list_for_each_entry(s, &resctrl_schema_all, list) {
|
||||
list_for_each_entry(dom, &s->res->domains, list)
|
||||
memset(dom->staged_config, 0, sizeof(dom->staged_config));
|
||||
}
|
||||
rdt_staged_configs_clear();
|
||||
|
||||
while ((tok = strsep(&buf, "\n")) != NULL) {
|
||||
resname = strim(strsep(&tok, ":"));
|
||||
@ -445,6 +441,7 @@ ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of,
|
||||
}
|
||||
|
||||
out:
|
||||
rdt_staged_configs_clear();
|
||||
rdtgroup_kn_unlock(of->kn);
|
||||
cpus_read_unlock();
|
||||
return ret ?: nbytes;
|
||||
|
@ -555,5 +555,6 @@ void __check_limbo(struct rdt_domain *d, bool force_free);
|
||||
void rdt_domain_reconfigure_cdp(struct rdt_resource *r);
|
||||
void __init thread_throttle_mode_init(void);
|
||||
void __init mbm_config_rftype_init(const char *config);
|
||||
void rdt_staged_configs_clear(void);
|
||||
|
||||
#endif /* _ASM_X86_RESCTRL_INTERNAL_H */
|
||||
|
@ -78,6 +78,19 @@ void rdt_last_cmd_printf(const char *fmt, ...)
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void rdt_staged_configs_clear(void)
|
||||
{
|
||||
struct rdt_resource *r;
|
||||
struct rdt_domain *dom;
|
||||
|
||||
lockdep_assert_held(&rdtgroup_mutex);
|
||||
|
||||
for_each_alloc_capable_rdt_resource(r) {
|
||||
list_for_each_entry(dom, &r->domains, list)
|
||||
memset(dom->staged_config, 0, sizeof(dom->staged_config));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Trivial allocator for CLOSIDs. Since h/w only supports a small number,
|
||||
* we can keep a bitmap of free CLOSIDs in a single integer.
|
||||
@ -3107,7 +3120,9 @@ static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
|
||||
{
|
||||
struct resctrl_schema *s;
|
||||
struct rdt_resource *r;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
rdt_staged_configs_clear();
|
||||
|
||||
list_for_each_entry(s, &resctrl_schema_all, list) {
|
||||
r = s->res;
|
||||
@ -3119,20 +3134,22 @@ static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
|
||||
} else {
|
||||
ret = rdtgroup_init_cat(s, rdtgrp->closid);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = resctrl_arch_update_domains(r, rdtgrp->closid);
|
||||
if (ret < 0) {
|
||||
rdt_last_cmd_puts("Failed to initialize allocations\n");
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
rdtgrp->mode = RDT_MODE_SHAREABLE;
|
||||
|
||||
return 0;
|
||||
out:
|
||||
rdt_staged_configs_clear();
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,
|
||||
|
@ -2183,9 +2183,6 @@ int snp_issue_guest_request(u64 exit_code, struct snp_req_data *input, unsigned
|
||||
struct ghcb *ghcb;
|
||||
int ret;
|
||||
|
||||
if (!cc_platform_has(CC_ATTR_GUEST_SEV_SNP))
|
||||
return -ENODEV;
|
||||
|
||||
if (!fw_err)
|
||||
return -EINVAL;
|
||||
|
||||
@ -2212,15 +2209,26 @@ int snp_issue_guest_request(u64 exit_code, struct snp_req_data *input, unsigned
|
||||
if (ret)
|
||||
goto e_put;
|
||||
|
||||
if (ghcb->save.sw_exit_info_2) {
|
||||
*fw_err = ghcb->save.sw_exit_info_2;
|
||||
switch (*fw_err) {
|
||||
case 0:
|
||||
break;
|
||||
|
||||
case SNP_GUEST_REQ_ERR_BUSY:
|
||||
ret = -EAGAIN;
|
||||
break;
|
||||
|
||||
case SNP_GUEST_REQ_INVALID_LEN:
|
||||
/* Number of expected pages are returned in RBX */
|
||||
if (exit_code == SVM_VMGEXIT_EXT_GUEST_REQUEST &&
|
||||
ghcb->save.sw_exit_info_2 == SNP_GUEST_REQ_INVALID_LEN)
|
||||
if (exit_code == SVM_VMGEXIT_EXT_GUEST_REQUEST) {
|
||||
input->data_npages = ghcb_get_rbx(ghcb);
|
||||
|
||||
*fw_err = ghcb->save.sw_exit_info_2;
|
||||
|
||||
ret = -ENOSPC;
|
||||
break;
|
||||
}
|
||||
fallthrough;
|
||||
default:
|
||||
ret = -EIO;
|
||||
break;
|
||||
}
|
||||
|
||||
e_put:
|
||||
|
@ -600,7 +600,8 @@ void __init sme_enable(struct boot_params *bp)
|
||||
cmdline_ptr = (const char *)((u64)bp->hdr.cmd_line_ptr |
|
||||
((u64)bp->ext_cmd_line_ptr << 32));
|
||||
|
||||
cmdline_find_option(cmdline_ptr, cmdline_arg, buffer, sizeof(buffer));
|
||||
if (cmdline_find_option(cmdline_ptr, cmdline_arg, buffer, sizeof(buffer)) < 0)
|
||||
return;
|
||||
|
||||
if (!strncmp(buffer, cmdline_on, sizeof(buffer)))
|
||||
sme_me_mask = me_mask;
|
||||
|
@ -79,16 +79,16 @@ static int pkcs7_digest(struct pkcs7_message *pkcs7,
|
||||
}
|
||||
|
||||
if (sinfo->msgdigest_len != sig->digest_size) {
|
||||
pr_debug("Sig %u: Invalid digest size (%u)\n",
|
||||
sinfo->index, sinfo->msgdigest_len);
|
||||
pr_warn("Sig %u: Invalid digest size (%u)\n",
|
||||
sinfo->index, sinfo->msgdigest_len);
|
||||
ret = -EBADMSG;
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (memcmp(sig->digest, sinfo->msgdigest,
|
||||
sinfo->msgdigest_len) != 0) {
|
||||
pr_debug("Sig %u: Message digest doesn't match\n",
|
||||
sinfo->index);
|
||||
pr_warn("Sig %u: Message digest doesn't match\n",
|
||||
sinfo->index);
|
||||
ret = -EKEYREJECTED;
|
||||
goto error;
|
||||
}
|
||||
@ -478,7 +478,7 @@ int pkcs7_supply_detached_data(struct pkcs7_message *pkcs7,
|
||||
const void *data, size_t datalen)
|
||||
{
|
||||
if (pkcs7->data) {
|
||||
pr_debug("Data already supplied\n");
|
||||
pr_warn("Data already supplied\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
pkcs7->data = data;
|
||||
|
@ -74,7 +74,7 @@ static int pefile_parse_binary(const void *pebuf, unsigned int pelen,
|
||||
break;
|
||||
|
||||
default:
|
||||
pr_debug("Unknown PEOPT magic = %04hx\n", pe32->magic);
|
||||
pr_warn("Unknown PEOPT magic = %04hx\n", pe32->magic);
|
||||
return -ELIBBAD;
|
||||
}
|
||||
|
||||
@ -95,7 +95,7 @@ static int pefile_parse_binary(const void *pebuf, unsigned int pelen,
|
||||
ctx->certs_size = ddir->certs.size;
|
||||
|
||||
if (!ddir->certs.virtual_address || !ddir->certs.size) {
|
||||
pr_debug("Unsigned PE binary\n");
|
||||
pr_warn("Unsigned PE binary\n");
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
@ -127,7 +127,7 @@ static int pefile_strip_sig_wrapper(const void *pebuf,
|
||||
unsigned len;
|
||||
|
||||
if (ctx->sig_len < sizeof(wrapper)) {
|
||||
pr_debug("Signature wrapper too short\n");
|
||||
pr_warn("Signature wrapper too short\n");
|
||||
return -ELIBBAD;
|
||||
}
|
||||
|
||||
@ -135,19 +135,23 @@ static int pefile_strip_sig_wrapper(const void *pebuf,
|
||||
pr_debug("sig wrapper = { %x, %x, %x }\n",
|
||||
wrapper.length, wrapper.revision, wrapper.cert_type);
|
||||
|
||||
/* Both pesign and sbsign round up the length of certificate table
|
||||
* (in optional header data directories) to 8 byte alignment.
|
||||
/* sbsign rounds up the length of certificate table (in optional
|
||||
* header data directories) to 8 byte alignment. However, the PE
|
||||
* specification states that while entries are 8-byte aligned, this is
|
||||
* not included in their length, and as a result, pesign has not
|
||||
* rounded up since 0.110.
|
||||
*/
|
||||
if (round_up(wrapper.length, 8) != ctx->sig_len) {
|
||||
pr_debug("Signature wrapper len wrong\n");
|
||||
if (wrapper.length > ctx->sig_len) {
|
||||
pr_warn("Signature wrapper bigger than sig len (%x > %x)\n",
|
||||
ctx->sig_len, wrapper.length);
|
||||
return -ELIBBAD;
|
||||
}
|
||||
if (wrapper.revision != WIN_CERT_REVISION_2_0) {
|
||||
pr_debug("Signature is not revision 2.0\n");
|
||||
pr_warn("Signature is not revision 2.0\n");
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
if (wrapper.cert_type != WIN_CERT_TYPE_PKCS_SIGNED_DATA) {
|
||||
pr_debug("Signature certificate type is not PKCS\n");
|
||||
pr_warn("Signature certificate type is not PKCS\n");
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
@ -160,7 +164,7 @@ static int pefile_strip_sig_wrapper(const void *pebuf,
|
||||
ctx->sig_offset += sizeof(wrapper);
|
||||
ctx->sig_len -= sizeof(wrapper);
|
||||
if (ctx->sig_len < 4) {
|
||||
pr_debug("Signature data missing\n");
|
||||
pr_warn("Signature data missing\n");
|
||||
return -EKEYREJECTED;
|
||||
}
|
||||
|
||||
@ -194,7 +198,7 @@ check_len:
|
||||
return 0;
|
||||
}
|
||||
not_pkcs7:
|
||||
pr_debug("Signature data not PKCS#7\n");
|
||||
pr_warn("Signature data not PKCS#7\n");
|
||||
return -ELIBBAD;
|
||||
}
|
||||
|
||||
@ -337,8 +341,8 @@ static int pefile_digest_pe(const void *pebuf, unsigned int pelen,
|
||||
digest_size = crypto_shash_digestsize(tfm);
|
||||
|
||||
if (digest_size != ctx->digest_len) {
|
||||
pr_debug("Digest size mismatch (%zx != %x)\n",
|
||||
digest_size, ctx->digest_len);
|
||||
pr_warn("Digest size mismatch (%zx != %x)\n",
|
||||
digest_size, ctx->digest_len);
|
||||
ret = -EBADMSG;
|
||||
goto error_no_desc;
|
||||
}
|
||||
@ -369,7 +373,7 @@ static int pefile_digest_pe(const void *pebuf, unsigned int pelen,
|
||||
* PKCS#7 certificate.
|
||||
*/
|
||||
if (memcmp(digest, ctx->digest, ctx->digest_len) != 0) {
|
||||
pr_debug("Digest mismatch\n");
|
||||
pr_warn("Digest mismatch\n");
|
||||
ret = -EKEYREJECTED;
|
||||
} else {
|
||||
pr_debug("The digests match!\n");
|
||||
|
@ -381,6 +381,7 @@ static void pata_parport_dev_release(struct device *dev)
|
||||
{
|
||||
struct pi_adapter *pi = container_of(dev, struct pi_adapter, dev);
|
||||
|
||||
ida_free(&pata_parport_bus_dev_ids, dev->id);
|
||||
kfree(pi);
|
||||
}
|
||||
|
||||
@ -433,23 +434,27 @@ static struct pi_adapter *pi_init_one(struct parport *parport,
|
||||
if (bus_for_each_dev(&pata_parport_bus_type, NULL, &match, pi_find_dev))
|
||||
return NULL;
|
||||
|
||||
pi = kzalloc(sizeof(struct pi_adapter), GFP_KERNEL);
|
||||
if (!pi)
|
||||
id = ida_alloc(&pata_parport_bus_dev_ids, GFP_KERNEL);
|
||||
if (id < 0)
|
||||
return NULL;
|
||||
|
||||
pi = kzalloc(sizeof(struct pi_adapter), GFP_KERNEL);
|
||||
if (!pi) {
|
||||
ida_free(&pata_parport_bus_dev_ids, id);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* set up pi->dev before pi_probe_unit() so it can use dev_printk() */
|
||||
pi->dev.parent = &pata_parport_bus;
|
||||
pi->dev.bus = &pata_parport_bus_type;
|
||||
pi->dev.driver = &pr->driver;
|
||||
pi->dev.release = pata_parport_dev_release;
|
||||
id = ida_alloc(&pata_parport_bus_dev_ids, GFP_KERNEL);
|
||||
if (id < 0)
|
||||
return NULL; /* pata_parport_dev_release will do kfree(pi) */
|
||||
pi->dev.id = id;
|
||||
dev_set_name(&pi->dev, "pata_parport.%u", pi->dev.id);
|
||||
if (device_register(&pi->dev)) {
|
||||
put_device(&pi->dev);
|
||||
goto out_ida_free;
|
||||
/* pata_parport_dev_release will do ida_free(dev->id) and kfree(pi) */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pi->proto = pr;
|
||||
@ -464,8 +469,7 @@ static struct pi_adapter *pi_init_one(struct parport *parport,
|
||||
pi->port = parport->base;
|
||||
|
||||
par_cb.private = pi;
|
||||
pi->pardev = parport_register_dev_model(parport, DRV_NAME, &par_cb,
|
||||
pi->dev.id);
|
||||
pi->pardev = parport_register_dev_model(parport, DRV_NAME, &par_cb, id);
|
||||
if (!pi->pardev)
|
||||
goto out_module_put;
|
||||
|
||||
@ -487,12 +491,13 @@ static struct pi_adapter *pi_init_one(struct parport *parport,
|
||||
|
||||
pi_connect(pi);
|
||||
if (ata_host_activate(host, 0, NULL, 0, &pata_parport_sht))
|
||||
goto out_unreg_parport;
|
||||
goto out_disconnect;
|
||||
|
||||
return pi;
|
||||
|
||||
out_unreg_parport:
|
||||
out_disconnect:
|
||||
pi_disconnect(pi);
|
||||
out_unreg_parport:
|
||||
parport_unregister_device(pi->pardev);
|
||||
if (pi->proto->release_proto)
|
||||
pi->proto->release_proto(pi);
|
||||
@ -500,8 +505,7 @@ out_module_put:
|
||||
module_put(pi->proto->owner);
|
||||
out_unreg_dev:
|
||||
device_unregister(&pi->dev);
|
||||
out_ida_free:
|
||||
ida_free(&pata_parport_bus_dev_ids, pi->dev.id);
|
||||
/* pata_parport_dev_release will do ida_free(dev->id) and kfree(pi) */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -626,8 +630,7 @@ static void pi_remove_one(struct device *dev)
|
||||
pi_disconnect(pi);
|
||||
pi_release(pi);
|
||||
device_unregister(dev);
|
||||
ida_free(&pata_parport_bus_dev_ids, dev->id);
|
||||
/* pata_parport_dev_release will do kfree(pi) */
|
||||
/* pata_parport_dev_release will do ida_free(dev->id) and kfree(pi) */
|
||||
}
|
||||
|
||||
static ssize_t delete_device_store(struct bus_type *bus, const char *buf,
|
||||
@ -643,6 +646,7 @@ static ssize_t delete_device_store(struct bus_type *bus, const char *buf,
|
||||
}
|
||||
|
||||
pi_remove_one(dev);
|
||||
put_device(dev);
|
||||
mutex_unlock(&pi_mutex);
|
||||
|
||||
return count;
|
||||
|
@ -2909,6 +2909,7 @@ close_card_oam(struct idt77252_dev *card)
|
||||
|
||||
recycle_rx_pool_skb(card, &vc->rcv.rx_pool);
|
||||
}
|
||||
kfree(vc);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2952,6 +2953,15 @@ open_card_ubr0(struct idt77252_dev *card)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
close_card_ubr0(struct idt77252_dev *card)
|
||||
{
|
||||
struct vc_map *vc = card->vcs[0];
|
||||
|
||||
free_scq(card, vc->scq);
|
||||
kfree(vc);
|
||||
}
|
||||
|
||||
static int
|
||||
idt77252_dev_open(struct idt77252_dev *card)
|
||||
{
|
||||
@ -3001,6 +3011,7 @@ static void idt77252_dev_close(struct atm_dev *dev)
|
||||
struct idt77252_dev *card = dev->dev_data;
|
||||
u32 conf;
|
||||
|
||||
close_card_ubr0(card);
|
||||
close_card_oam(card);
|
||||
|
||||
conf = SAR_CFG_RXPTH | /* enable receive path */
|
||||
|
@ -26,7 +26,14 @@
|
||||
#define ECDSA_HEADER_LEN 320
|
||||
|
||||
#define BTINTEL_PPAG_NAME "PPAG"
|
||||
#define BTINTEL_PPAG_PREFIX "\\_SB_.PCI0.XHCI.RHUB"
|
||||
|
||||
/* structure to store the PPAG data read from ACPI table */
|
||||
struct btintel_ppag {
|
||||
u32 domain;
|
||||
u32 mode;
|
||||
acpi_status status;
|
||||
struct hci_dev *hdev;
|
||||
};
|
||||
|
||||
#define CMD_WRITE_BOOT_PARAMS 0xfc0e
|
||||
struct cmd_write_boot_params {
|
||||
@ -1295,17 +1302,16 @@ static acpi_status btintel_ppag_callback(acpi_handle handle, u32 lvl, void *data
|
||||
|
||||
status = acpi_get_name(handle, ACPI_FULL_PATHNAME, &string);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
bt_dev_warn(hdev, "ACPI Failure: %s", acpi_format_exception(status));
|
||||
bt_dev_warn(hdev, "PPAG-BT: ACPI Failure: %s", acpi_format_exception(status));
|
||||
return status;
|
||||
}
|
||||
|
||||
if (strncmp(BTINTEL_PPAG_PREFIX, string.pointer,
|
||||
strlen(BTINTEL_PPAG_PREFIX))) {
|
||||
len = strlen(string.pointer);
|
||||
if (len < strlen(BTINTEL_PPAG_NAME)) {
|
||||
kfree(string.pointer);
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
len = strlen(string.pointer);
|
||||
if (strncmp((char *)string.pointer + len - 4, BTINTEL_PPAG_NAME, 4)) {
|
||||
kfree(string.pointer);
|
||||
return AE_OK;
|
||||
@ -1314,7 +1320,8 @@ static acpi_status btintel_ppag_callback(acpi_handle handle, u32 lvl, void *data
|
||||
|
||||
status = acpi_evaluate_object(handle, NULL, NULL, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
bt_dev_warn(hdev, "ACPI Failure: %s", acpi_format_exception(status));
|
||||
ppag->status = status;
|
||||
bt_dev_warn(hdev, "PPAG-BT: ACPI Failure: %s", acpi_format_exception(status));
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -1323,8 +1330,9 @@ static acpi_status btintel_ppag_callback(acpi_handle handle, u32 lvl, void *data
|
||||
|
||||
if (p->type != ACPI_TYPE_PACKAGE || p->package.count != 2) {
|
||||
kfree(buffer.pointer);
|
||||
bt_dev_warn(hdev, "Invalid object type: %d or package count: %d",
|
||||
bt_dev_warn(hdev, "PPAG-BT: Invalid object type: %d or package count: %d",
|
||||
p->type, p->package.count);
|
||||
ppag->status = AE_ERROR;
|
||||
return AE_ERROR;
|
||||
}
|
||||
|
||||
@ -1335,6 +1343,7 @@ static acpi_status btintel_ppag_callback(acpi_handle handle, u32 lvl, void *data
|
||||
|
||||
ppag->domain = (u32)p->package.elements[0].integer.value;
|
||||
ppag->mode = (u32)p->package.elements[1].integer.value;
|
||||
ppag->status = AE_OK;
|
||||
kfree(buffer.pointer);
|
||||
return AE_CTRL_TERMINATE;
|
||||
}
|
||||
@ -2314,12 +2323,12 @@ error:
|
||||
|
||||
static void btintel_set_ppag(struct hci_dev *hdev, struct intel_version_tlv *ver)
|
||||
{
|
||||
acpi_status status;
|
||||
struct btintel_ppag ppag;
|
||||
struct sk_buff *skb;
|
||||
struct btintel_loc_aware_reg ppag_cmd;
|
||||
acpi_handle handle;
|
||||
|
||||
/* PPAG is not supported if CRF is HrP2, Jfp2, JfP1 */
|
||||
/* PPAG is not supported if CRF is HrP2, Jfp2, JfP1 */
|
||||
switch (ver->cnvr_top & 0xFFF) {
|
||||
case 0x504: /* Hrp2 */
|
||||
case 0x202: /* Jfp2 */
|
||||
@ -2327,29 +2336,35 @@ static void btintel_set_ppag(struct hci_dev *hdev, struct intel_version_tlv *ver
|
||||
return;
|
||||
}
|
||||
|
||||
handle = ACPI_HANDLE(GET_HCIDEV_DEV(hdev));
|
||||
if (!handle) {
|
||||
bt_dev_info(hdev, "No support for BT device in ACPI firmware");
|
||||
return;
|
||||
}
|
||||
|
||||
memset(&ppag, 0, sizeof(ppag));
|
||||
|
||||
ppag.hdev = hdev;
|
||||
status = acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
|
||||
ACPI_UINT32_MAX, NULL,
|
||||
btintel_ppag_callback, &ppag, NULL);
|
||||
ppag.status = AE_NOT_FOUND;
|
||||
acpi_walk_namespace(ACPI_TYPE_PACKAGE, handle, 1, NULL,
|
||||
btintel_ppag_callback, &ppag, NULL);
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
/* Do not log warning message if ACPI entry is not found */
|
||||
if (status == AE_NOT_FOUND)
|
||||
if (ACPI_FAILURE(ppag.status)) {
|
||||
if (ppag.status == AE_NOT_FOUND) {
|
||||
bt_dev_dbg(hdev, "PPAG-BT: ACPI entry not found");
|
||||
return;
|
||||
bt_dev_warn(hdev, "PPAG: ACPI Failure: %s", acpi_format_exception(status));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (ppag.domain != 0x12) {
|
||||
bt_dev_warn(hdev, "PPAG-BT Domain disabled");
|
||||
bt_dev_warn(hdev, "PPAG-BT: domain is not bluetooth");
|
||||
return;
|
||||
}
|
||||
|
||||
/* PPAG mode, BIT0 = 0 Disabled, BIT0 = 1 Enabled */
|
||||
if (!(ppag.mode & BIT(0))) {
|
||||
bt_dev_dbg(hdev, "PPAG disabled");
|
||||
bt_dev_dbg(hdev, "PPAG-BT: disabled");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -137,13 +137,6 @@ struct intel_offload_use_cases {
|
||||
__u8 preset[8];
|
||||
} __packed;
|
||||
|
||||
/* structure to store the PPAG data read from ACPI table */
|
||||
struct btintel_ppag {
|
||||
u32 domain;
|
||||
u32 mode;
|
||||
struct hci_dev *hdev;
|
||||
};
|
||||
|
||||
struct btintel_loc_aware_reg {
|
||||
__le32 mcc;
|
||||
__le32 sel;
|
||||
|
@ -122,6 +122,21 @@ static int btqcomsmd_setup(struct hci_dev *hdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int btqcomsmd_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = qca_set_bdaddr_rome(hdev, bdaddr);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* The firmware stops responding for a while after setting the bdaddr,
|
||||
* causing timeouts for subsequent commands. Sleep a bit to avoid this.
|
||||
*/
|
||||
usleep_range(1000, 10000);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int btqcomsmd_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct btqcomsmd *btq;
|
||||
@ -162,7 +177,7 @@ static int btqcomsmd_probe(struct platform_device *pdev)
|
||||
hdev->close = btqcomsmd_close;
|
||||
hdev->send = btqcomsmd_send;
|
||||
hdev->setup = btqcomsmd_setup;
|
||||
hdev->set_bdaddr = qca_set_bdaddr_rome;
|
||||
hdev->set_bdaddr = btqcomsmd_set_bdaddr;
|
||||
|
||||
ret = hci_register_dev(hdev);
|
||||
if (ret < 0)
|
||||
|
@ -354,6 +354,7 @@ static void btsdio_remove(struct sdio_func *func)
|
||||
|
||||
BT_DBG("func %p", func);
|
||||
|
||||
cancel_work_sync(&data->work);
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
|
@ -1050,21 +1050,11 @@ static int btusb_recv_bulk(struct btusb_data *data, void *buffer, int count)
|
||||
hci_skb_expect(skb) -= len;
|
||||
|
||||
if (skb->len == HCI_ACL_HDR_SIZE) {
|
||||
__u16 handle = __le16_to_cpu(hci_acl_hdr(skb)->handle);
|
||||
__le16 dlen = hci_acl_hdr(skb)->dlen;
|
||||
__u8 type;
|
||||
|
||||
/* Complete ACL header */
|
||||
hci_skb_expect(skb) = __le16_to_cpu(dlen);
|
||||
|
||||
/* Detect if ISO packet has been sent over bulk */
|
||||
if (hci_conn_num(data->hdev, ISO_LINK)) {
|
||||
type = hci_conn_lookup_type(data->hdev,
|
||||
hci_handle(handle));
|
||||
if (type == ISO_LINK)
|
||||
hci_skb_pkt_type(skb) = HCI_ISODATA_PKT;
|
||||
}
|
||||
|
||||
if (skb_tailroom(skb) < hci_skb_expect(skb)) {
|
||||
kfree_skb(skb);
|
||||
skb = NULL;
|
||||
|
@ -206,7 +206,7 @@ static int do_feature_check_call(const u32 api_id)
|
||||
}
|
||||
|
||||
/* Add new entry if not present */
|
||||
feature_data = kmalloc(sizeof(*feature_data), GFP_KERNEL);
|
||||
feature_data = kmalloc(sizeof(*feature_data), GFP_ATOMIC);
|
||||
if (!feature_data)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -487,7 +487,6 @@ static int host1x_get_resets(struct host1x *host)
|
||||
static int host1x_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct host1x *host;
|
||||
int syncpt_irq;
|
||||
int err;
|
||||
|
||||
host = devm_kzalloc(&pdev->dev, sizeof(*host), GFP_KERNEL);
|
||||
@ -517,8 +516,8 @@ static int host1x_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
host->syncpt_irq = platform_get_irq(pdev, 0);
|
||||
if (syncpt_irq < 0)
|
||||
return syncpt_irq;
|
||||
if (host->syncpt_irq < 0)
|
||||
return host->syncpt_irq;
|
||||
|
||||
mutex_init(&host->devices_lock);
|
||||
INIT_LIST_HEAD(&host->devices);
|
||||
|
@ -488,10 +488,10 @@ static ssize_t temp_store(struct device *dev, struct device_attribute *attr,
|
||||
val = (temp - val) / 1000;
|
||||
|
||||
if (sattr->index != 1) {
|
||||
data->temp[HYSTERSIS][sattr->index] &= 0xF0;
|
||||
data->temp[HYSTERSIS][sattr->index] &= 0x0F;
|
||||
data->temp[HYSTERSIS][sattr->index] |= (val & 0xF) << 4;
|
||||
} else {
|
||||
data->temp[HYSTERSIS][sattr->index] &= 0x0F;
|
||||
data->temp[HYSTERSIS][sattr->index] &= 0xF0;
|
||||
data->temp[HYSTERSIS][sattr->index] |= (val & 0xF);
|
||||
}
|
||||
|
||||
@ -556,11 +556,11 @@ static ssize_t temp_st_show(struct device *dev, struct device_attribute *attr,
|
||||
val = data->enh_acoustics[0] & 0xf;
|
||||
break;
|
||||
case 1:
|
||||
val = (data->enh_acoustics[1] >> 4) & 0xf;
|
||||
val = data->enh_acoustics[1] & 0xf;
|
||||
break;
|
||||
case 2:
|
||||
default:
|
||||
val = data->enh_acoustics[1] & 0xf;
|
||||
val = (data->enh_acoustics[1] >> 4) & 0xf;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -772,7 +772,7 @@ static int ina3221_probe_child_from_dt(struct device *dev,
|
||||
return ret;
|
||||
} else if (val > INA3221_CHANNEL3) {
|
||||
dev_err(dev, "invalid reg %d of %pOFn\n", val, child);
|
||||
return ret;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
input = &ina->inputs[val];
|
||||
|
@ -323,6 +323,7 @@ static int ltc2992_config_gpio(struct ltc2992_state *st)
|
||||
st->gc.label = name;
|
||||
st->gc.parent = &st->client->dev;
|
||||
st->gc.owner = THIS_MODULE;
|
||||
st->gc.can_sleep = true;
|
||||
st->gc.base = -1;
|
||||
st->gc.names = st->gpio_names;
|
||||
st->gc.ngpio = ARRAY_SIZE(st->gpio_names);
|
||||
|
@ -301,6 +301,7 @@ static int adm1266_config_gpio(struct adm1266_data *data)
|
||||
data->gc.label = name;
|
||||
data->gc.parent = &data->client->dev;
|
||||
data->gc.owner = THIS_MODULE;
|
||||
data->gc.can_sleep = true;
|
||||
data->gc.base = -1;
|
||||
data->gc.names = data->gpio_names;
|
||||
data->gc.ngpio = ARRAY_SIZE(data->gpio_names);
|
||||
|
@ -7,6 +7,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
@ -16,6 +17,7 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/pmbus.h>
|
||||
#include <linux/gpio/driver.h>
|
||||
#include <linux/timekeeping.h>
|
||||
#include "pmbus.h"
|
||||
|
||||
enum chips { ucd9000, ucd90120, ucd90124, ucd90160, ucd90320, ucd9090,
|
||||
@ -65,6 +67,7 @@ struct ucd9000_data {
|
||||
struct gpio_chip gpio;
|
||||
#endif
|
||||
struct dentry *debugfs;
|
||||
ktime_t write_time;
|
||||
};
|
||||
#define to_ucd9000_data(_info) container_of(_info, struct ucd9000_data, info)
|
||||
|
||||
@ -73,6 +76,73 @@ struct ucd9000_debugfs_entry {
|
||||
u8 index;
|
||||
};
|
||||
|
||||
/*
|
||||
* It has been observed that the UCD90320 randomly fails register access when
|
||||
* doing another access right on the back of a register write. To mitigate this
|
||||
* make sure that there is a minimum delay between a write access and the
|
||||
* following access. The 250us is based on experimental data. At a delay of
|
||||
* 200us the issue seems to go away. Add a bit of extra margin to allow for
|
||||
* system to system differences.
|
||||
*/
|
||||
#define UCD90320_WAIT_DELAY_US 250
|
||||
|
||||
static inline void ucd90320_wait(const struct ucd9000_data *data)
|
||||
{
|
||||
s64 delta = ktime_us_delta(ktime_get(), data->write_time);
|
||||
|
||||
if (delta < UCD90320_WAIT_DELAY_US)
|
||||
udelay(UCD90320_WAIT_DELAY_US - delta);
|
||||
}
|
||||
|
||||
static int ucd90320_read_word_data(struct i2c_client *client, int page,
|
||||
int phase, int reg)
|
||||
{
|
||||
const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
|
||||
struct ucd9000_data *data = to_ucd9000_data(info);
|
||||
|
||||
if (reg >= PMBUS_VIRT_BASE)
|
||||
return -ENXIO;
|
||||
|
||||
ucd90320_wait(data);
|
||||
return pmbus_read_word_data(client, page, phase, reg);
|
||||
}
|
||||
|
||||
static int ucd90320_read_byte_data(struct i2c_client *client, int page, int reg)
|
||||
{
|
||||
const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
|
||||
struct ucd9000_data *data = to_ucd9000_data(info);
|
||||
|
||||
ucd90320_wait(data);
|
||||
return pmbus_read_byte_data(client, page, reg);
|
||||
}
|
||||
|
||||
static int ucd90320_write_word_data(struct i2c_client *client, int page,
|
||||
int reg, u16 word)
|
||||
{
|
||||
const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
|
||||
struct ucd9000_data *data = to_ucd9000_data(info);
|
||||
int ret;
|
||||
|
||||
ucd90320_wait(data);
|
||||
ret = pmbus_write_word_data(client, page, reg, word);
|
||||
data->write_time = ktime_get();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ucd90320_write_byte(struct i2c_client *client, int page, u8 value)
|
||||
{
|
||||
const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
|
||||
struct ucd9000_data *data = to_ucd9000_data(info);
|
||||
int ret;
|
||||
|
||||
ucd90320_wait(data);
|
||||
ret = pmbus_write_byte(client, page, value);
|
||||
data->write_time = ktime_get();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ucd9000_get_fan_config(struct i2c_client *client, int fan)
|
||||
{
|
||||
int fan_config = 0;
|
||||
@ -598,6 +668,11 @@ static int ucd9000_probe(struct i2c_client *client)
|
||||
info->read_byte_data = ucd9000_read_byte_data;
|
||||
info->func[0] |= PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12
|
||||
| PMBUS_HAVE_FAN34 | PMBUS_HAVE_STATUS_FAN34;
|
||||
} else if (mid->driver_data == ucd90320) {
|
||||
info->read_byte_data = ucd90320_read_byte_data;
|
||||
info->read_word_data = ucd90320_read_word_data;
|
||||
info->write_byte = ucd90320_write_byte;
|
||||
info->write_word_data = ucd90320_write_word_data;
|
||||
}
|
||||
|
||||
ucd9000_probe_gpio(client, mid, data);
|
||||
|
@ -758,7 +758,7 @@ static int tmp51x_probe(struct i2c_client *client)
|
||||
static struct i2c_driver tmp51x_driver = {
|
||||
.driver = {
|
||||
.name = "tmp51x",
|
||||
.of_match_table = of_match_ptr(tmp51x_of_match),
|
||||
.of_match_table = tmp51x_of_match,
|
||||
},
|
||||
.probe_new = tmp51x_probe,
|
||||
.id_table = tmp51x_id,
|
||||
|
@ -761,6 +761,7 @@ static int xgene_hwmon_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct xgene_hwmon_dev *ctx = platform_get_drvdata(pdev);
|
||||
|
||||
cancel_work_sync(&ctx->workq);
|
||||
hwmon_device_unregister(ctx->hwmon_dev);
|
||||
kfifo_free(&ctx->async_msg_fifo);
|
||||
if (acpi_disabled)
|
||||
|
@ -850,6 +850,10 @@ void icc_node_destroy(int id)
|
||||
|
||||
mutex_unlock(&icc_lock);
|
||||
|
||||
if (!node)
|
||||
return;
|
||||
|
||||
kfree(node->links);
|
||||
kfree(node);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(icc_node_destroy);
|
||||
@ -1029,54 +1033,68 @@ int icc_nodes_remove(struct icc_provider *provider)
|
||||
EXPORT_SYMBOL_GPL(icc_nodes_remove);
|
||||
|
||||
/**
|
||||
* icc_provider_add() - add a new interconnect provider
|
||||
* @provider: the interconnect provider that will be added into topology
|
||||
* icc_provider_init() - initialize a new interconnect provider
|
||||
* @provider: the interconnect provider to initialize
|
||||
*
|
||||
* Must be called before adding nodes to the provider.
|
||||
*/
|
||||
void icc_provider_init(struct icc_provider *provider)
|
||||
{
|
||||
WARN_ON(!provider->set);
|
||||
|
||||
INIT_LIST_HEAD(&provider->nodes);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(icc_provider_init);
|
||||
|
||||
/**
|
||||
* icc_provider_register() - register a new interconnect provider
|
||||
* @provider: the interconnect provider to register
|
||||
*
|
||||
* Return: 0 on success, or an error code otherwise
|
||||
*/
|
||||
int icc_provider_add(struct icc_provider *provider)
|
||||
int icc_provider_register(struct icc_provider *provider)
|
||||
{
|
||||
if (WARN_ON(!provider->set))
|
||||
return -EINVAL;
|
||||
if (WARN_ON(!provider->xlate && !provider->xlate_extended))
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&icc_lock);
|
||||
|
||||
INIT_LIST_HEAD(&provider->nodes);
|
||||
list_add_tail(&provider->provider_list, &icc_providers);
|
||||
|
||||
mutex_unlock(&icc_lock);
|
||||
|
||||
dev_dbg(provider->dev, "interconnect provider added to topology\n");
|
||||
dev_dbg(provider->dev, "interconnect provider registered\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(icc_provider_add);
|
||||
EXPORT_SYMBOL_GPL(icc_provider_register);
|
||||
|
||||
/**
|
||||
* icc_provider_del() - delete previously added interconnect provider
|
||||
* @provider: the interconnect provider that will be removed from topology
|
||||
* icc_provider_deregister() - deregister an interconnect provider
|
||||
* @provider: the interconnect provider to deregister
|
||||
*/
|
||||
void icc_provider_del(struct icc_provider *provider)
|
||||
void icc_provider_deregister(struct icc_provider *provider)
|
||||
{
|
||||
mutex_lock(&icc_lock);
|
||||
if (provider->users) {
|
||||
pr_warn("interconnect provider still has %d users\n",
|
||||
provider->users);
|
||||
mutex_unlock(&icc_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!list_empty(&provider->nodes)) {
|
||||
pr_warn("interconnect provider still has nodes\n");
|
||||
mutex_unlock(&icc_lock);
|
||||
return;
|
||||
}
|
||||
WARN_ON(provider->users);
|
||||
|
||||
list_del(&provider->provider_list);
|
||||
mutex_unlock(&icc_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(icc_provider_deregister);
|
||||
|
||||
int icc_provider_add(struct icc_provider *provider)
|
||||
{
|
||||
icc_provider_init(provider);
|
||||
|
||||
return icc_provider_register(provider);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(icc_provider_add);
|
||||
|
||||
void icc_provider_del(struct icc_provider *provider)
|
||||
{
|
||||
WARN_ON(!list_empty(&provider->nodes));
|
||||
|
||||
icc_provider_deregister(provider);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(icc_provider_del);
|
||||
|
||||
static const struct of_device_id __maybe_unused ignore_list[] = {
|
||||
|
@ -295,6 +295,9 @@ int imx_icc_register(struct platform_device *pdev,
|
||||
provider->xlate = of_icc_xlate_onecell;
|
||||
provider->data = data;
|
||||
provider->dev = dev->parent;
|
||||
|
||||
icc_provider_init(provider);
|
||||
|
||||
platform_set_drvdata(pdev, imx_provider);
|
||||
|
||||
if (settings) {
|
||||
@ -306,20 +309,18 @@ int imx_icc_register(struct platform_device *pdev,
|
||||
}
|
||||
}
|
||||
|
||||
ret = icc_provider_add(provider);
|
||||
if (ret) {
|
||||
dev_err(dev, "error adding interconnect provider: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count, settings);
|
||||
if (ret)
|
||||
goto provider_del;
|
||||
return ret;
|
||||
|
||||
ret = icc_provider_register(provider);
|
||||
if (ret)
|
||||
goto err_unregister_nodes;
|
||||
|
||||
return 0;
|
||||
|
||||
provider_del:
|
||||
icc_provider_del(provider);
|
||||
err_unregister_nodes:
|
||||
imx_icc_unregister_nodes(&imx_provider->provider);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(imx_icc_register);
|
||||
@ -328,9 +329,8 @@ void imx_icc_unregister(struct platform_device *pdev)
|
||||
{
|
||||
struct imx_icc_provider *imx_provider = platform_get_drvdata(pdev);
|
||||
|
||||
icc_provider_deregister(&imx_provider->provider);
|
||||
imx_icc_unregister_nodes(&imx_provider->provider);
|
||||
|
||||
icc_provider_del(&imx_provider->provider);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(imx_icc_unregister);
|
||||
|
||||
|
@ -503,7 +503,6 @@ regmap_done:
|
||||
}
|
||||
|
||||
provider = &qp->provider;
|
||||
INIT_LIST_HEAD(&provider->nodes);
|
||||
provider->dev = dev;
|
||||
provider->set = qcom_icc_set;
|
||||
provider->pre_aggregate = qcom_icc_pre_bw_aggregate;
|
||||
@ -511,12 +510,7 @@ regmap_done:
|
||||
provider->xlate_extended = qcom_icc_xlate_extended;
|
||||
provider->data = data;
|
||||
|
||||
ret = icc_provider_add(provider);
|
||||
if (ret) {
|
||||
dev_err(dev, "error adding interconnect provider: %d\n", ret);
|
||||
clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks);
|
||||
return ret;
|
||||
}
|
||||
icc_provider_init(provider);
|
||||
|
||||
for (i = 0; i < num_nodes; i++) {
|
||||
size_t j;
|
||||
@ -524,7 +518,7 @@ regmap_done:
|
||||
node = icc_node_create(qnodes[i]->id);
|
||||
if (IS_ERR(node)) {
|
||||
ret = PTR_ERR(node);
|
||||
goto err;
|
||||
goto err_remove_nodes;
|
||||
}
|
||||
|
||||
node->name = qnodes[i]->name;
|
||||
@ -538,17 +532,26 @@ regmap_done:
|
||||
}
|
||||
data->num_nodes = num_nodes;
|
||||
|
||||
ret = icc_provider_register(provider);
|
||||
if (ret)
|
||||
goto err_remove_nodes;
|
||||
|
||||
platform_set_drvdata(pdev, qp);
|
||||
|
||||
/* Populate child NoC devices if any */
|
||||
if (of_get_child_count(dev->of_node) > 0)
|
||||
return of_platform_populate(dev->of_node, NULL, NULL, dev);
|
||||
if (of_get_child_count(dev->of_node) > 0) {
|
||||
ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
|
||||
if (ret)
|
||||
goto err_deregister_provider;
|
||||
}
|
||||
|
||||
return 0;
|
||||
err:
|
||||
|
||||
err_deregister_provider:
|
||||
icc_provider_deregister(provider);
|
||||
err_remove_nodes:
|
||||
icc_nodes_remove(provider);
|
||||
clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks);
|
||||
icc_provider_del(provider);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -558,9 +561,9 @@ int qnoc_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct qcom_icc_provider *qp = platform_get_drvdata(pdev);
|
||||
|
||||
icc_provider_deregister(&qp->provider);
|
||||
icc_nodes_remove(&qp->provider);
|
||||
clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks);
|
||||
icc_provider_del(&qp->provider);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -192,9 +192,10 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
|
||||
provider->pre_aggregate = qcom_icc_pre_aggregate;
|
||||
provider->aggregate = qcom_icc_aggregate;
|
||||
provider->xlate_extended = qcom_icc_xlate_extended;
|
||||
INIT_LIST_HEAD(&provider->nodes);
|
||||
provider->data = data;
|
||||
|
||||
icc_provider_init(provider);
|
||||
|
||||
qp->dev = dev;
|
||||
qp->bcms = desc->bcms;
|
||||
qp->num_bcms = desc->num_bcms;
|
||||
@ -203,10 +204,6 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(qp->voter))
|
||||
return PTR_ERR(qp->voter);
|
||||
|
||||
ret = icc_provider_add(provider);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
for (i = 0; i < qp->num_bcms; i++)
|
||||
qcom_icc_bcm_init(qp->bcms[i], dev);
|
||||
|
||||
@ -218,7 +215,7 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
|
||||
node = icc_node_create(qn->id);
|
||||
if (IS_ERR(node)) {
|
||||
ret = PTR_ERR(node);
|
||||
goto err;
|
||||
goto err_remove_nodes;
|
||||
}
|
||||
|
||||
node->name = qn->name;
|
||||
@ -232,16 +229,27 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
data->num_nodes = num_nodes;
|
||||
|
||||
ret = icc_provider_register(provider);
|
||||
if (ret)
|
||||
goto err_remove_nodes;
|
||||
|
||||
platform_set_drvdata(pdev, qp);
|
||||
|
||||
/* Populate child NoC devices if any */
|
||||
if (of_get_child_count(dev->of_node) > 0)
|
||||
return of_platform_populate(dev->of_node, NULL, NULL, dev);
|
||||
if (of_get_child_count(dev->of_node) > 0) {
|
||||
ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
|
||||
if (ret)
|
||||
goto err_deregister_provider;
|
||||
}
|
||||
|
||||
return 0;
|
||||
err:
|
||||
|
||||
err_deregister_provider:
|
||||
icc_provider_deregister(provider);
|
||||
err_remove_nodes:
|
||||
icc_nodes_remove(provider);
|
||||
icc_provider_del(provider);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qcom_icc_rpmh_probe);
|
||||
@ -250,8 +258,8 @@ int qcom_icc_rpmh_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct qcom_icc_provider *qp = platform_get_drvdata(pdev);
|
||||
|
||||
icc_provider_deregister(&qp->provider);
|
||||
icc_nodes_remove(&qp->provider);
|
||||
icc_provider_del(&qp->provider);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -692,7 +692,6 @@ static int msm8974_icc_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
|
||||
provider = &qp->provider;
|
||||
INIT_LIST_HEAD(&provider->nodes);
|
||||
provider->dev = dev;
|
||||
provider->set = msm8974_icc_set;
|
||||
provider->aggregate = icc_std_aggregate;
|
||||
@ -700,11 +699,7 @@ static int msm8974_icc_probe(struct platform_device *pdev)
|
||||
provider->data = data;
|
||||
provider->get_bw = msm8974_get_bw;
|
||||
|
||||
ret = icc_provider_add(provider);
|
||||
if (ret) {
|
||||
dev_err(dev, "error adding interconnect provider: %d\n", ret);
|
||||
goto err_disable_clks;
|
||||
}
|
||||
icc_provider_init(provider);
|
||||
|
||||
for (i = 0; i < num_nodes; i++) {
|
||||
size_t j;
|
||||
@ -712,7 +707,7 @@ static int msm8974_icc_probe(struct platform_device *pdev)
|
||||
node = icc_node_create(qnodes[i]->id);
|
||||
if (IS_ERR(node)) {
|
||||
ret = PTR_ERR(node);
|
||||
goto err_del_icc;
|
||||
goto err_remove_nodes;
|
||||
}
|
||||
|
||||
node->name = qnodes[i]->name;
|
||||
@ -729,15 +724,16 @@ static int msm8974_icc_probe(struct platform_device *pdev)
|
||||
}
|
||||
data->num_nodes = num_nodes;
|
||||
|
||||
ret = icc_provider_register(provider);
|
||||
if (ret)
|
||||
goto err_remove_nodes;
|
||||
|
||||
platform_set_drvdata(pdev, qp);
|
||||
|
||||
return 0;
|
||||
|
||||
err_del_icc:
|
||||
err_remove_nodes:
|
||||
icc_nodes_remove(provider);
|
||||
icc_provider_del(provider);
|
||||
|
||||
err_disable_clks:
|
||||
clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks);
|
||||
|
||||
return ret;
|
||||
@ -747,9 +743,9 @@ static int msm8974_icc_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct msm8974_icc_provider *qp = platform_get_drvdata(pdev);
|
||||
|
||||
icc_provider_deregister(&qp->provider);
|
||||
icc_nodes_remove(&qp->provider);
|
||||
clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks);
|
||||
icc_provider_del(&qp->provider);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -158,8 +158,8 @@ static int qcom_osm_l3_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct qcom_osm_l3_icc_provider *qp = platform_get_drvdata(pdev);
|
||||
|
||||
icc_provider_deregister(&qp->provider);
|
||||
icc_nodes_remove(&qp->provider);
|
||||
icc_provider_del(&qp->provider);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -236,7 +236,7 @@ static int qcom_osm_l3_probe(struct platform_device *pdev)
|
||||
qnodes = desc->nodes;
|
||||
num_nodes = desc->num_nodes;
|
||||
|
||||
data = devm_kcalloc(&pdev->dev, num_nodes, sizeof(*node), GFP_KERNEL);
|
||||
data = devm_kzalloc(&pdev->dev, struct_size(data, nodes, num_nodes), GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -245,14 +245,9 @@ static int qcom_osm_l3_probe(struct platform_device *pdev)
|
||||
provider->set = qcom_osm_l3_set;
|
||||
provider->aggregate = icc_std_aggregate;
|
||||
provider->xlate = of_icc_xlate_onecell;
|
||||
INIT_LIST_HEAD(&provider->nodes);
|
||||
provider->data = data;
|
||||
|
||||
ret = icc_provider_add(provider);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "error adding interconnect provider\n");
|
||||
return ret;
|
||||
}
|
||||
icc_provider_init(provider);
|
||||
|
||||
for (i = 0; i < num_nodes; i++) {
|
||||
size_t j;
|
||||
@ -275,12 +270,15 @@ static int qcom_osm_l3_probe(struct platform_device *pdev)
|
||||
}
|
||||
data->num_nodes = num_nodes;
|
||||
|
||||
ret = icc_provider_register(provider);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
platform_set_drvdata(pdev, qp);
|
||||
|
||||
return 0;
|
||||
err:
|
||||
icc_nodes_remove(provider);
|
||||
icc_provider_del(provider);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -147,9 +147,9 @@ static struct qcom_icc_node mas_snoc_bimc_nrt = {
|
||||
.name = "mas_snoc_bimc_nrt",
|
||||
.buswidth = 16,
|
||||
.qos.ap_owned = true,
|
||||
.qos.qos_port = 2,
|
||||
.qos.qos_port = 3,
|
||||
.qos.qos_mode = NOC_QOS_MODE_BYPASS,
|
||||
.mas_rpm_id = 163,
|
||||
.mas_rpm_id = 164,
|
||||
.slv_rpm_id = -1,
|
||||
.num_links = ARRAY_SIZE(mas_snoc_bimc_nrt_links),
|
||||
.links = mas_snoc_bimc_nrt_links,
|
||||
|
@ -1844,100 +1844,6 @@ static const struct qcom_icc_desc sm8450_system_noc = {
|
||||
.num_bcms = ARRAY_SIZE(system_noc_bcms),
|
||||
};
|
||||
|
||||
static int qnoc_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct qcom_icc_desc *desc;
|
||||
struct icc_onecell_data *data;
|
||||
struct icc_provider *provider;
|
||||
struct qcom_icc_node * const *qnodes;
|
||||
struct qcom_icc_provider *qp;
|
||||
struct icc_node *node;
|
||||
size_t num_nodes, i;
|
||||
int ret;
|
||||
|
||||
desc = device_get_match_data(&pdev->dev);
|
||||
if (!desc)
|
||||
return -EINVAL;
|
||||
|
||||
qnodes = desc->nodes;
|
||||
num_nodes = desc->num_nodes;
|
||||
|
||||
qp = devm_kzalloc(&pdev->dev, sizeof(*qp), GFP_KERNEL);
|
||||
if (!qp)
|
||||
return -ENOMEM;
|
||||
|
||||
data = devm_kcalloc(&pdev->dev, num_nodes, sizeof(*node), GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
provider = &qp->provider;
|
||||
provider->dev = &pdev->dev;
|
||||
provider->set = qcom_icc_set;
|
||||
provider->pre_aggregate = qcom_icc_pre_aggregate;
|
||||
provider->aggregate = qcom_icc_aggregate;
|
||||
provider->xlate_extended = qcom_icc_xlate_extended;
|
||||
INIT_LIST_HEAD(&provider->nodes);
|
||||
provider->data = data;
|
||||
|
||||
qp->dev = &pdev->dev;
|
||||
qp->bcms = desc->bcms;
|
||||
qp->num_bcms = desc->num_bcms;
|
||||
|
||||
qp->voter = of_bcm_voter_get(qp->dev, NULL);
|
||||
if (IS_ERR(qp->voter))
|
||||
return PTR_ERR(qp->voter);
|
||||
|
||||
ret = icc_provider_add(provider);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "error adding interconnect provider\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
for (i = 0; i < qp->num_bcms; i++)
|
||||
qcom_icc_bcm_init(qp->bcms[i], &pdev->dev);
|
||||
|
||||
for (i = 0; i < num_nodes; i++) {
|
||||
size_t j;
|
||||
|
||||
if (!qnodes[i])
|
||||
continue;
|
||||
|
||||
node = icc_node_create(qnodes[i]->id);
|
||||
if (IS_ERR(node)) {
|
||||
ret = PTR_ERR(node);
|
||||
goto err;
|
||||
}
|
||||
|
||||
node->name = qnodes[i]->name;
|
||||
node->data = qnodes[i];
|
||||
icc_node_add(node, provider);
|
||||
|
||||
for (j = 0; j < qnodes[i]->num_links; j++)
|
||||
icc_link_create(node, qnodes[i]->links[j]);
|
||||
|
||||
data->nodes[i] = node;
|
||||
}
|
||||
data->num_nodes = num_nodes;
|
||||
|
||||
platform_set_drvdata(pdev, qp);
|
||||
|
||||
return 0;
|
||||
err:
|
||||
icc_nodes_remove(provider);
|
||||
icc_provider_del(provider);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int qnoc_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct qcom_icc_provider *qp = platform_get_drvdata(pdev);
|
||||
|
||||
icc_nodes_remove(&qp->provider);
|
||||
icc_provider_del(&qp->provider);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id qnoc_of_match[] = {
|
||||
{ .compatible = "qcom,sm8450-aggre1-noc",
|
||||
.data = &sm8450_aggre1_noc},
|
||||
@ -1966,8 +1872,8 @@ static const struct of_device_id qnoc_of_match[] = {
|
||||
MODULE_DEVICE_TABLE(of, qnoc_of_match);
|
||||
|
||||
static struct platform_driver qnoc_driver = {
|
||||
.probe = qnoc_probe,
|
||||
.remove = qnoc_remove,
|
||||
.probe = qcom_icc_rpmh_probe,
|
||||
.remove = qcom_icc_rpmh_remove,
|
||||
.driver = {
|
||||
.name = "qnoc-sm8450",
|
||||
.of_match_table = qnoc_of_match,
|
||||
|
@ -2165,101 +2165,6 @@ static const struct qcom_icc_desc sm8550_system_noc = {
|
||||
.num_bcms = ARRAY_SIZE(system_noc_bcms),
|
||||
};
|
||||
|
||||
static int qnoc_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct qcom_icc_desc *desc;
|
||||
struct icc_onecell_data *data;
|
||||
struct icc_provider *provider;
|
||||
struct qcom_icc_node * const *qnodes;
|
||||
struct qcom_icc_provider *qp;
|
||||
struct icc_node *node;
|
||||
size_t num_nodes, i;
|
||||
int ret;
|
||||
|
||||
desc = device_get_match_data(&pdev->dev);
|
||||
if (!desc)
|
||||
return -EINVAL;
|
||||
|
||||
qnodes = desc->nodes;
|
||||
num_nodes = desc->num_nodes;
|
||||
|
||||
qp = devm_kzalloc(&pdev->dev, sizeof(*qp), GFP_KERNEL);
|
||||
if (!qp)
|
||||
return -ENOMEM;
|
||||
|
||||
data = devm_kcalloc(&pdev->dev, num_nodes, sizeof(*node), GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
provider = &qp->provider;
|
||||
provider->dev = &pdev->dev;
|
||||
provider->set = qcom_icc_set;
|
||||
provider->pre_aggregate = qcom_icc_pre_aggregate;
|
||||
provider->aggregate = qcom_icc_aggregate;
|
||||
provider->xlate_extended = qcom_icc_xlate_extended;
|
||||
INIT_LIST_HEAD(&provider->nodes);
|
||||
provider->data = data;
|
||||
|
||||
qp->dev = &pdev->dev;
|
||||
qp->bcms = desc->bcms;
|
||||
qp->num_bcms = desc->num_bcms;
|
||||
|
||||
qp->voter = of_bcm_voter_get(qp->dev, NULL);
|
||||
if (IS_ERR(qp->voter))
|
||||
return PTR_ERR(qp->voter);
|
||||
|
||||
ret = icc_provider_add(provider);
|
||||
if (ret) {
|
||||
dev_err_probe(&pdev->dev, ret,
|
||||
"error adding interconnect provider\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
for (i = 0; i < qp->num_bcms; i++)
|
||||
qcom_icc_bcm_init(qp->bcms[i], &pdev->dev);
|
||||
|
||||
for (i = 0; i < num_nodes; i++) {
|
||||
size_t j;
|
||||
|
||||
if (!qnodes[i])
|
||||
continue;
|
||||
|
||||
node = icc_node_create(qnodes[i]->id);
|
||||
if (IS_ERR(node)) {
|
||||
ret = PTR_ERR(node);
|
||||
goto err;
|
||||
}
|
||||
|
||||
node->name = qnodes[i]->name;
|
||||
node->data = qnodes[i];
|
||||
icc_node_add(node, provider);
|
||||
|
||||
for (j = 0; j < qnodes[i]->num_links; j++)
|
||||
icc_link_create(node, qnodes[i]->links[j]);
|
||||
|
||||
data->nodes[i] = node;
|
||||
}
|
||||
data->num_nodes = num_nodes;
|
||||
|
||||
platform_set_drvdata(pdev, qp);
|
||||
|
||||
return 0;
|
||||
err:
|
||||
icc_nodes_remove(provider);
|
||||
icc_provider_del(provider);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int qnoc_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct qcom_icc_provider *qp = platform_get_drvdata(pdev);
|
||||
|
||||
icc_nodes_remove(&qp->provider);
|
||||
icc_provider_del(&qp->provider);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id qnoc_of_match[] = {
|
||||
{ .compatible = "qcom,sm8550-aggre1-noc",
|
||||
.data = &sm8550_aggre1_noc},
|
||||
@ -2294,8 +2199,8 @@ static const struct of_device_id qnoc_of_match[] = {
|
||||
MODULE_DEVICE_TABLE(of, qnoc_of_match);
|
||||
|
||||
static struct platform_driver qnoc_driver = {
|
||||
.probe = qnoc_probe,
|
||||
.remove = qnoc_remove,
|
||||
.probe = qcom_icc_rpmh_probe,
|
||||
.remove = qcom_icc_rpmh_remove,
|
||||
.driver = {
|
||||
.name = "qnoc-sm8550",
|
||||
.of_match_table = qnoc_of_match,
|
||||
|
@ -96,14 +96,9 @@ static struct icc_node *exynos_generic_icc_xlate(struct of_phandle_args *spec,
|
||||
static int exynos_generic_icc_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct exynos_icc_priv *priv = platform_get_drvdata(pdev);
|
||||
struct icc_node *parent_node, *node = priv->node;
|
||||
|
||||
parent_node = exynos_icc_get_parent(priv->dev->parent->of_node);
|
||||
if (parent_node && !IS_ERR(parent_node))
|
||||
icc_link_destroy(node, parent_node);
|
||||
|
||||
icc_provider_deregister(&priv->provider);
|
||||
icc_nodes_remove(&priv->provider);
|
||||
icc_provider_del(&priv->provider);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -132,15 +127,11 @@ static int exynos_generic_icc_probe(struct platform_device *pdev)
|
||||
provider->inter_set = true;
|
||||
provider->data = priv;
|
||||
|
||||
ret = icc_provider_add(provider);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
icc_provider_init(provider);
|
||||
|
||||
icc_node = icc_node_create(pdev->id);
|
||||
if (IS_ERR(icc_node)) {
|
||||
ret = PTR_ERR(icc_node);
|
||||
goto err_prov_del;
|
||||
}
|
||||
if (IS_ERR(icc_node))
|
||||
return PTR_ERR(icc_node);
|
||||
|
||||
priv->node = icc_node;
|
||||
icc_node->name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%pOFn",
|
||||
@ -149,6 +140,9 @@ static int exynos_generic_icc_probe(struct platform_device *pdev)
|
||||
&priv->bus_clk_ratio))
|
||||
priv->bus_clk_ratio = EXYNOS_ICC_DEFAULT_BUS_CLK_RATIO;
|
||||
|
||||
icc_node->data = priv;
|
||||
icc_node_add(icc_node, provider);
|
||||
|
||||
/*
|
||||
* Register a PM QoS request for the parent (devfreq) device.
|
||||
*/
|
||||
@ -157,9 +151,6 @@ static int exynos_generic_icc_probe(struct platform_device *pdev)
|
||||
if (ret < 0)
|
||||
goto err_node_del;
|
||||
|
||||
icc_node->data = priv;
|
||||
icc_node_add(icc_node, provider);
|
||||
|
||||
icc_parent_node = exynos_icc_get_parent(bus_dev->of_node);
|
||||
if (IS_ERR(icc_parent_node)) {
|
||||
ret = PTR_ERR(icc_parent_node);
|
||||
@ -171,14 +162,17 @@ static int exynos_generic_icc_probe(struct platform_device *pdev)
|
||||
goto err_pmqos_del;
|
||||
}
|
||||
|
||||
ret = icc_provider_register(provider);
|
||||
if (ret < 0)
|
||||
goto err_pmqos_del;
|
||||
|
||||
return 0;
|
||||
|
||||
err_pmqos_del:
|
||||
dev_pm_qos_remove_request(&priv->qos_req);
|
||||
err_node_del:
|
||||
icc_nodes_remove(provider);
|
||||
err_prov_del:
|
||||
icc_provider_del(provider);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -488,7 +488,7 @@ static enum m5mols_restype __find_restype(u32 code)
|
||||
do {
|
||||
if (code == m5mols_default_ffmt[type].code)
|
||||
return type;
|
||||
} while (type++ != SIZE_DEFAULT_FFMT);
|
||||
} while (++type != SIZE_DEFAULT_FFMT);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -794,16 +794,12 @@ static int tegra_mc_interconnect_setup(struct tegra_mc *mc)
|
||||
mc->provider.aggregate = mc->soc->icc_ops->aggregate;
|
||||
mc->provider.xlate_extended = mc->soc->icc_ops->xlate_extended;
|
||||
|
||||
err = icc_provider_add(&mc->provider);
|
||||
if (err)
|
||||
return err;
|
||||
icc_provider_init(&mc->provider);
|
||||
|
||||
/* create Memory Controller node */
|
||||
node = icc_node_create(TEGRA_ICC_MC);
|
||||
if (IS_ERR(node)) {
|
||||
err = PTR_ERR(node);
|
||||
goto del_provider;
|
||||
}
|
||||
if (IS_ERR(node))
|
||||
return PTR_ERR(node);
|
||||
|
||||
node->name = "Memory Controller";
|
||||
icc_node_add(node, &mc->provider);
|
||||
@ -830,12 +826,14 @@ static int tegra_mc_interconnect_setup(struct tegra_mc *mc)
|
||||
goto remove_nodes;
|
||||
}
|
||||
|
||||
err = icc_provider_register(&mc->provider);
|
||||
if (err)
|
||||
goto remove_nodes;
|
||||
|
||||
return 0;
|
||||
|
||||
remove_nodes:
|
||||
icc_nodes_remove(&mc->provider);
|
||||
del_provider:
|
||||
icc_provider_del(&mc->provider);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -1351,15 +1351,13 @@ static int tegra_emc_interconnect_init(struct tegra_emc *emc)
|
||||
emc->provider.aggregate = soc->icc_ops->aggregate;
|
||||
emc->provider.xlate_extended = emc_of_icc_xlate_extended;
|
||||
|
||||
err = icc_provider_add(&emc->provider);
|
||||
if (err)
|
||||
goto err_msg;
|
||||
icc_provider_init(&emc->provider);
|
||||
|
||||
/* create External Memory Controller node */
|
||||
node = icc_node_create(TEGRA_ICC_EMC);
|
||||
if (IS_ERR(node)) {
|
||||
err = PTR_ERR(node);
|
||||
goto del_provider;
|
||||
goto err_msg;
|
||||
}
|
||||
|
||||
node->name = "External Memory Controller";
|
||||
@ -1380,12 +1378,14 @@ static int tegra_emc_interconnect_init(struct tegra_emc *emc)
|
||||
node->name = "External Memory (DRAM)";
|
||||
icc_node_add(node, &emc->provider);
|
||||
|
||||
err = icc_provider_register(&emc->provider);
|
||||
if (err)
|
||||
goto remove_nodes;
|
||||
|
||||
return 0;
|
||||
|
||||
remove_nodes:
|
||||
icc_nodes_remove(&emc->provider);
|
||||
del_provider:
|
||||
icc_provider_del(&emc->provider);
|
||||
err_msg:
|
||||
dev_err(emc->dev, "failed to initialize ICC: %d\n", err);
|
||||
|
||||
|
@ -1021,15 +1021,13 @@ static int tegra_emc_interconnect_init(struct tegra_emc *emc)
|
||||
emc->provider.aggregate = soc->icc_ops->aggregate;
|
||||
emc->provider.xlate_extended = emc_of_icc_xlate_extended;
|
||||
|
||||
err = icc_provider_add(&emc->provider);
|
||||
if (err)
|
||||
goto err_msg;
|
||||
icc_provider_init(&emc->provider);
|
||||
|
||||
/* create External Memory Controller node */
|
||||
node = icc_node_create(TEGRA_ICC_EMC);
|
||||
if (IS_ERR(node)) {
|
||||
err = PTR_ERR(node);
|
||||
goto del_provider;
|
||||
goto err_msg;
|
||||
}
|
||||
|
||||
node->name = "External Memory Controller";
|
||||
@ -1050,12 +1048,14 @@ static int tegra_emc_interconnect_init(struct tegra_emc *emc)
|
||||
node->name = "External Memory (DRAM)";
|
||||
icc_node_add(node, &emc->provider);
|
||||
|
||||
err = icc_provider_register(&emc->provider);
|
||||
if (err)
|
||||
goto remove_nodes;
|
||||
|
||||
return 0;
|
||||
|
||||
remove_nodes:
|
||||
icc_nodes_remove(&emc->provider);
|
||||
del_provider:
|
||||
icc_provider_del(&emc->provider);
|
||||
err_msg:
|
||||
dev_err(emc->dev, "failed to initialize ICC: %d\n", err);
|
||||
|
||||
|
@ -1533,15 +1533,13 @@ static int tegra_emc_interconnect_init(struct tegra_emc *emc)
|
||||
emc->provider.aggregate = soc->icc_ops->aggregate;
|
||||
emc->provider.xlate_extended = emc_of_icc_xlate_extended;
|
||||
|
||||
err = icc_provider_add(&emc->provider);
|
||||
if (err)
|
||||
goto err_msg;
|
||||
icc_provider_init(&emc->provider);
|
||||
|
||||
/* create External Memory Controller node */
|
||||
node = icc_node_create(TEGRA_ICC_EMC);
|
||||
if (IS_ERR(node)) {
|
||||
err = PTR_ERR(node);
|
||||
goto del_provider;
|
||||
goto err_msg;
|
||||
}
|
||||
|
||||
node->name = "External Memory Controller";
|
||||
@ -1562,12 +1560,14 @@ static int tegra_emc_interconnect_init(struct tegra_emc *emc)
|
||||
node->name = "External Memory (DRAM)";
|
||||
icc_node_add(node, &emc->provider);
|
||||
|
||||
err = icc_provider_register(&emc->provider);
|
||||
if (err)
|
||||
goto remove_nodes;
|
||||
|
||||
return 0;
|
||||
|
||||
remove_nodes:
|
||||
icc_nodes_remove(&emc->provider);
|
||||
del_provider:
|
||||
icc_provider_del(&emc->provider);
|
||||
err_msg:
|
||||
dev_err(emc->dev, "failed to initialize ICC: %d\n", err);
|
||||
|
||||
|
@ -263,7 +263,7 @@ static int b53_mmap_probe_of(struct platform_device *pdev,
|
||||
if (of_property_read_u32(of_port, "reg", ®))
|
||||
continue;
|
||||
|
||||
if (reg < B53_CPU_PORT)
|
||||
if (reg < B53_N_PORTS)
|
||||
pdata->enabled_ports |= BIT(reg);
|
||||
}
|
||||
|
||||
|
@ -397,6 +397,9 @@ mt7530_fdb_write(struct mt7530_priv *priv, u16 vid,
|
||||
/* Set up switch core clock for MT7530 */
|
||||
static void mt7530_pll_setup(struct mt7530_priv *priv)
|
||||
{
|
||||
/* Disable core clock */
|
||||
core_clear(priv, CORE_TRGMII_GSW_CLK_CG, REG_GSWCK_EN);
|
||||
|
||||
/* Disable PLL */
|
||||
core_write(priv, CORE_GSWPLL_GRP1, 0);
|
||||
|
||||
@ -410,14 +413,19 @@ static void mt7530_pll_setup(struct mt7530_priv *priv)
|
||||
RG_GSWPLL_EN_PRE |
|
||||
RG_GSWPLL_POSDIV_200M(2) |
|
||||
RG_GSWPLL_FBKDIV_200M(32));
|
||||
|
||||
udelay(20);
|
||||
|
||||
/* Enable core clock */
|
||||
core_set(priv, CORE_TRGMII_GSW_CLK_CG, REG_GSWCK_EN);
|
||||
}
|
||||
|
||||
/* Setup TX circuit including relevant PAD and driving */
|
||||
/* Setup port 6 interface mode and TRGMII TX circuit */
|
||||
static int
|
||||
mt7530_pad_clk_setup(struct dsa_switch *ds, phy_interface_t interface)
|
||||
{
|
||||
struct mt7530_priv *priv = ds->priv;
|
||||
u32 ncpo1, ssc_delta, trgint, i, xtal;
|
||||
u32 ncpo1, ssc_delta, trgint, xtal;
|
||||
|
||||
xtal = mt7530_read(priv, MT7530_MHWTRAP) & HWTRAP_XTAL_MASK;
|
||||
|
||||
@ -434,6 +442,10 @@ mt7530_pad_clk_setup(struct dsa_switch *ds, phy_interface_t interface)
|
||||
break;
|
||||
case PHY_INTERFACE_MODE_TRGMII:
|
||||
trgint = 1;
|
||||
if (xtal == HWTRAP_XTAL_25MHZ)
|
||||
ssc_delta = 0x57;
|
||||
else
|
||||
ssc_delta = 0x87;
|
||||
if (priv->id == ID_MT7621) {
|
||||
/* PLL frequency: 150MHz: 1.2GBit */
|
||||
if (xtal == HWTRAP_XTAL_40MHZ)
|
||||
@ -453,23 +465,12 @@ mt7530_pad_clk_setup(struct dsa_switch *ds, phy_interface_t interface)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (xtal == HWTRAP_XTAL_25MHZ)
|
||||
ssc_delta = 0x57;
|
||||
else
|
||||
ssc_delta = 0x87;
|
||||
|
||||
mt7530_rmw(priv, MT7530_P6ECR, P6_INTF_MODE_MASK,
|
||||
P6_INTF_MODE(trgint));
|
||||
|
||||
if (trgint) {
|
||||
/* Lower Tx Driving for TRGMII path */
|
||||
for (i = 0 ; i < NUM_TRGMII_CTRL ; i++)
|
||||
mt7530_write(priv, MT7530_TRGMII_TD_ODT(i),
|
||||
TD_DM_DRVP(8) | TD_DM_DRVN(8));
|
||||
|
||||
/* Disable MT7530 core and TRGMII Tx clocks */
|
||||
core_clear(priv, CORE_TRGMII_GSW_CLK_CG,
|
||||
REG_GSWCK_EN | REG_TRGMIICK_EN);
|
||||
/* Disable the MT7530 TRGMII clocks */
|
||||
core_clear(priv, CORE_TRGMII_GSW_CLK_CG, REG_TRGMIICK_EN);
|
||||
|
||||
/* Setup the MT7530 TRGMII Tx Clock */
|
||||
core_write(priv, CORE_PLL_GROUP5, RG_LCDDS_PCW_NCPO1(ncpo1));
|
||||
@ -486,13 +487,8 @@ mt7530_pad_clk_setup(struct dsa_switch *ds, phy_interface_t interface)
|
||||
RG_LCDDS_PCW_NCPO_CHG | RG_LCCDS_C(3) |
|
||||
RG_LCDDS_PWDB | RG_LCDDS_ISO_EN);
|
||||
|
||||
/* Enable MT7530 core and TRGMII Tx clocks */
|
||||
core_set(priv, CORE_TRGMII_GSW_CLK_CG,
|
||||
REG_GSWCK_EN | REG_TRGMIICK_EN);
|
||||
} else {
|
||||
for (i = 0 ; i < NUM_TRGMII_CTRL; i++)
|
||||
mt7530_rmw(priv, MT7530_TRGMII_RD(i),
|
||||
RD_TAP_MASK, RD_TAP(16));
|
||||
/* Enable the MT7530 TRGMII clocks */
|
||||
core_set(priv, CORE_TRGMII_GSW_CLK_CG, REG_TRGMIICK_EN);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -2202,6 +2198,15 @@ mt7530_setup(struct dsa_switch *ds)
|
||||
|
||||
mt7530_pll_setup(priv);
|
||||
|
||||
/* Lower Tx driving for TRGMII path */
|
||||
for (i = 0; i < NUM_TRGMII_CTRL; i++)
|
||||
mt7530_write(priv, MT7530_TRGMII_TD_ODT(i),
|
||||
TD_DM_DRVP(8) | TD_DM_DRVN(8));
|
||||
|
||||
for (i = 0; i < NUM_TRGMII_CTRL; i++)
|
||||
mt7530_rmw(priv, MT7530_TRGMII_RD(i),
|
||||
RD_TAP_MASK, RD_TAP(16));
|
||||
|
||||
/* Enable port 6 */
|
||||
val = mt7530_read(priv, MT7530_MHWTRAP);
|
||||
val &= ~MHWTRAP_P6_DIS & ~MHWTRAP_PHY_ACCESS;
|
||||
|
@ -370,8 +370,7 @@ static const struct ethtool_rmon_hist_range enetc_rmon_ranges[] = {
|
||||
};
|
||||
|
||||
static void enetc_rmon_stats(struct enetc_hw *hw, int mac,
|
||||
struct ethtool_rmon_stats *s,
|
||||
const struct ethtool_rmon_hist_range **ranges)
|
||||
struct ethtool_rmon_stats *s)
|
||||
{
|
||||
s->undersize_pkts = enetc_port_rd(hw, ENETC_PM_RUND(mac));
|
||||
s->oversize_pkts = enetc_port_rd(hw, ENETC_PM_ROVR(mac));
|
||||
@ -393,8 +392,6 @@ static void enetc_rmon_stats(struct enetc_hw *hw, int mac,
|
||||
s->hist_tx[4] = enetc_port_rd(hw, ENETC_PM_T1023(mac));
|
||||
s->hist_tx[5] = enetc_port_rd(hw, ENETC_PM_T1522(mac));
|
||||
s->hist_tx[6] = enetc_port_rd(hw, ENETC_PM_T1523X(mac));
|
||||
|
||||
*ranges = enetc_rmon_ranges;
|
||||
}
|
||||
|
||||
static void enetc_get_eth_mac_stats(struct net_device *ndev,
|
||||
@ -447,13 +444,15 @@ static void enetc_get_rmon_stats(struct net_device *ndev,
|
||||
struct enetc_hw *hw = &priv->si->hw;
|
||||
struct enetc_si *si = priv->si;
|
||||
|
||||
*ranges = enetc_rmon_ranges;
|
||||
|
||||
switch (rmon_stats->src) {
|
||||
case ETHTOOL_MAC_STATS_SRC_EMAC:
|
||||
enetc_rmon_stats(hw, 0, rmon_stats, ranges);
|
||||
enetc_rmon_stats(hw, 0, rmon_stats);
|
||||
break;
|
||||
case ETHTOOL_MAC_STATS_SRC_PMAC:
|
||||
if (si->hw_features & ENETC_SI_F_QBU)
|
||||
enetc_rmon_stats(hw, 1, rmon_stats, ranges);
|
||||
enetc_rmon_stats(hw, 1, rmon_stats);
|
||||
break;
|
||||
case ETHTOOL_MAC_STATS_SRC_AGGREGATE:
|
||||
ethtool_aggregate_rmon_stats(ndev, rmon_stats);
|
||||
|
@ -584,7 +584,10 @@ static int gve_get_link_ksettings(struct net_device *netdev,
|
||||
struct ethtool_link_ksettings *cmd)
|
||||
{
|
||||
struct gve_priv *priv = netdev_priv(netdev);
|
||||
int err = gve_adminq_report_link_speed(priv);
|
||||
int err = 0;
|
||||
|
||||
if (priv->link_speed == 0)
|
||||
err = gve_adminq_report_link_speed(priv);
|
||||
|
||||
cmd->base.speed = priv->link_speed;
|
||||
return err;
|
||||
|
@ -171,10 +171,10 @@ static char *i40e_create_dummy_packet(u8 *dummy_packet, bool ipv4, u8 l4proto,
|
||||
struct i40e_fdir_filter *data)
|
||||
{
|
||||
bool is_vlan = !!data->vlan_tag;
|
||||
struct vlan_hdr vlan;
|
||||
struct ipv6hdr ipv6;
|
||||
struct ethhdr eth;
|
||||
struct iphdr ip;
|
||||
struct vlan_hdr vlan = {};
|
||||
struct ipv6hdr ipv6 = {};
|
||||
struct ethhdr eth = {};
|
||||
struct iphdr ip = {};
|
||||
u8 *tmp;
|
||||
|
||||
if (ipv4) {
|
||||
|
@ -661,7 +661,7 @@ struct iavf_rx_ptype_decoded iavf_ptype_lookup[BIT(8)] = {
|
||||
/* Non Tunneled IPv6 */
|
||||
IAVF_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3),
|
||||
IAVF_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3),
|
||||
IAVF_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP, PAY3),
|
||||
IAVF_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP, PAY4),
|
||||
IAVF_PTT_UNUSED_ENTRY(91),
|
||||
IAVF_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP, PAY4),
|
||||
IAVF_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
|
||||
|
@ -893,6 +893,10 @@ static int iavf_vlan_rx_add_vid(struct net_device *netdev,
|
||||
{
|
||||
struct iavf_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
/* Do not track VLAN 0 filter, always added by the PF on VF init */
|
||||
if (!vid)
|
||||
return 0;
|
||||
|
||||
if (!VLAN_FILTERING_ALLOWED(adapter))
|
||||
return -EIO;
|
||||
|
||||
@ -919,6 +923,10 @@ static int iavf_vlan_rx_kill_vid(struct net_device *netdev,
|
||||
{
|
||||
struct iavf_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
/* We do not track VLAN 0 filter */
|
||||
if (!vid)
|
||||
return 0;
|
||||
|
||||
iavf_del_vlan(adapter, IAVF_VLAN(vid, be16_to_cpu(proto)));
|
||||
if (proto == cpu_to_be16(ETH_P_8021Q))
|
||||
clear_bit(vid, adapter->vsi.active_cvlans);
|
||||
@ -5066,6 +5074,11 @@ static void iavf_remove(struct pci_dev *pdev)
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
break;
|
||||
}
|
||||
/* Simply return if we already went through iavf_shutdown */
|
||||
if (adapter->state == __IAVF_REMOVE) {
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
usleep_range(500, 1000);
|
||||
|
@ -1096,7 +1096,7 @@ static inline void iavf_rx_hash(struct iavf_ring *ring,
|
||||
cpu_to_le64((u64)IAVF_RX_DESC_FLTSTAT_RSS_HASH <<
|
||||
IAVF_RX_DESC_STATUS_FLTSTAT_SHIFT);
|
||||
|
||||
if (ring->netdev->features & NETIF_F_RXHASH)
|
||||
if (!(ring->netdev->features & NETIF_F_RXHASH))
|
||||
return;
|
||||
|
||||
if ((rx_desc->wb.qword1.status_error_len & rss_mask) == rss_mask) {
|
||||
|
@ -2446,8 +2446,6 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter,
|
||||
list_for_each_entry(f, &adapter->vlan_filter_list, list) {
|
||||
if (f->is_new_vlan) {
|
||||
f->is_new_vlan = false;
|
||||
if (!f->vlan.vid)
|
||||
continue;
|
||||
if (f->vlan.tpid == ETH_P_8021Q)
|
||||
set_bit(f->vlan.vid,
|
||||
adapter->vsi.active_cvlans);
|
||||
|
@ -291,6 +291,7 @@ static void ice_vsi_delete_from_hw(struct ice_vsi *vsi)
|
||||
struct ice_vsi_ctx *ctxt;
|
||||
int status;
|
||||
|
||||
ice_fltr_remove_all(vsi);
|
||||
ctxt = kzalloc(sizeof(*ctxt), GFP_KERNEL);
|
||||
if (!ctxt)
|
||||
return;
|
||||
@ -2892,7 +2893,6 @@ void ice_vsi_decfg(struct ice_vsi *vsi)
|
||||
!test_bit(ICE_FLAG_FW_LLDP_AGENT, pf->flags))
|
||||
ice_cfg_sw_lldp(vsi, false, false);
|
||||
|
||||
ice_fltr_remove_all(vsi);
|
||||
ice_rm_vsi_lan_cfg(vsi->port_info, vsi->idx);
|
||||
err = ice_rm_vsi_rdma_cfg(vsi->port_info, vsi->idx);
|
||||
if (err)
|
||||
|
@ -4649,6 +4649,12 @@ static int ice_start_eth(struct ice_vsi *vsi)
|
||||
return err;
|
||||
}
|
||||
|
||||
static void ice_stop_eth(struct ice_vsi *vsi)
|
||||
{
|
||||
ice_fltr_remove_all(vsi);
|
||||
ice_vsi_close(vsi);
|
||||
}
|
||||
|
||||
static int ice_init_eth(struct ice_pf *pf)
|
||||
{
|
||||
struct ice_vsi *vsi = ice_get_main_vsi(pf);
|
||||
@ -5137,7 +5143,7 @@ void ice_unload(struct ice_pf *pf)
|
||||
{
|
||||
ice_deinit_features(pf);
|
||||
ice_deinit_rdma(pf);
|
||||
ice_vsi_close(ice_get_main_vsi(pf));
|
||||
ice_stop_eth(ice_get_main_vsi(pf));
|
||||
ice_vsi_decfg(ice_get_main_vsi(pf));
|
||||
ice_deinit_dev(pf);
|
||||
}
|
||||
|
@ -1331,15 +1331,15 @@ int ice_set_vf_trust(struct net_device *netdev, int vf_id, bool trusted)
|
||||
struct ice_vf *vf;
|
||||
int ret;
|
||||
|
||||
vf = ice_get_vf_by_id(pf, vf_id);
|
||||
if (!vf)
|
||||
return -EINVAL;
|
||||
|
||||
if (ice_is_eswitch_mode_switchdev(pf)) {
|
||||
dev_info(ice_pf_to_dev(pf), "Trusted VF is forbidden in switchdev mode\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
vf = ice_get_vf_by_id(pf, vf_id);
|
||||
if (!vf)
|
||||
return -EINVAL;
|
||||
|
||||
ret = ice_check_vf_ready_for_cfg(vf);
|
||||
if (ret)
|
||||
goto out_put_vf;
|
||||
|
@ -1210,6 +1210,7 @@ int ice_clean_rx_irq(struct ice_rx_ring *rx_ring, int budget)
|
||||
ice_vc_fdir_irq_handler(ctrl_vsi, rx_desc);
|
||||
if (++ntc == cnt)
|
||||
ntc = 0;
|
||||
rx_ring->first_desc = ntc;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -108,6 +108,7 @@ static void igb_free_all_rx_resources(struct igb_adapter *);
|
||||
static void igb_setup_mrqc(struct igb_adapter *);
|
||||
static int igb_probe(struct pci_dev *, const struct pci_device_id *);
|
||||
static void igb_remove(struct pci_dev *pdev);
|
||||
static void igb_init_queue_configuration(struct igb_adapter *adapter);
|
||||
static int igb_sw_init(struct igb_adapter *);
|
||||
int igb_open(struct net_device *);
|
||||
int igb_close(struct net_device *);
|
||||
@ -174,9 +175,7 @@ static void igb_nfc_filter_restore(struct igb_adapter *adapter);
|
||||
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
static int igb_vf_configure(struct igb_adapter *adapter, int vf);
|
||||
static int igb_pci_enable_sriov(struct pci_dev *dev, int num_vfs);
|
||||
static int igb_disable_sriov(struct pci_dev *dev);
|
||||
static int igb_pci_disable_sriov(struct pci_dev *dev);
|
||||
static int igb_disable_sriov(struct pci_dev *dev, bool reinit);
|
||||
#endif
|
||||
|
||||
static int igb_suspend(struct device *);
|
||||
@ -3664,7 +3663,7 @@ err_sw_init:
|
||||
kfree(adapter->shadow_vfta);
|
||||
igb_clear_interrupt_scheme(adapter);
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
igb_disable_sriov(pdev);
|
||||
igb_disable_sriov(pdev, false);
|
||||
#endif
|
||||
pci_iounmap(pdev, adapter->io_addr);
|
||||
err_ioremap:
|
||||
@ -3678,7 +3677,38 @@ err_dma:
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
static int igb_disable_sriov(struct pci_dev *pdev)
|
||||
static int igb_sriov_reinit(struct pci_dev *dev)
|
||||
{
|
||||
struct net_device *netdev = pci_get_drvdata(dev);
|
||||
struct igb_adapter *adapter = netdev_priv(netdev);
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
if (netif_running(netdev))
|
||||
igb_close(netdev);
|
||||
else
|
||||
igb_reset(adapter);
|
||||
|
||||
igb_clear_interrupt_scheme(adapter);
|
||||
|
||||
igb_init_queue_configuration(adapter);
|
||||
|
||||
if (igb_init_interrupt_scheme(adapter, true)) {
|
||||
rtnl_unlock();
|
||||
dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (netif_running(netdev))
|
||||
igb_open(netdev);
|
||||
|
||||
rtnl_unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int igb_disable_sriov(struct pci_dev *pdev, bool reinit)
|
||||
{
|
||||
struct net_device *netdev = pci_get_drvdata(pdev);
|
||||
struct igb_adapter *adapter = netdev_priv(netdev);
|
||||
@ -3712,10 +3742,10 @@ static int igb_disable_sriov(struct pci_dev *pdev)
|
||||
adapter->flags |= IGB_FLAG_DMAC;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return reinit ? igb_sriov_reinit(pdev) : 0;
|
||||
}
|
||||
|
||||
static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs)
|
||||
static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs, bool reinit)
|
||||
{
|
||||
struct net_device *netdev = pci_get_drvdata(pdev);
|
||||
struct igb_adapter *adapter = netdev_priv(netdev);
|
||||
@ -3780,12 +3810,6 @@ static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs)
|
||||
"Unable to allocate memory for VF MAC filter list\n");
|
||||
}
|
||||
|
||||
/* only call pci_enable_sriov() if no VFs are allocated already */
|
||||
if (!old_vfs) {
|
||||
err = pci_enable_sriov(pdev, adapter->vfs_allocated_count);
|
||||
if (err)
|
||||
goto err_out;
|
||||
}
|
||||
dev_info(&pdev->dev, "%d VFs allocated\n",
|
||||
adapter->vfs_allocated_count);
|
||||
for (i = 0; i < adapter->vfs_allocated_count; i++)
|
||||
@ -3793,6 +3817,17 @@ static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs)
|
||||
|
||||
/* DMA Coalescing is not supported in IOV mode. */
|
||||
adapter->flags &= ~IGB_FLAG_DMAC;
|
||||
|
||||
if (reinit) {
|
||||
err = igb_sriov_reinit(pdev);
|
||||
if (err)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
/* only call pci_enable_sriov() if no VFs are allocated already */
|
||||
if (!old_vfs)
|
||||
err = pci_enable_sriov(pdev, adapter->vfs_allocated_count);
|
||||
|
||||
goto out;
|
||||
|
||||
err_out:
|
||||
@ -3862,9 +3897,7 @@ static void igb_remove(struct pci_dev *pdev)
|
||||
igb_release_hw_control(adapter);
|
||||
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
rtnl_lock();
|
||||
igb_disable_sriov(pdev);
|
||||
rtnl_unlock();
|
||||
igb_disable_sriov(pdev, false);
|
||||
#endif
|
||||
|
||||
unregister_netdev(netdev);
|
||||
@ -3910,7 +3943,7 @@ static void igb_probe_vfs(struct igb_adapter *adapter)
|
||||
igb_reset_interrupt_capability(adapter);
|
||||
|
||||
pci_sriov_set_totalvfs(pdev, 7);
|
||||
igb_enable_sriov(pdev, max_vfs);
|
||||
igb_enable_sriov(pdev, max_vfs, false);
|
||||
|
||||
#endif /* CONFIG_PCI_IOV */
|
||||
}
|
||||
@ -9519,71 +9552,17 @@ static void igb_shutdown(struct pci_dev *pdev)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
static int igb_sriov_reinit(struct pci_dev *dev)
|
||||
{
|
||||
struct net_device *netdev = pci_get_drvdata(dev);
|
||||
struct igb_adapter *adapter = netdev_priv(netdev);
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
if (netif_running(netdev))
|
||||
igb_close(netdev);
|
||||
else
|
||||
igb_reset(adapter);
|
||||
|
||||
igb_clear_interrupt_scheme(adapter);
|
||||
|
||||
igb_init_queue_configuration(adapter);
|
||||
|
||||
if (igb_init_interrupt_scheme(adapter, true)) {
|
||||
rtnl_unlock();
|
||||
dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (netif_running(netdev))
|
||||
igb_open(netdev);
|
||||
|
||||
rtnl_unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int igb_pci_disable_sriov(struct pci_dev *dev)
|
||||
{
|
||||
int err = igb_disable_sriov(dev);
|
||||
|
||||
if (!err)
|
||||
err = igb_sriov_reinit(dev);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int igb_pci_enable_sriov(struct pci_dev *dev, int num_vfs)
|
||||
{
|
||||
int err = igb_enable_sriov(dev, num_vfs);
|
||||
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = igb_sriov_reinit(dev);
|
||||
if (!err)
|
||||
return num_vfs;
|
||||
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
#endif
|
||||
static int igb_pci_sriov_configure(struct pci_dev *dev, int num_vfs)
|
||||
{
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
if (num_vfs == 0)
|
||||
return igb_pci_disable_sriov(dev);
|
||||
else
|
||||
return igb_pci_enable_sriov(dev, num_vfs);
|
||||
int err;
|
||||
|
||||
if (num_vfs == 0) {
|
||||
return igb_disable_sriov(dev, true);
|
||||
} else {
|
||||
err = igb_enable_sriov(dev, num_vfs, true);
|
||||
return err ? err : num_vfs;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
@ -1074,7 +1074,7 @@ static int igbvf_request_msix(struct igbvf_adapter *adapter)
|
||||
igbvf_intr_msix_rx, 0, adapter->rx_ring->name,
|
||||
netdev);
|
||||
if (err)
|
||||
goto out;
|
||||
goto free_irq_tx;
|
||||
|
||||
adapter->rx_ring->itr_register = E1000_EITR(vector);
|
||||
adapter->rx_ring->itr_val = adapter->current_itr;
|
||||
@ -1083,10 +1083,14 @@ static int igbvf_request_msix(struct igbvf_adapter *adapter)
|
||||
err = request_irq(adapter->msix_entries[vector].vector,
|
||||
igbvf_msix_other, 0, netdev->name, netdev);
|
||||
if (err)
|
||||
goto out;
|
||||
goto free_irq_rx;
|
||||
|
||||
igbvf_configure_msix(adapter);
|
||||
return 0;
|
||||
free_irq_rx:
|
||||
free_irq(adapter->msix_entries[--vector].vector, netdev);
|
||||
free_irq_tx:
|
||||
free_irq(adapter->msix_entries[--vector].vector, netdev);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Copyright(c) 2009 - 2018 Intel Corporation. */
|
||||
|
||||
#include <linux/etherdevice.h>
|
||||
|
||||
#include "vf.h"
|
||||
|
||||
static s32 e1000_check_for_link_vf(struct e1000_hw *hw);
|
||||
@ -131,11 +133,16 @@ static s32 e1000_reset_hw_vf(struct e1000_hw *hw)
|
||||
/* set our "perm_addr" based on info provided by PF */
|
||||
ret_val = mbx->ops.read_posted(hw, msgbuf, 3);
|
||||
if (!ret_val) {
|
||||
if (msgbuf[0] == (E1000_VF_RESET |
|
||||
E1000_VT_MSGTYPE_ACK))
|
||||
switch (msgbuf[0]) {
|
||||
case E1000_VF_RESET | E1000_VT_MSGTYPE_ACK:
|
||||
memcpy(hw->mac.perm_addr, addr, ETH_ALEN);
|
||||
else
|
||||
break;
|
||||
case E1000_VF_RESET | E1000_VT_MSGTYPE_NACK:
|
||||
eth_zero_addr(hw->mac.perm_addr);
|
||||
break;
|
||||
default:
|
||||
ret_val = -E1000_ERR_MAC_INIT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6004,18 +6004,18 @@ static bool validate_schedule(struct igc_adapter *adapter,
|
||||
if (e->command != TC_TAPRIO_CMD_SET_GATES)
|
||||
return false;
|
||||
|
||||
for (i = 0; i < adapter->num_tx_queues; i++) {
|
||||
if (e->gate_mask & BIT(i))
|
||||
for (i = 0; i < adapter->num_tx_queues; i++)
|
||||
if (e->gate_mask & BIT(i)) {
|
||||
queue_uses[i]++;
|
||||
|
||||
/* There are limitations: A single queue cannot be
|
||||
* opened and closed multiple times per cycle unless the
|
||||
* gate stays open. Check for it.
|
||||
*/
|
||||
if (queue_uses[i] > 1 &&
|
||||
!(prev->gate_mask & BIT(i)))
|
||||
return false;
|
||||
}
|
||||
/* There are limitations: A single queue cannot
|
||||
* be opened and closed multiple times per cycle
|
||||
* unless the gate stays open. Check for it.
|
||||
*/
|
||||
if (queue_uses[i] > 1 &&
|
||||
!(prev->gate_mask & BIT(i)))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -709,6 +709,7 @@ err_unreg_netdev:
|
||||
err_ptp_destroy:
|
||||
otx2_ptp_destroy(vf);
|
||||
err_detach_rsrc:
|
||||
free_percpu(vf->hw.lmt_info);
|
||||
if (test_bit(CN10K_LMTST, &vf->hw.cap_flag))
|
||||
qmem_free(vf->dev, vf->dync_lmt);
|
||||
otx2_detach_resources(&vf->mbox);
|
||||
@ -762,6 +763,7 @@ static void otx2vf_remove(struct pci_dev *pdev)
|
||||
otx2_shutdown_tc(vf);
|
||||
otx2vf_disable_mbox_intr(vf);
|
||||
otx2_detach_resources(&vf->mbox);
|
||||
free_percpu(vf->hw.lmt_info);
|
||||
if (test_bit(CN10K_LMTST, &vf->hw.cap_flag))
|
||||
qmem_free(vf->dev, vf->dync_lmt);
|
||||
otx2vf_vfaf_mbox_destroy(vf);
|
||||
|
@ -674,7 +674,7 @@ int mlx4_en_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp)
|
||||
struct mlx4_en_xdp_buff *_ctx = (void *)ctx;
|
||||
|
||||
if (unlikely(_ctx->ring->hwtstamp_rx_filter != HWTSTAMP_FILTER_ALL))
|
||||
return -EOPNOTSUPP;
|
||||
return -ENODATA;
|
||||
|
||||
*timestamp = mlx4_en_get_hwtstamp(_ctx->mdev,
|
||||
mlx4_en_get_cqe_ts(_ctx->cqe));
|
||||
@ -686,7 +686,7 @@ int mlx4_en_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash)
|
||||
struct mlx4_en_xdp_buff *_ctx = (void *)ctx;
|
||||
|
||||
if (unlikely(!(_ctx->dev->features & NETIF_F_RXHASH)))
|
||||
return -EOPNOTSUPP;
|
||||
return -ENODATA;
|
||||
|
||||
*hash = be32_to_cpu(_ctx->cqe->immed_rss_invalid);
|
||||
return 0;
|
||||
|
@ -529,8 +529,8 @@ static void mlx5_devlink_hairpin_params_init_values(struct devlink *devlink)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
union devlink_param_value value;
|
||||
u32 link_speed = 0;
|
||||
u64 link_speed64;
|
||||
u32 link_speed;
|
||||
|
||||
/* set hairpin pair per each 50Gbs share of the link */
|
||||
mlx5_port_max_linkspeed(dev, &link_speed);
|
||||
|
@ -162,7 +162,7 @@ static int mlx5e_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp)
|
||||
const struct mlx5e_xdp_buff *_ctx = (void *)ctx;
|
||||
|
||||
if (unlikely(!mlx5e_rx_hw_stamp(_ctx->rq->tstamp)))
|
||||
return -EOPNOTSUPP;
|
||||
return -ENODATA;
|
||||
|
||||
*timestamp = mlx5e_cqe_ts_to_ns(_ctx->rq->ptp_cyc2time,
|
||||
_ctx->rq->clock, get_cqe_ts(_ctx->cqe));
|
||||
@ -174,7 +174,7 @@ static int mlx5e_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash)
|
||||
const struct mlx5e_xdp_buff *_ctx = (void *)ctx;
|
||||
|
||||
if (unlikely(!(_ctx->xdp.rxq->dev->features & NETIF_F_RXHASH)))
|
||||
return -EOPNOTSUPP;
|
||||
return -ENODATA;
|
||||
|
||||
*hash = be32_to_cpu(_ctx->cqe->rss_hash_result);
|
||||
return 0;
|
||||
|
@ -1412,6 +1412,7 @@ static int macsec_aso_query(struct mlx5_core_dev *mdev, struct mlx5e_macsec *mac
|
||||
struct mlx5e_macsec_aso *aso;
|
||||
struct mlx5_aso_wqe *aso_wqe;
|
||||
struct mlx5_aso *maso;
|
||||
unsigned long expires;
|
||||
int err;
|
||||
|
||||
aso = &macsec->aso;
|
||||
@ -1425,7 +1426,13 @@ static int macsec_aso_query(struct mlx5_core_dev *mdev, struct mlx5e_macsec *mac
|
||||
macsec_aso_build_wqe_ctrl_seg(aso, &aso_wqe->aso_ctrl, NULL);
|
||||
|
||||
mlx5_aso_post_wqe(maso, false, &aso_wqe->ctrl);
|
||||
err = mlx5_aso_poll_cq(maso, false);
|
||||
expires = jiffies + msecs_to_jiffies(10);
|
||||
do {
|
||||
err = mlx5_aso_poll_cq(maso, false);
|
||||
if (err)
|
||||
usleep_range(2, 10);
|
||||
} while (err && time_is_after_jiffies(expires));
|
||||
|
||||
if (err)
|
||||
goto err_out;
|
||||
|
||||
|
@ -117,12 +117,14 @@ static int mlx5e_dcbnl_ieee_getets(struct net_device *netdev,
|
||||
if (!MLX5_CAP_GEN(priv->mdev, ets))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ets->ets_cap = mlx5_max_tc(priv->mdev) + 1;
|
||||
for (i = 0; i < ets->ets_cap; i++) {
|
||||
for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) {
|
||||
err = mlx5_query_port_prio_tc(mdev, i, &ets->prio_tc[i]);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
ets->ets_cap = mlx5_max_tc(priv->mdev) + 1;
|
||||
for (i = 0; i < ets->ets_cap; i++) {
|
||||
err = mlx5_query_port_tc_group(mdev, i, &tc_group[i]);
|
||||
if (err)
|
||||
return err;
|
||||
|
@ -4150,8 +4150,12 @@ static netdev_features_t mlx5e_fix_features(struct net_device *netdev,
|
||||
}
|
||||
}
|
||||
|
||||
if (mlx5e_is_uplink_rep(priv))
|
||||
if (mlx5e_is_uplink_rep(priv)) {
|
||||
features = mlx5e_fix_uplink_rep_features(netdev, features);
|
||||
features |= NETIF_F_NETNS_LOCAL;
|
||||
} else {
|
||||
features &= ~NETIF_F_NETNS_LOCAL;
|
||||
}
|
||||
|
||||
mutex_unlock(&priv->state_lock);
|
||||
|
||||
|
@ -364,8 +364,7 @@ int mlx5_esw_acl_ingress_vport_metadata_update(struct mlx5_eswitch *esw, u16 vpo
|
||||
|
||||
if (WARN_ON_ONCE(IS_ERR(vport))) {
|
||||
esw_warn(esw->dev, "vport(%d) invalid!\n", vport_num);
|
||||
err = PTR_ERR(vport);
|
||||
goto out;
|
||||
return PTR_ERR(vport);
|
||||
}
|
||||
|
||||
esw_acl_ingress_ofld_rules_destroy(esw, vport);
|
||||
|
@ -959,6 +959,7 @@ void mlx5_esw_vport_disable(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
*/
|
||||
esw_vport_change_handle_locked(vport);
|
||||
vport->enabled_events = 0;
|
||||
esw_apply_vport_rx_mode(esw, vport, false, false);
|
||||
esw_vport_cleanup(esw, vport);
|
||||
esw->enabled_vports--;
|
||||
|
||||
|
@ -3403,6 +3403,18 @@ static int esw_inline_mode_to_devlink(u8 mlx5_mode, u8 *mode)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool esw_offloads_devlink_ns_eq_netdev_ns(struct devlink *devlink)
|
||||
{
|
||||
struct net *devl_net, *netdev_net;
|
||||
struct mlx5_eswitch *esw;
|
||||
|
||||
esw = mlx5_devlink_eswitch_get(devlink);
|
||||
netdev_net = dev_net(esw->dev->mlx5e_res.uplink_netdev);
|
||||
devl_net = devlink_net(devlink);
|
||||
|
||||
return net_eq(devl_net, netdev_net);
|
||||
}
|
||||
|
||||
int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
@ -3417,6 +3429,13 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
|
||||
if (esw_mode_from_devlink(mode, &mlx5_mode))
|
||||
return -EINVAL;
|
||||
|
||||
if (mode == DEVLINK_ESWITCH_MODE_SWITCHDEV &&
|
||||
!esw_offloads_devlink_ns_eq_netdev_ns(devlink)) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Can't change E-Switch mode to switchdev when netdev net namespace has diverged from the devlink's.");
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
mlx5_lag_disable_change(esw->dev);
|
||||
err = mlx5_esw_try_lock(esw);
|
||||
if (err < 0) {
|
||||
|
@ -105,7 +105,6 @@ struct mlxsw_thermal {
|
||||
struct thermal_zone_device *tzdev;
|
||||
int polling_delay;
|
||||
struct thermal_cooling_device *cdevs[MLXSW_MFCR_PWMS_MAX];
|
||||
u8 cooling_levels[MLXSW_THERMAL_MAX_STATE + 1];
|
||||
struct thermal_trip trips[MLXSW_THERMAL_NUM_TRIPS];
|
||||
struct mlxsw_cooling_states cooling_states[MLXSW_THERMAL_NUM_TRIPS];
|
||||
struct mlxsw_thermal_area line_cards[];
|
||||
@ -468,7 +467,7 @@ static int mlxsw_thermal_set_cur_state(struct thermal_cooling_device *cdev,
|
||||
return idx;
|
||||
|
||||
/* Normalize the state to the valid speed range. */
|
||||
state = thermal->cooling_levels[state];
|
||||
state = max_t(unsigned long, MLXSW_THERMAL_MIN_STATE, state);
|
||||
mlxsw_reg_mfsc_pack(mfsc_pl, idx, mlxsw_state_to_duty(state));
|
||||
err = mlxsw_reg_write(thermal->core, MLXSW_REG(mfsc), mfsc_pl);
|
||||
if (err) {
|
||||
@ -859,10 +858,6 @@ int mlxsw_thermal_init(struct mlxsw_core *core,
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialize cooling levels per PWM state. */
|
||||
for (i = 0; i < MLXSW_THERMAL_MAX_STATE; i++)
|
||||
thermal->cooling_levels[i] = max(MLXSW_THERMAL_MIN_STATE, i);
|
||||
|
||||
thermal->polling_delay = bus_info->low_frequency ?
|
||||
MLXSW_THERMAL_SLOW_POLL_INT :
|
||||
MLXSW_THERMAL_POLL_INT;
|
||||
|
@ -1354,7 +1354,7 @@ static int mlxsw_sp_fid_8021q_port_vid_map(struct mlxsw_sp_fid *fid,
|
||||
u16 vid)
|
||||
{
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
||||
u8 local_port = mlxsw_sp_port->local_port;
|
||||
u16 local_port = mlxsw_sp_port->local_port;
|
||||
int err;
|
||||
|
||||
/* In case there are no {Port, VID} => FID mappings on the port,
|
||||
@ -1391,7 +1391,7 @@ mlxsw_sp_fid_8021q_port_vid_unmap(struct mlxsw_sp_fid *fid,
|
||||
struct mlxsw_sp_port *mlxsw_sp_port, u16 vid)
|
||||
{
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
||||
u8 local_port = mlxsw_sp_port->local_port;
|
||||
u16 local_port = mlxsw_sp_port->local_port;
|
||||
|
||||
mlxsw_sp_fid_port_vid_list_del(fid, mlxsw_sp_port->local_port, vid);
|
||||
mlxsw_sp_fid_evid_map(fid, local_port, vid, false);
|
||||
|
@ -258,6 +258,7 @@ struct ocelot_stat_layout {
|
||||
struct ocelot_stats_region {
|
||||
struct list_head node;
|
||||
u32 base;
|
||||
enum ocelot_stat first_stat;
|
||||
int count;
|
||||
u32 *buf;
|
||||
};
|
||||
@ -273,6 +274,7 @@ static const struct ocelot_stat_layout ocelot_mm_stats_layout[OCELOT_NUM_STATS]
|
||||
OCELOT_STAT(RX_ASSEMBLY_OK),
|
||||
OCELOT_STAT(RX_MERGE_FRAGMENTS),
|
||||
OCELOT_STAT(TX_MERGE_FRAGMENTS),
|
||||
OCELOT_STAT(TX_MM_HOLD),
|
||||
OCELOT_STAT(RX_PMAC_OCTETS),
|
||||
OCELOT_STAT(RX_PMAC_UNICAST),
|
||||
OCELOT_STAT(RX_PMAC_MULTICAST),
|
||||
@ -341,11 +343,12 @@ static int ocelot_port_update_stats(struct ocelot *ocelot, int port)
|
||||
*/
|
||||
static void ocelot_port_transfer_stats(struct ocelot *ocelot, int port)
|
||||
{
|
||||
unsigned int idx = port * OCELOT_NUM_STATS;
|
||||
struct ocelot_stats_region *region;
|
||||
int j;
|
||||
|
||||
list_for_each_entry(region, &ocelot->stats_regions, node) {
|
||||
unsigned int idx = port * OCELOT_NUM_STATS + region->first_stat;
|
||||
|
||||
for (j = 0; j < region->count; j++) {
|
||||
u64 *stat = &ocelot->stats[idx + j];
|
||||
u64 val = region->buf[j];
|
||||
@ -355,8 +358,6 @@ static void ocelot_port_transfer_stats(struct ocelot *ocelot, int port)
|
||||
|
||||
*stat = (*stat & ~(u64)U32_MAX) + val;
|
||||
}
|
||||
|
||||
idx += region->count;
|
||||
}
|
||||
}
|
||||
|
||||
@ -899,7 +900,8 @@ static int ocelot_prepare_stats_regions(struct ocelot *ocelot)
|
||||
if (!layout[i].reg)
|
||||
continue;
|
||||
|
||||
if (region && layout[i].reg == last + 4) {
|
||||
if (region && ocelot->map[SYS][layout[i].reg & REG_MASK] ==
|
||||
ocelot->map[SYS][last & REG_MASK] + 4) {
|
||||
region->count++;
|
||||
} else {
|
||||
region = devm_kzalloc(ocelot->dev, sizeof(*region),
|
||||
@ -914,6 +916,7 @@ static int ocelot_prepare_stats_regions(struct ocelot *ocelot)
|
||||
WARN_ON(last >= layout[i].reg);
|
||||
|
||||
region->base = layout[i].reg;
|
||||
region->first_stat = i;
|
||||
region->count = 1;
|
||||
list_add_tail(®ion->node, &ocelot->stats_regions);
|
||||
}
|
||||
|
@ -292,7 +292,7 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev)
|
||||
*/
|
||||
|
||||
laddr = dma_map_single(lp->device, skb->data, length, DMA_TO_DEVICE);
|
||||
if (!laddr) {
|
||||
if (dma_mapping_error(lp->device, laddr)) {
|
||||
pr_err_ratelimited("%s: failed to map tx DMA buffer.\n", dev->name);
|
||||
dev_kfree_skb_any(skb);
|
||||
return NETDEV_TX_OK;
|
||||
@ -509,7 +509,7 @@ static bool sonic_alloc_rb(struct net_device *dev, struct sonic_local *lp,
|
||||
|
||||
*new_addr = dma_map_single(lp->device, skb_put(*new_skb, SONIC_RBSIZE),
|
||||
SONIC_RBSIZE, DMA_FROM_DEVICE);
|
||||
if (!*new_addr) {
|
||||
if (dma_mapping_error(lp->device, *new_addr)) {
|
||||
dev_kfree_skb(*new_skb);
|
||||
*new_skb = NULL;
|
||||
return false;
|
||||
|
@ -4404,6 +4404,9 @@ qed_iov_configure_min_tx_rate(struct qed_dev *cdev, int vfid, u32 rate)
|
||||
}
|
||||
|
||||
vf = qed_iov_get_vf_info(QED_LEADING_HWFN(cdev), (u16)vfid, true);
|
||||
if (!vf)
|
||||
return -EINVAL;
|
||||
|
||||
vport_id = vf->vport_id;
|
||||
|
||||
return qed_configure_vport_wfq(cdev, vport_id, rate);
|
||||
@ -5152,7 +5155,7 @@ static void qed_iov_handle_trust_change(struct qed_hwfn *hwfn)
|
||||
|
||||
/* Validate that the VF has a configured vport */
|
||||
vf = qed_iov_get_vf_info(hwfn, i, true);
|
||||
if (!vf->vport_instance)
|
||||
if (!vf || !vf->vport_instance)
|
||||
continue;
|
||||
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
|
@ -724,9 +724,15 @@ static int emac_remove(struct platform_device *pdev)
|
||||
struct net_device *netdev = dev_get_drvdata(&pdev->dev);
|
||||
struct emac_adapter *adpt = netdev_priv(netdev);
|
||||
|
||||
netif_carrier_off(netdev);
|
||||
netif_tx_disable(netdev);
|
||||
|
||||
unregister_netdev(netdev);
|
||||
netif_napi_del(&adpt->rx_q.napi);
|
||||
|
||||
free_irq(adpt->irq.irq, &adpt->irq);
|
||||
cancel_work_sync(&adpt->work_thread);
|
||||
|
||||
emac_clks_teardown(adpt);
|
||||
|
||||
put_device(&adpt->phydev->mdio.dev);
|
||||
|
@ -418,6 +418,7 @@ struct dma_features {
|
||||
unsigned int frpbs;
|
||||
unsigned int frpes;
|
||||
unsigned int addr64;
|
||||
unsigned int host_dma_width;
|
||||
unsigned int rssen;
|
||||
unsigned int vlhash;
|
||||
unsigned int sphen;
|
||||
|
@ -288,7 +288,7 @@ static int imx_dwmac_probe(struct platform_device *pdev)
|
||||
goto err_parse_dt;
|
||||
}
|
||||
|
||||
plat_dat->addr64 = dwmac->ops->addr_width;
|
||||
plat_dat->host_dma_width = dwmac->ops->addr_width;
|
||||
plat_dat->init = imx_dwmac_init;
|
||||
plat_dat->exit = imx_dwmac_exit;
|
||||
plat_dat->clks_config = imx_dwmac_clks_config;
|
||||
|
@ -684,7 +684,7 @@ static int ehl_pse0_common_data(struct pci_dev *pdev,
|
||||
|
||||
intel_priv->is_pse = true;
|
||||
plat->bus_id = 2;
|
||||
plat->addr64 = 32;
|
||||
plat->host_dma_width = 32;
|
||||
|
||||
plat->clk_ptp_rate = 200000000;
|
||||
|
||||
@ -725,7 +725,7 @@ static int ehl_pse1_common_data(struct pci_dev *pdev,
|
||||
|
||||
intel_priv->is_pse = true;
|
||||
plat->bus_id = 3;
|
||||
plat->addr64 = 32;
|
||||
plat->host_dma_width = 32;
|
||||
|
||||
plat->clk_ptp_rate = 200000000;
|
||||
|
||||
|
@ -591,7 +591,7 @@ static int mediatek_dwmac_common_data(struct platform_device *pdev,
|
||||
plat->use_phy_wol = priv_plat->mac_wol ? 0 : 1;
|
||||
plat->riwt_off = 1;
|
||||
plat->maxmtu = ETH_DATA_LEN;
|
||||
plat->addr64 = priv_plat->variant->dma_bit_mask;
|
||||
plat->host_dma_width = priv_plat->variant->dma_bit_mask;
|
||||
plat->bsp_priv = priv_plat;
|
||||
plat->init = mediatek_dwmac_init;
|
||||
plat->clks_config = mediatek_dwmac_clks_config;
|
||||
|
@ -1431,7 +1431,7 @@ static int stmmac_init_rx_buffers(struct stmmac_priv *priv,
|
||||
struct stmmac_rx_buffer *buf = &rx_q->buf_pool[i];
|
||||
gfp_t gfp = (GFP_ATOMIC | __GFP_NOWARN);
|
||||
|
||||
if (priv->dma_cap.addr64 <= 32)
|
||||
if (priv->dma_cap.host_dma_width <= 32)
|
||||
gfp |= GFP_DMA32;
|
||||
|
||||
if (!buf->page) {
|
||||
@ -4587,7 +4587,7 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv, u32 queue)
|
||||
unsigned int entry = rx_q->dirty_rx;
|
||||
gfp_t gfp = (GFP_ATOMIC | __GFP_NOWARN);
|
||||
|
||||
if (priv->dma_cap.addr64 <= 32)
|
||||
if (priv->dma_cap.host_dma_width <= 32)
|
||||
gfp |= GFP_DMA32;
|
||||
|
||||
while (dirty-- > 0) {
|
||||
@ -6205,7 +6205,7 @@ static int stmmac_dma_cap_show(struct seq_file *seq, void *v)
|
||||
seq_printf(seq, "\tFlexible RX Parser: %s\n",
|
||||
priv->dma_cap.frpsel ? "Y" : "N");
|
||||
seq_printf(seq, "\tEnhanced Addressing: %d\n",
|
||||
priv->dma_cap.addr64);
|
||||
priv->dma_cap.host_dma_width);
|
||||
seq_printf(seq, "\tReceive Side Scaling: %s\n",
|
||||
priv->dma_cap.rssen ? "Y" : "N");
|
||||
seq_printf(seq, "\tVLAN Hash Filtering: %s\n",
|
||||
@ -7178,20 +7178,22 @@ int stmmac_dvr_probe(struct device *device,
|
||||
dev_info(priv->device, "SPH feature enabled\n");
|
||||
}
|
||||
|
||||
/* The current IP register MAC_HW_Feature1[ADDR64] only define
|
||||
* 32/40/64 bit width, but some SOC support others like i.MX8MP
|
||||
* support 34 bits but it map to 40 bits width in MAC_HW_Feature1[ADDR64].
|
||||
* So overwrite dma_cap.addr64 according to HW real design.
|
||||
/* Ideally our host DMA address width is the same as for the
|
||||
* device. However, it may differ and then we have to use our
|
||||
* host DMA width for allocation and the device DMA width for
|
||||
* register handling.
|
||||
*/
|
||||
if (priv->plat->addr64)
|
||||
priv->dma_cap.addr64 = priv->plat->addr64;
|
||||
if (priv->plat->host_dma_width)
|
||||
priv->dma_cap.host_dma_width = priv->plat->host_dma_width;
|
||||
else
|
||||
priv->dma_cap.host_dma_width = priv->dma_cap.addr64;
|
||||
|
||||
if (priv->dma_cap.addr64) {
|
||||
if (priv->dma_cap.host_dma_width) {
|
||||
ret = dma_set_mask_and_coherent(device,
|
||||
DMA_BIT_MASK(priv->dma_cap.addr64));
|
||||
DMA_BIT_MASK(priv->dma_cap.host_dma_width));
|
||||
if (!ret) {
|
||||
dev_info(priv->device, "Using %d bits DMA width\n",
|
||||
priv->dma_cap.addr64);
|
||||
dev_info(priv->device, "Using %d/%d bits DMA host/device width\n",
|
||||
priv->dma_cap.host_dma_width, priv->dma_cap.addr64);
|
||||
|
||||
/*
|
||||
* If more than 32 bits can be addressed, make sure to
|
||||
@ -7206,7 +7208,7 @@ int stmmac_dvr_probe(struct device *device,
|
||||
goto error_hw_init;
|
||||
}
|
||||
|
||||
priv->dma_cap.addr64 = 32;
|
||||
priv->dma_cap.host_dma_width = 32;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -650,6 +650,10 @@ static void am65_cpts_perout_enable_hw(struct am65_cpts *cpts,
|
||||
val = lower_32_bits(cycles);
|
||||
am65_cpts_write32(cpts, val, genf[req->index].length);
|
||||
|
||||
am65_cpts_write32(cpts, 0, genf[req->index].control);
|
||||
am65_cpts_write32(cpts, 0, genf[req->index].ppm_hi);
|
||||
am65_cpts_write32(cpts, 0, genf[req->index].ppm_low);
|
||||
|
||||
cpts->genf_enable |= BIT(req->index);
|
||||
} else {
|
||||
am65_cpts_write32(cpts, 0, genf[req->index].length);
|
||||
|
@ -317,15 +317,17 @@ static int gelic_card_init_chain(struct gelic_card *card,
|
||||
|
||||
/* set up the hardware pointers in each descriptor */
|
||||
for (i = 0; i < no; i++, descr++) {
|
||||
gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE);
|
||||
descr->bus_addr =
|
||||
dma_map_single(ctodev(card), descr,
|
||||
GELIC_DESCR_SIZE,
|
||||
DMA_BIDIRECTIONAL);
|
||||
dma_addr_t cpu_addr;
|
||||
|
||||
if (!descr->bus_addr)
|
||||
gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE);
|
||||
|
||||
cpu_addr = dma_map_single(ctodev(card), descr,
|
||||
GELIC_DESCR_SIZE, DMA_BIDIRECTIONAL);
|
||||
|
||||
if (dma_mapping_error(ctodev(card), cpu_addr))
|
||||
goto iommu_error;
|
||||
|
||||
descr->bus_addr = cpu_to_be32(cpu_addr);
|
||||
descr->next = descr + 1;
|
||||
descr->prev = descr - 1;
|
||||
}
|
||||
@ -365,26 +367,28 @@ iommu_error:
|
||||
*
|
||||
* allocates a new rx skb, iommu-maps it and attaches it to the descriptor.
|
||||
* Activate the descriptor state-wise
|
||||
*
|
||||
* Gelic RX sk_buffs must be aligned to GELIC_NET_RXBUF_ALIGN and the length
|
||||
* must be a multiple of GELIC_NET_RXBUF_ALIGN.
|
||||
*/
|
||||
static int gelic_descr_prepare_rx(struct gelic_card *card,
|
||||
struct gelic_descr *descr)
|
||||
{
|
||||
static const unsigned int rx_skb_size =
|
||||
ALIGN(GELIC_NET_MAX_FRAME, GELIC_NET_RXBUF_ALIGN) +
|
||||
GELIC_NET_RXBUF_ALIGN - 1;
|
||||
dma_addr_t cpu_addr;
|
||||
int offset;
|
||||
unsigned int bufsize;
|
||||
|
||||
if (gelic_descr_get_status(descr) != GELIC_DESCR_DMA_NOT_IN_USE)
|
||||
dev_info(ctodev(card), "%s: ERROR status\n", __func__);
|
||||
/* we need to round up the buffer size to a multiple of 128 */
|
||||
bufsize = ALIGN(GELIC_NET_MAX_MTU, GELIC_NET_RXBUF_ALIGN);
|
||||
|
||||
/* and we need to have it 128 byte aligned, therefore we allocate a
|
||||
* bit more */
|
||||
descr->skb = dev_alloc_skb(bufsize + GELIC_NET_RXBUF_ALIGN - 1);
|
||||
descr->skb = netdev_alloc_skb(*card->netdev, rx_skb_size);
|
||||
if (!descr->skb) {
|
||||
descr->buf_addr = 0; /* tell DMAC don't touch memory */
|
||||
return -ENOMEM;
|
||||
}
|
||||
descr->buf_size = cpu_to_be32(bufsize);
|
||||
descr->buf_size = cpu_to_be32(rx_skb_size);
|
||||
descr->dmac_cmd_status = 0;
|
||||
descr->result_size = 0;
|
||||
descr->valid_size = 0;
|
||||
@ -395,11 +399,10 @@ static int gelic_descr_prepare_rx(struct gelic_card *card,
|
||||
if (offset)
|
||||
skb_reserve(descr->skb, GELIC_NET_RXBUF_ALIGN - offset);
|
||||
/* io-mmu-map the skb */
|
||||
descr->buf_addr = cpu_to_be32(dma_map_single(ctodev(card),
|
||||
descr->skb->data,
|
||||
GELIC_NET_MAX_MTU,
|
||||
DMA_FROM_DEVICE));
|
||||
if (!descr->buf_addr) {
|
||||
cpu_addr = dma_map_single(ctodev(card), descr->skb->data,
|
||||
GELIC_NET_MAX_FRAME, DMA_FROM_DEVICE);
|
||||
descr->buf_addr = cpu_to_be32(cpu_addr);
|
||||
if (dma_mapping_error(ctodev(card), cpu_addr)) {
|
||||
dev_kfree_skb_any(descr->skb);
|
||||
descr->skb = NULL;
|
||||
dev_info(ctodev(card),
|
||||
@ -779,7 +782,7 @@ static int gelic_descr_prepare_tx(struct gelic_card *card,
|
||||
|
||||
buf = dma_map_single(ctodev(card), skb->data, skb->len, DMA_TO_DEVICE);
|
||||
|
||||
if (!buf) {
|
||||
if (dma_mapping_error(ctodev(card), buf)) {
|
||||
dev_err(ctodev(card),
|
||||
"dma map 2 failed (%p, %i). Dropping packet\n",
|
||||
skb->data, skb->len);
|
||||
@ -915,7 +918,7 @@ static void gelic_net_pass_skb_up(struct gelic_descr *descr,
|
||||
data_error = be32_to_cpu(descr->data_error);
|
||||
/* unmap skb buffer */
|
||||
dma_unmap_single(ctodev(card), be32_to_cpu(descr->buf_addr),
|
||||
GELIC_NET_MAX_MTU,
|
||||
GELIC_NET_MAX_FRAME,
|
||||
DMA_FROM_DEVICE);
|
||||
|
||||
skb_put(skb, be32_to_cpu(descr->valid_size)?
|
||||
|
@ -19,8 +19,9 @@
|
||||
#define GELIC_NET_RX_DESCRIPTORS 128 /* num of descriptors */
|
||||
#define GELIC_NET_TX_DESCRIPTORS 128 /* num of descriptors */
|
||||
|
||||
#define GELIC_NET_MAX_MTU VLAN_ETH_FRAME_LEN
|
||||
#define GELIC_NET_MIN_MTU VLAN_ETH_ZLEN
|
||||
#define GELIC_NET_MAX_FRAME 2312
|
||||
#define GELIC_NET_MAX_MTU 2294
|
||||
#define GELIC_NET_MIN_MTU 64
|
||||
#define GELIC_NET_RXBUF_ALIGN 128
|
||||
#define GELIC_CARD_RX_CSUM_DEFAULT 1 /* hw chksum */
|
||||
#define GELIC_NET_WATCHDOG_TIMEOUT 5*HZ
|
||||
|
@ -503,6 +503,11 @@ static void
|
||||
xirc2ps_detach(struct pcmcia_device *link)
|
||||
{
|
||||
struct net_device *dev = link->priv;
|
||||
struct local_info *local = netdev_priv(dev);
|
||||
|
||||
netif_carrier_off(dev);
|
||||
netif_tx_disable(dev);
|
||||
cancel_work_sync(&local->tx_timeout_task);
|
||||
|
||||
dev_dbg(&link->dev, "detach\n");
|
||||
|
||||
|
@ -18,16 +18,18 @@ MODULE_AUTHOR("Calvin Johnson <calvin.johnson@oss.nxp.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
/**
|
||||
* acpi_mdiobus_register - Register mii_bus and create PHYs from the ACPI ASL.
|
||||
* __acpi_mdiobus_register - Register mii_bus and create PHYs from the ACPI ASL.
|
||||
* @mdio: pointer to mii_bus structure
|
||||
* @fwnode: pointer to fwnode of MDIO bus. This fwnode is expected to represent
|
||||
* @owner: module owning this @mdio object.
|
||||
* an ACPI device object corresponding to the MDIO bus and its children are
|
||||
* expected to correspond to the PHY devices on that bus.
|
||||
*
|
||||
* This function registers the mii_bus structure and registers a phy_device
|
||||
* for each child node of @fwnode.
|
||||
*/
|
||||
int acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode)
|
||||
int __acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode,
|
||||
struct module *owner)
|
||||
{
|
||||
struct fwnode_handle *child;
|
||||
u32 addr;
|
||||
@ -35,7 +37,7 @@ int acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode)
|
||||
|
||||
/* Mask out all PHYs from auto probing. */
|
||||
mdio->phy_mask = GENMASK(31, 0);
|
||||
ret = mdiobus_register(mdio);
|
||||
ret = __mdiobus_register(mdio, owner);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@ -55,4 +57,4 @@ int acpi_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_mdiobus_register);
|
||||
EXPORT_SYMBOL(__acpi_mdiobus_register);
|
||||
|
@ -106,6 +106,7 @@ static int thunder_mdiobus_pci_probe(struct pci_dev *pdev,
|
||||
if (i >= ARRAY_SIZE(nexus->buses))
|
||||
break;
|
||||
}
|
||||
fwnode_handle_put(fwn);
|
||||
return 0;
|
||||
|
||||
err_release_regions:
|
||||
|
@ -139,21 +139,23 @@ bool of_mdiobus_child_is_phy(struct device_node *child)
|
||||
EXPORT_SYMBOL(of_mdiobus_child_is_phy);
|
||||
|
||||
/**
|
||||
* of_mdiobus_register - Register mii_bus and create PHYs from the device tree
|
||||
* __of_mdiobus_register - Register mii_bus and create PHYs from the device tree
|
||||
* @mdio: pointer to mii_bus structure
|
||||
* @np: pointer to device_node of MDIO bus.
|
||||
* @owner: module owning the @mdio object.
|
||||
*
|
||||
* This function registers the mii_bus structure and registers a phy_device
|
||||
* for each child node of @np.
|
||||
*/
|
||||
int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
|
||||
int __of_mdiobus_register(struct mii_bus *mdio, struct device_node *np,
|
||||
struct module *owner)
|
||||
{
|
||||
struct device_node *child;
|
||||
bool scanphys = false;
|
||||
int addr, rc;
|
||||
|
||||
if (!np)
|
||||
return mdiobus_register(mdio);
|
||||
return __mdiobus_register(mdio, owner);
|
||||
|
||||
/* Do not continue if the node is disabled */
|
||||
if (!of_device_is_available(np))
|
||||
@ -172,7 +174,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
|
||||
of_property_read_u32(np, "reset-post-delay-us", &mdio->reset_post_delay_us);
|
||||
|
||||
/* Register the MDIO bus */
|
||||
rc = mdiobus_register(mdio);
|
||||
rc = __mdiobus_register(mdio, owner);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
@ -236,7 +238,7 @@ unregister:
|
||||
mdiobus_unregister(mdio);
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(of_mdiobus_register);
|
||||
EXPORT_SYMBOL(__of_mdiobus_register);
|
||||
|
||||
/**
|
||||
* of_mdio_find_device - Given a device tree node, find the mdio_device
|
||||
|
@ -98,13 +98,14 @@ EXPORT_SYMBOL(__devm_mdiobus_register);
|
||||
|
||||
#if IS_ENABLED(CONFIG_OF_MDIO)
|
||||
/**
|
||||
* devm_of_mdiobus_register - Resource managed variant of of_mdiobus_register()
|
||||
* __devm_of_mdiobus_register - Resource managed variant of of_mdiobus_register()
|
||||
* @dev: Device to register mii_bus for
|
||||
* @mdio: MII bus structure to register
|
||||
* @np: Device node to parse
|
||||
* @owner: Owning module
|
||||
*/
|
||||
int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,
|
||||
struct device_node *np)
|
||||
int __devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,
|
||||
struct device_node *np, struct module *owner)
|
||||
{
|
||||
struct mdiobus_devres *dr;
|
||||
int ret;
|
||||
@ -117,7 +118,7 @@ int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,
|
||||
if (!dr)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = of_mdiobus_register(mdio, np);
|
||||
ret = __of_mdiobus_register(mdio, np, owner);
|
||||
if (ret) {
|
||||
devres_free(dr);
|
||||
return ret;
|
||||
@ -127,7 +128,7 @@ int devm_of_mdiobus_register(struct device *dev, struct mii_bus *mdio,
|
||||
devres_add(dev, dr);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(devm_of_mdiobus_register);
|
||||
EXPORT_SYMBOL(__devm_of_mdiobus_register);
|
||||
#endif /* CONFIG_OF_MDIO */
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -57,6 +57,18 @@ static const char *phy_state_to_str(enum phy_state st)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void phy_process_state_change(struct phy_device *phydev,
|
||||
enum phy_state old_state)
|
||||
{
|
||||
if (old_state != phydev->state) {
|
||||
phydev_dbg(phydev, "PHY state change %s -> %s\n",
|
||||
phy_state_to_str(old_state),
|
||||
phy_state_to_str(phydev->state));
|
||||
if (phydev->drv && phydev->drv->link_change_notify)
|
||||
phydev->drv->link_change_notify(phydev);
|
||||
}
|
||||
}
|
||||
|
||||
static void phy_link_up(struct phy_device *phydev)
|
||||
{
|
||||
phydev->phy_link_change(phydev, true);
|
||||
@ -1312,6 +1324,7 @@ EXPORT_SYMBOL(phy_free_interrupt);
|
||||
void phy_stop(struct phy_device *phydev)
|
||||
{
|
||||
struct net_device *dev = phydev->attached_dev;
|
||||
enum phy_state old_state;
|
||||
|
||||
if (!phy_is_started(phydev) && phydev->state != PHY_DOWN) {
|
||||
WARN(1, "called from state %s\n",
|
||||
@ -1320,6 +1333,7 @@ void phy_stop(struct phy_device *phydev)
|
||||
}
|
||||
|
||||
mutex_lock(&phydev->lock);
|
||||
old_state = phydev->state;
|
||||
|
||||
if (phydev->state == PHY_CABLETEST) {
|
||||
phy_abort_cable_test(phydev);
|
||||
@ -1330,6 +1344,7 @@ void phy_stop(struct phy_device *phydev)
|
||||
sfp_upstream_stop(phydev->sfp_bus);
|
||||
|
||||
phydev->state = PHY_HALTED;
|
||||
phy_process_state_change(phydev, old_state);
|
||||
|
||||
mutex_unlock(&phydev->lock);
|
||||
|
||||
@ -1451,13 +1466,7 @@ void phy_state_machine(struct work_struct *work)
|
||||
if (err < 0)
|
||||
phy_error_precise(phydev, func, err);
|
||||
|
||||
if (old_state != phydev->state) {
|
||||
phydev_dbg(phydev, "PHY state change %s -> %s\n",
|
||||
phy_state_to_str(old_state),
|
||||
phy_state_to_str(phydev->state));
|
||||
if (phydev->drv && phydev->drv->link_change_notify)
|
||||
phydev->drv->link_change_notify(phydev);
|
||||
}
|
||||
phy_process_state_change(phydev, old_state);
|
||||
|
||||
/* Only re-schedule a PHY state machine change if we are polling the
|
||||
* PHY, if PHY_MAC_INTERRUPT is set, then we will be moving
|
||||
|
@ -2214,6 +2214,11 @@ static void sfp_sm_module(struct sfp *sfp, unsigned int event)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Force a poll to re-read the hardware signal state after
|
||||
* sfp_sm_mod_probe() changed state_hw_mask.
|
||||
*/
|
||||
mod_delayed_work(system_wq, &sfp->poll, 1);
|
||||
|
||||
err = sfp_hwmon_insert(sfp);
|
||||
if (err)
|
||||
dev_warn(sfp->dev, "hwmon probe failed: %pe\n",
|
||||
|
@ -666,8 +666,9 @@ static int asix_resume(struct usb_interface *intf)
|
||||
static int ax88772_init_mdio(struct usbnet *dev)
|
||||
{
|
||||
struct asix_common_private *priv = dev->driver_priv;
|
||||
int ret;
|
||||
|
||||
priv->mdio = devm_mdiobus_alloc(&dev->udev->dev);
|
||||
priv->mdio = mdiobus_alloc();
|
||||
if (!priv->mdio)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -679,7 +680,20 @@ static int ax88772_init_mdio(struct usbnet *dev)
|
||||
snprintf(priv->mdio->id, MII_BUS_ID_SIZE, "usb-%03d:%03d",
|
||||
dev->udev->bus->busnum, dev->udev->devnum);
|
||||
|
||||
return devm_mdiobus_register(&dev->udev->dev, priv->mdio);
|
||||
ret = mdiobus_register(priv->mdio);
|
||||
if (ret) {
|
||||
netdev_err(dev->net, "Could not register MDIO bus (err %d)\n", ret);
|
||||
mdiobus_free(priv->mdio);
|
||||
priv->mdio = NULL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ax88772_mdio_unregister(struct asix_common_private *priv)
|
||||
{
|
||||
mdiobus_unregister(priv->mdio);
|
||||
mdiobus_free(priv->mdio);
|
||||
}
|
||||
|
||||
static int ax88772_init_phy(struct usbnet *dev)
|
||||
@ -896,16 +910,23 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
|
||||
ret = ax88772_init_mdio(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto mdio_err;
|
||||
|
||||
ret = ax88772_phylink_setup(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto phylink_err;
|
||||
|
||||
ret = ax88772_init_phy(dev);
|
||||
if (ret)
|
||||
phylink_destroy(priv->phylink);
|
||||
goto initphy_err;
|
||||
|
||||
return 0;
|
||||
|
||||
initphy_err:
|
||||
phylink_destroy(priv->phylink);
|
||||
phylink_err:
|
||||
ax88772_mdio_unregister(priv);
|
||||
mdio_err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -926,6 +947,7 @@ static void ax88772_unbind(struct usbnet *dev, struct usb_interface *intf)
|
||||
phylink_disconnect_phy(priv->phylink);
|
||||
rtnl_unlock();
|
||||
phylink_destroy(priv->phylink);
|
||||
ax88772_mdio_unregister(priv);
|
||||
asix_rx_fixup_common_free(dev->driver_priv);
|
||||
}
|
||||
|
||||
|
@ -3579,13 +3579,29 @@ static int lan78xx_rx(struct lan78xx_net *dev, struct sk_buff *skb,
|
||||
size = (rx_cmd_a & RX_CMD_A_LEN_MASK_);
|
||||
align_count = (4 - ((size + RXW_PADDING) % 4)) % 4;
|
||||
|
||||
if (unlikely(size > skb->len)) {
|
||||
netif_dbg(dev, rx_err, dev->net,
|
||||
"size err rx_cmd_a=0x%08x\n",
|
||||
rx_cmd_a);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (unlikely(rx_cmd_a & RX_CMD_A_RED_)) {
|
||||
netif_dbg(dev, rx_err, dev->net,
|
||||
"Error rx_cmd_a=0x%08x", rx_cmd_a);
|
||||
} else {
|
||||
u32 frame_len = size - ETH_FCS_LEN;
|
||||
u32 frame_len;
|
||||
struct sk_buff *skb2;
|
||||
|
||||
if (unlikely(size < ETH_FCS_LEN)) {
|
||||
netif_dbg(dev, rx_err, dev->net,
|
||||
"size err rx_cmd_a=0x%08x\n",
|
||||
rx_cmd_a);
|
||||
return 0;
|
||||
}
|
||||
|
||||
frame_len = size - ETH_FCS_LEN;
|
||||
|
||||
skb2 = napi_alloc_skb(&dev->napi, frame_len);
|
||||
if (!skb2)
|
||||
return 0;
|
||||
|
@ -61,12 +61,6 @@ pl_vendor_req(struct usbnet *dev, u8 req, u8 val, u8 index)
|
||||
val, index, NULL, 0);
|
||||
}
|
||||
|
||||
static inline int
|
||||
pl_clear_QuickLink_features(struct usbnet *dev, int val)
|
||||
{
|
||||
return pl_vendor_req(dev, 1, (u8) val, 0);
|
||||
}
|
||||
|
||||
static inline int
|
||||
pl_set_QuickLink_features(struct usbnet *dev, int val)
|
||||
{
|
||||
|
@ -1833,6 +1833,12 @@ static int smsc95xx_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
|
||||
size = (u16)((header & RX_STS_FL_) >> 16);
|
||||
align_count = (4 - ((size + NET_IP_ALIGN) % 4)) % 4;
|
||||
|
||||
if (unlikely(size > skb->len)) {
|
||||
netif_dbg(dev, rx_err, dev->net,
|
||||
"size err header=0x%08x\n", header);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (unlikely(header & RX_STS_ES_)) {
|
||||
netif_dbg(dev, rx_err, dev->net,
|
||||
"Error header=0x%08x\n", header);
|
||||
|
@ -1642,7 +1642,7 @@ static int veth_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp)
|
||||
struct veth_xdp_buff *_ctx = (void *)ctx;
|
||||
|
||||
if (!_ctx->skb)
|
||||
return -EOPNOTSUPP;
|
||||
return -ENODATA;
|
||||
|
||||
*timestamp = skb_hwtstamps(_ctx->skb)->hwtstamp;
|
||||
return 0;
|
||||
@ -1653,7 +1653,7 @@ static int veth_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash)
|
||||
struct veth_xdp_buff *_ctx = (void *)ctx;
|
||||
|
||||
if (!_ctx->skb)
|
||||
return -EOPNOTSUPP;
|
||||
return -ENODATA;
|
||||
|
||||
*hash = skb_get_hash(_ctx->skb);
|
||||
return 0;
|
||||
|
@ -732,7 +732,10 @@ void iwl_mvm_mac_itxq_xmit(struct ieee80211_hw *hw, struct ieee80211_txq *txq)
|
||||
|
||||
rcu_read_lock();
|
||||
do {
|
||||
while (likely(!mvmtxq->stopped &&
|
||||
while (likely(!test_bit(IWL_MVM_TXQ_STATE_STOP_FULL,
|
||||
&mvmtxq->state) &&
|
||||
!test_bit(IWL_MVM_TXQ_STATE_STOP_REDIRECT,
|
||||
&mvmtxq->state) &&
|
||||
!test_bit(IWL_MVM_STATUS_IN_D3, &mvm->status))) {
|
||||
skb = ieee80211_tx_dequeue(hw, txq);
|
||||
|
||||
@ -757,42 +760,25 @@ static void iwl_mvm_mac_wake_tx_queue(struct ieee80211_hw *hw,
|
||||
struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
|
||||
struct iwl_mvm_txq *mvmtxq = iwl_mvm_txq_from_mac80211(txq);
|
||||
|
||||
/*
|
||||
* Please note that racing is handled very carefully here:
|
||||
* mvmtxq->txq_id is updated during allocation, and mvmtxq->list is
|
||||
* deleted afterwards.
|
||||
* This means that if:
|
||||
* mvmtxq->txq_id != INVALID_QUEUE && list_empty(&mvmtxq->list):
|
||||
* queue is allocated and we can TX.
|
||||
* mvmtxq->txq_id != INVALID_QUEUE && !list_empty(&mvmtxq->list):
|
||||
* a race, should defer the frame.
|
||||
* mvmtxq->txq_id == INVALID_QUEUE && list_empty(&mvmtxq->list):
|
||||
* need to allocate the queue and defer the frame.
|
||||
* mvmtxq->txq_id == INVALID_QUEUE && !list_empty(&mvmtxq->list):
|
||||
* queue is already scheduled for allocation, no need to allocate,
|
||||
* should defer the frame.
|
||||
*/
|
||||
|
||||
/* If the queue is allocated TX and return. */
|
||||
if (!txq->sta || mvmtxq->txq_id != IWL_MVM_INVALID_QUEUE) {
|
||||
/*
|
||||
* Check that list is empty to avoid a race where txq_id is
|
||||
* already updated, but the queue allocation work wasn't
|
||||
* finished
|
||||
*/
|
||||
if (unlikely(txq->sta && !list_empty(&mvmtxq->list)))
|
||||
return;
|
||||
|
||||
if (likely(test_bit(IWL_MVM_TXQ_STATE_READY, &mvmtxq->state)) ||
|
||||
!txq->sta) {
|
||||
iwl_mvm_mac_itxq_xmit(hw, txq);
|
||||
return;
|
||||
}
|
||||
|
||||
/* The list is being deleted only after the queue is fully allocated. */
|
||||
if (!list_empty(&mvmtxq->list))
|
||||
return;
|
||||
/* iwl_mvm_mac_itxq_xmit() will later be called by the worker
|
||||
* to handle any packets we leave on the txq now
|
||||
*/
|
||||
|
||||
list_add_tail(&mvmtxq->list, &mvm->add_stream_txqs);
|
||||
schedule_work(&mvm->add_stream_wk);
|
||||
spin_lock_bh(&mvm->add_stream_lock);
|
||||
/* The list is being deleted only after the queue is fully allocated. */
|
||||
if (list_empty(&mvmtxq->list) &&
|
||||
/* recheck under lock */
|
||||
!test_bit(IWL_MVM_TXQ_STATE_READY, &mvmtxq->state)) {
|
||||
list_add_tail(&mvmtxq->list, &mvm->add_stream_txqs);
|
||||
schedule_work(&mvm->add_stream_wk);
|
||||
}
|
||||
spin_unlock_bh(&mvm->add_stream_lock);
|
||||
}
|
||||
|
||||
#define CHECK_BA_TRIGGER(_mvm, _trig, _tid_bm, _tid, _fmt...) \
|
||||
|
@ -729,7 +729,10 @@ struct iwl_mvm_txq {
|
||||
struct list_head list;
|
||||
u16 txq_id;
|
||||
atomic_t tx_request;
|
||||
bool stopped;
|
||||
#define IWL_MVM_TXQ_STATE_STOP_FULL 0
|
||||
#define IWL_MVM_TXQ_STATE_STOP_REDIRECT 1
|
||||
#define IWL_MVM_TXQ_STATE_READY 2
|
||||
unsigned long state;
|
||||
};
|
||||
|
||||
static inline struct iwl_mvm_txq *
|
||||
@ -827,6 +830,7 @@ struct iwl_mvm {
|
||||
struct iwl_mvm_tvqm_txq_info tvqm_info[IWL_MAX_TVQM_QUEUES];
|
||||
};
|
||||
struct work_struct add_stream_wk; /* To add streams to queues */
|
||||
spinlock_t add_stream_lock;
|
||||
|
||||
const char *nvm_file_name;
|
||||
struct iwl_nvm_data *nvm_data;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user