mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
Merge tag 'net-6.8-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Paolo Abeni:
"Including fixes from bpf, netfilter and WiFi.
Jakub is doing a lot of work to include the self-tests in our CI, as a
result a significant amount of self-tests related fixes is flowing in
(and will likely continue in the next few weeks).
Current release - regressions:
- bpf: fix a kernel crash for the riscv 64 JIT
- bnxt_en: fix memory leak in bnxt_hwrm_get_rings()
- revert "net: macsec: use skb_ensure_writable_head_tail to expand
the skb"
Previous releases - regressions:
- core: fix removing a namespace with conflicting altnames
- tc/flower: fix chain template offload memory leak
- tcp:
- make sure init the accept_queue's spinlocks once
- fix autocork on CPUs with weak memory model
- udp: fix busy polling
- mlx5e:
- fix out-of-bound read in port timestamping
- fix peer flow lists corruption
- iwlwifi: fix a memory corruption
Previous releases - always broken:
- netfilter:
- nft_chain_filter: handle NETDEV_UNREGISTER for inet/ingress
basechain
- nft_limit: reject configurations that cause integer overflow
- bpf: fix bpf_xdp_adjust_tail() with XSK zero-copy mbuf, avoiding a
NULL pointer dereference upon shrinking
- llc: make llc_ui_sendmsg() more robust against bonding changes
- smc: fix illegal rmb_desc access in SMC-D connection dump
- dpll: fix pin dump crash for rebound module
- bnxt_en: fix possible crash after creating sw mqprio TCs
- hv_netvsc: calculate correct ring size when PAGE_SIZE is not 4kB
Misc:
- several self-tests fixes for better integration with the netdev CI
- added several missing modules descriptions"
* tag 'net-6.8-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (88 commits)
tsnep: Fix XDP_RING_NEED_WAKEUP for empty fill ring
tsnep: Remove FCS for XDP data path
net: fec: fix the unhandled context fault from smmu
selftests: bonding: do not test arp/ns target with mode balance-alb/tlb
fjes: fix memleaks in fjes_hw_setup
i40e: update xdp_rxq_info::frag_size for ZC enabled Rx queue
i40e: set xdp_rxq_info::frag_size
xdp: reflect tail increase for MEM_TYPE_XSK_BUFF_POOL
ice: update xdp_rxq_info::frag_size for ZC enabled Rx queue
intel: xsk: initialize skb_frag_t::bv_offset in ZC drivers
ice: remove redundant xdp_rxq_info registration
i40e: handle multi-buffer packets that are shrunk by xdp prog
ice: work on pre-XDP prog frag count
xsk: fix usage of multi-buffer BPF helpers for ZC XDP
xsk: make xsk_buff_pool responsible for clearing xdp_buff::flags
xsk: recycle buffer in case Rx queue was full
net: fill in MODULE_DESCRIPTION()s for rvu_mbox
net: fill in MODULE_DESCRIPTION()s for litex
net: fill in MODULE_DESCRIPTION()s for fsl_pq_mdio
net: fill in MODULE_DESCRIPTION()s for fec
...
This commit is contained in:
@@ -795,6 +795,7 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
|
||||
struct bpf_tramp_links *fentry = &tlinks[BPF_TRAMP_FENTRY];
|
||||
struct bpf_tramp_links *fexit = &tlinks[BPF_TRAMP_FEXIT];
|
||||
struct bpf_tramp_links *fmod_ret = &tlinks[BPF_TRAMP_MODIFY_RETURN];
|
||||
bool is_struct_ops = flags & BPF_TRAMP_F_INDIRECT;
|
||||
void *orig_call = func_addr;
|
||||
bool save_ret;
|
||||
u32 insn;
|
||||
@@ -878,7 +879,7 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
|
||||
|
||||
stack_size = round_up(stack_size, 16);
|
||||
|
||||
if (func_addr) {
|
||||
if (!is_struct_ops) {
|
||||
/* For the trampoline called from function entry,
|
||||
* the frame of traced function and the frame of
|
||||
* trampoline need to be considered.
|
||||
@@ -998,7 +999,7 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
|
||||
|
||||
emit_ld(RV_REG_S1, -sreg_off, RV_REG_FP, ctx);
|
||||
|
||||
if (func_addr) {
|
||||
if (!is_struct_ops) {
|
||||
/* trampoline called from function entry */
|
||||
emit_ld(RV_REG_T0, stack_size - 8, RV_REG_SP, ctx);
|
||||
emit_ld(RV_REG_FP, stack_size - 16, RV_REG_SP, ctx);
|
||||
|
||||
@@ -29,8 +29,6 @@ static u32 dpll_pin_xa_id;
|
||||
WARN_ON_ONCE(!xa_get_mark(&dpll_device_xa, (d)->id, DPLL_REGISTERED))
|
||||
#define ASSERT_DPLL_NOT_REGISTERED(d) \
|
||||
WARN_ON_ONCE(xa_get_mark(&dpll_device_xa, (d)->id, DPLL_REGISTERED))
|
||||
#define ASSERT_PIN_REGISTERED(p) \
|
||||
WARN_ON_ONCE(!xa_get_mark(&dpll_pin_xa, (p)->id, DPLL_REGISTERED))
|
||||
|
||||
struct dpll_device_registration {
|
||||
struct list_head list;
|
||||
@@ -425,6 +423,53 @@ void dpll_device_unregister(struct dpll_device *dpll,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dpll_device_unregister);
|
||||
|
||||
static void dpll_pin_prop_free(struct dpll_pin_properties *prop)
|
||||
{
|
||||
kfree(prop->package_label);
|
||||
kfree(prop->panel_label);
|
||||
kfree(prop->board_label);
|
||||
kfree(prop->freq_supported);
|
||||
}
|
||||
|
||||
static int dpll_pin_prop_dup(const struct dpll_pin_properties *src,
|
||||
struct dpll_pin_properties *dst)
|
||||
{
|
||||
memcpy(dst, src, sizeof(*dst));
|
||||
if (src->freq_supported && src->freq_supported_num) {
|
||||
size_t freq_size = src->freq_supported_num *
|
||||
sizeof(*src->freq_supported);
|
||||
dst->freq_supported = kmemdup(src->freq_supported,
|
||||
freq_size, GFP_KERNEL);
|
||||
if (!src->freq_supported)
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (src->board_label) {
|
||||
dst->board_label = kstrdup(src->board_label, GFP_KERNEL);
|
||||
if (!dst->board_label)
|
||||
goto err_board_label;
|
||||
}
|
||||
if (src->panel_label) {
|
||||
dst->panel_label = kstrdup(src->panel_label, GFP_KERNEL);
|
||||
if (!dst->panel_label)
|
||||
goto err_panel_label;
|
||||
}
|
||||
if (src->package_label) {
|
||||
dst->package_label = kstrdup(src->package_label, GFP_KERNEL);
|
||||
if (!dst->package_label)
|
||||
goto err_package_label;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_package_label:
|
||||
kfree(dst->panel_label);
|
||||
err_panel_label:
|
||||
kfree(dst->board_label);
|
||||
err_board_label:
|
||||
kfree(dst->freq_supported);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static struct dpll_pin *
|
||||
dpll_pin_alloc(u64 clock_id, u32 pin_idx, struct module *module,
|
||||
const struct dpll_pin_properties *prop)
|
||||
@@ -441,20 +486,24 @@ dpll_pin_alloc(u64 clock_id, u32 pin_idx, struct module *module,
|
||||
if (WARN_ON(prop->type < DPLL_PIN_TYPE_MUX ||
|
||||
prop->type > DPLL_PIN_TYPE_MAX)) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
goto err_pin_prop;
|
||||
}
|
||||
pin->prop = prop;
|
||||
ret = dpll_pin_prop_dup(prop, &pin->prop);
|
||||
if (ret)
|
||||
goto err_pin_prop;
|
||||
refcount_set(&pin->refcount, 1);
|
||||
xa_init_flags(&pin->dpll_refs, XA_FLAGS_ALLOC);
|
||||
xa_init_flags(&pin->parent_refs, XA_FLAGS_ALLOC);
|
||||
ret = xa_alloc_cyclic(&dpll_pin_xa, &pin->id, pin, xa_limit_32b,
|
||||
&dpll_pin_xa_id, GFP_KERNEL);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto err_xa_alloc;
|
||||
return pin;
|
||||
err:
|
||||
err_xa_alloc:
|
||||
xa_destroy(&pin->dpll_refs);
|
||||
xa_destroy(&pin->parent_refs);
|
||||
dpll_pin_prop_free(&pin->prop);
|
||||
err_pin_prop:
|
||||
kfree(pin);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
@@ -514,6 +563,7 @@ void dpll_pin_put(struct dpll_pin *pin)
|
||||
xa_destroy(&pin->dpll_refs);
|
||||
xa_destroy(&pin->parent_refs);
|
||||
xa_erase(&dpll_pin_xa, pin->id);
|
||||
dpll_pin_prop_free(&pin->prop);
|
||||
kfree(pin);
|
||||
}
|
||||
mutex_unlock(&dpll_lock);
|
||||
@@ -564,8 +614,6 @@ dpll_pin_register(struct dpll_device *dpll, struct dpll_pin *pin,
|
||||
WARN_ON(!ops->state_on_dpll_get) ||
|
||||
WARN_ON(!ops->direction_get))
|
||||
return -EINVAL;
|
||||
if (ASSERT_DPLL_REGISTERED(dpll))
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&dpll_lock);
|
||||
if (WARN_ON(!(dpll->module == pin->module &&
|
||||
@@ -636,15 +684,13 @@ int dpll_pin_on_pin_register(struct dpll_pin *parent, struct dpll_pin *pin,
|
||||
unsigned long i, stop;
|
||||
int ret;
|
||||
|
||||
if (WARN_ON(parent->prop->type != DPLL_PIN_TYPE_MUX))
|
||||
if (WARN_ON(parent->prop.type != DPLL_PIN_TYPE_MUX))
|
||||
return -EINVAL;
|
||||
|
||||
if (WARN_ON(!ops) ||
|
||||
WARN_ON(!ops->state_on_pin_get) ||
|
||||
WARN_ON(!ops->direction_get))
|
||||
return -EINVAL;
|
||||
if (ASSERT_PIN_REGISTERED(parent))
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&dpll_lock);
|
||||
ret = dpll_xa_ref_pin_add(&pin->parent_refs, parent, ops, priv);
|
||||
|
||||
@@ -44,7 +44,7 @@ struct dpll_device {
|
||||
* @module: module of creator
|
||||
* @dpll_refs: hold referencees to dplls pin was registered with
|
||||
* @parent_refs: hold references to parent pins pin was registered with
|
||||
* @prop: pointer to pin properties given by registerer
|
||||
* @prop: pin properties copied from the registerer
|
||||
* @rclk_dev_name: holds name of device when pin can recover clock from it
|
||||
* @refcount: refcount
|
||||
**/
|
||||
@@ -55,7 +55,7 @@ struct dpll_pin {
|
||||
struct module *module;
|
||||
struct xarray dpll_refs;
|
||||
struct xarray parent_refs;
|
||||
const struct dpll_pin_properties *prop;
|
||||
struct dpll_pin_properties prop;
|
||||
refcount_t refcount;
|
||||
};
|
||||
|
||||
|
||||
@@ -303,17 +303,17 @@ dpll_msg_add_pin_freq(struct sk_buff *msg, struct dpll_pin *pin,
|
||||
if (nla_put_64bit(msg, DPLL_A_PIN_FREQUENCY, sizeof(freq), &freq,
|
||||
DPLL_A_PIN_PAD))
|
||||
return -EMSGSIZE;
|
||||
for (fs = 0; fs < pin->prop->freq_supported_num; fs++) {
|
||||
for (fs = 0; fs < pin->prop.freq_supported_num; fs++) {
|
||||
nest = nla_nest_start(msg, DPLL_A_PIN_FREQUENCY_SUPPORTED);
|
||||
if (!nest)
|
||||
return -EMSGSIZE;
|
||||
freq = pin->prop->freq_supported[fs].min;
|
||||
freq = pin->prop.freq_supported[fs].min;
|
||||
if (nla_put_64bit(msg, DPLL_A_PIN_FREQUENCY_MIN, sizeof(freq),
|
||||
&freq, DPLL_A_PIN_PAD)) {
|
||||
nla_nest_cancel(msg, nest);
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
freq = pin->prop->freq_supported[fs].max;
|
||||
freq = pin->prop.freq_supported[fs].max;
|
||||
if (nla_put_64bit(msg, DPLL_A_PIN_FREQUENCY_MAX, sizeof(freq),
|
||||
&freq, DPLL_A_PIN_PAD)) {
|
||||
nla_nest_cancel(msg, nest);
|
||||
@@ -329,9 +329,9 @@ static bool dpll_pin_is_freq_supported(struct dpll_pin *pin, u32 freq)
|
||||
{
|
||||
int fs;
|
||||
|
||||
for (fs = 0; fs < pin->prop->freq_supported_num; fs++)
|
||||
if (freq >= pin->prop->freq_supported[fs].min &&
|
||||
freq <= pin->prop->freq_supported[fs].max)
|
||||
for (fs = 0; fs < pin->prop.freq_supported_num; fs++)
|
||||
if (freq >= pin->prop.freq_supported[fs].min &&
|
||||
freq <= pin->prop.freq_supported[fs].max)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -421,7 +421,7 @@ static int
|
||||
dpll_cmd_pin_get_one(struct sk_buff *msg, struct dpll_pin *pin,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
const struct dpll_pin_properties *prop = pin->prop;
|
||||
const struct dpll_pin_properties *prop = &pin->prop;
|
||||
struct dpll_pin_ref *ref;
|
||||
int ret;
|
||||
|
||||
@@ -553,6 +553,24 @@ __dpll_device_change_ntf(struct dpll_device *dpll)
|
||||
return dpll_device_event_send(DPLL_CMD_DEVICE_CHANGE_NTF, dpll);
|
||||
}
|
||||
|
||||
static bool dpll_pin_available(struct dpll_pin *pin)
|
||||
{
|
||||
struct dpll_pin_ref *par_ref;
|
||||
unsigned long i;
|
||||
|
||||
if (!xa_get_mark(&dpll_pin_xa, pin->id, DPLL_REGISTERED))
|
||||
return false;
|
||||
xa_for_each(&pin->parent_refs, i, par_ref)
|
||||
if (xa_get_mark(&dpll_pin_xa, par_ref->pin->id,
|
||||
DPLL_REGISTERED))
|
||||
return true;
|
||||
xa_for_each(&pin->dpll_refs, i, par_ref)
|
||||
if (xa_get_mark(&dpll_device_xa, par_ref->dpll->id,
|
||||
DPLL_REGISTERED))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* dpll_device_change_ntf - notify that the dpll device has been changed
|
||||
* @dpll: registered dpll pointer
|
||||
@@ -579,7 +597,7 @@ dpll_pin_event_send(enum dpll_cmd event, struct dpll_pin *pin)
|
||||
int ret = -ENOMEM;
|
||||
void *hdr;
|
||||
|
||||
if (WARN_ON(!xa_get_mark(&dpll_pin_xa, pin->id, DPLL_REGISTERED)))
|
||||
if (!dpll_pin_available(pin))
|
||||
return -ENODEV;
|
||||
|
||||
msg = genlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
|
||||
@@ -717,7 +735,7 @@ dpll_pin_on_pin_state_set(struct dpll_pin *pin, u32 parent_idx,
|
||||
int ret;
|
||||
|
||||
if (!(DPLL_PIN_CAPABILITIES_STATE_CAN_CHANGE &
|
||||
pin->prop->capabilities)) {
|
||||
pin->prop.capabilities)) {
|
||||
NL_SET_ERR_MSG(extack, "state changing is not allowed");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
@@ -753,7 +771,7 @@ dpll_pin_state_set(struct dpll_device *dpll, struct dpll_pin *pin,
|
||||
int ret;
|
||||
|
||||
if (!(DPLL_PIN_CAPABILITIES_STATE_CAN_CHANGE &
|
||||
pin->prop->capabilities)) {
|
||||
pin->prop.capabilities)) {
|
||||
NL_SET_ERR_MSG(extack, "state changing is not allowed");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
@@ -780,7 +798,7 @@ dpll_pin_prio_set(struct dpll_device *dpll, struct dpll_pin *pin,
|
||||
int ret;
|
||||
|
||||
if (!(DPLL_PIN_CAPABILITIES_PRIORITY_CAN_CHANGE &
|
||||
pin->prop->capabilities)) {
|
||||
pin->prop.capabilities)) {
|
||||
NL_SET_ERR_MSG(extack, "prio changing is not allowed");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
@@ -808,7 +826,7 @@ dpll_pin_direction_set(struct dpll_pin *pin, struct dpll_device *dpll,
|
||||
int ret;
|
||||
|
||||
if (!(DPLL_PIN_CAPABILITIES_DIRECTION_CAN_CHANGE &
|
||||
pin->prop->capabilities)) {
|
||||
pin->prop.capabilities)) {
|
||||
NL_SET_ERR_MSG(extack, "direction changing is not allowed");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
@@ -838,8 +856,8 @@ dpll_pin_phase_adj_set(struct dpll_pin *pin, struct nlattr *phase_adj_attr,
|
||||
int ret;
|
||||
|
||||
phase_adj = nla_get_s32(phase_adj_attr);
|
||||
if (phase_adj > pin->prop->phase_range.max ||
|
||||
phase_adj < pin->prop->phase_range.min) {
|
||||
if (phase_adj > pin->prop.phase_range.max ||
|
||||
phase_adj < pin->prop.phase_range.min) {
|
||||
NL_SET_ERR_MSG_ATTR(extack, phase_adj_attr,
|
||||
"phase adjust value not supported");
|
||||
return -EINVAL;
|
||||
@@ -1023,7 +1041,7 @@ dpll_pin_find(u64 clock_id, struct nlattr *mod_name_attr,
|
||||
unsigned long i;
|
||||
|
||||
xa_for_each_marked(&dpll_pin_xa, i, pin, DPLL_REGISTERED) {
|
||||
prop = pin->prop;
|
||||
prop = &pin->prop;
|
||||
cid_match = clock_id ? pin->clock_id == clock_id : true;
|
||||
mod_match = mod_name_attr && module_name(pin->module) ?
|
||||
!nla_strcmp(mod_name_attr,
|
||||
@@ -1130,6 +1148,10 @@ int dpll_nl_pin_id_get_doit(struct sk_buff *skb, struct genl_info *info)
|
||||
}
|
||||
pin = dpll_pin_find_from_nlattr(info);
|
||||
if (!IS_ERR(pin)) {
|
||||
if (!dpll_pin_available(pin)) {
|
||||
nlmsg_free(msg);
|
||||
return -ENODEV;
|
||||
}
|
||||
ret = dpll_msg_add_pin_handle(msg, pin);
|
||||
if (ret) {
|
||||
nlmsg_free(msg);
|
||||
@@ -1179,6 +1201,8 @@ int dpll_nl_pin_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
|
||||
xa_for_each_marked_start(&dpll_pin_xa, i, pin, DPLL_REGISTERED,
|
||||
ctx->idx) {
|
||||
if (!dpll_pin_available(pin))
|
||||
continue;
|
||||
hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid,
|
||||
cb->nlh->nlmsg_seq,
|
||||
&dpll_nl_family, NLM_F_MULTI,
|
||||
@@ -1441,7 +1465,8 @@ int dpll_pin_pre_doit(const struct genl_split_ops *ops, struct sk_buff *skb,
|
||||
}
|
||||
info->user_ptr[0] = xa_load(&dpll_pin_xa,
|
||||
nla_get_u32(info->attrs[DPLL_A_PIN_ID]));
|
||||
if (!info->user_ptr[0]) {
|
||||
if (!info->user_ptr[0] ||
|
||||
!dpll_pin_available(info->user_ptr[0])) {
|
||||
NL_SET_ERR_MSG(info->extack, "pin not found");
|
||||
ret = -ENODEV;
|
||||
goto unlock_dev;
|
||||
|
||||
@@ -100,4 +100,5 @@ static void __exit ns8390_module_exit(void)
|
||||
module_init(ns8390_module_init);
|
||||
module_exit(ns8390_module_exit);
|
||||
#endif /* MODULE */
|
||||
MODULE_DESCRIPTION("National Semiconductor 8390 core driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -102,4 +102,5 @@ static void __exit NS8390p_cleanup_module(void)
|
||||
|
||||
module_init(NS8390p_init_module);
|
||||
module_exit(NS8390p_cleanup_module);
|
||||
MODULE_DESCRIPTION("National Semiconductor 8390 core for ISA driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -610,4 +610,5 @@ static int init_pcmcia(void)
|
||||
return 1;
|
||||
}
|
||||
|
||||
MODULE_DESCRIPTION("National Semiconductor 8390 Amiga PCMCIA ethernet driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -270,4 +270,5 @@ static void __exit hydra_cleanup_module(void)
|
||||
module_init(hydra_init_module);
|
||||
module_exit(hydra_cleanup_module);
|
||||
|
||||
MODULE_DESCRIPTION("Zorro-II Hydra 8390 ethernet driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -296,4 +296,5 @@ static void __exit stnic_cleanup(void)
|
||||
|
||||
module_init(stnic_probe);
|
||||
module_exit(stnic_cleanup);
|
||||
MODULE_DESCRIPTION("National Semiconductor DP83902AV ethernet driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -443,4 +443,5 @@ static void __exit zorro8390_cleanup_module(void)
|
||||
module_init(zorro8390_init_module);
|
||||
module_exit(zorro8390_cleanup_module);
|
||||
|
||||
MODULE_DESCRIPTION("Zorro NS8390-based ethernet driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -793,5 +793,6 @@ static struct platform_driver bcm4908_enet_driver = {
|
||||
};
|
||||
module_platform_driver(bcm4908_enet_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Broadcom BCM4908 Gigabit Ethernet driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DEVICE_TABLE(of, bcm4908_enet_of_match);
|
||||
|
||||
@@ -260,4 +260,5 @@ void bcma_mdio_mii_unregister(struct mii_bus *mii_bus)
|
||||
EXPORT_SYMBOL_GPL(bcma_mdio_mii_unregister);
|
||||
|
||||
MODULE_AUTHOR("Rafał Miłecki");
|
||||
MODULE_DESCRIPTION("Broadcom iProc GBit BCMA MDIO helpers");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -362,4 +362,5 @@ module_init(bgmac_init)
|
||||
module_exit(bgmac_exit)
|
||||
|
||||
MODULE_AUTHOR("Rafał Miłecki");
|
||||
MODULE_DESCRIPTION("Broadcom iProc GBit BCMA interface driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -298,4 +298,5 @@ static struct platform_driver bgmac_enet_driver = {
|
||||
};
|
||||
|
||||
module_platform_driver(bgmac_enet_driver);
|
||||
MODULE_DESCRIPTION("Broadcom iProc GBit platform interface driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -1626,4 +1626,5 @@ int bgmac_enet_resume(struct bgmac *bgmac)
|
||||
EXPORT_SYMBOL_GPL(bgmac_enet_resume);
|
||||
|
||||
MODULE_AUTHOR("Rafał Miłecki");
|
||||
MODULE_DESCRIPTION("Broadcom iProc GBit driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -3817,7 +3817,7 @@ static int bnxt_alloc_cp_rings(struct bnxt *bp)
|
||||
{
|
||||
bool sh = !!(bp->flags & BNXT_FLAG_SHARED_RINGS);
|
||||
int i, j, rc, ulp_base_vec, ulp_msix;
|
||||
int tcs = netdev_get_num_tc(bp->dev);
|
||||
int tcs = bp->num_tc;
|
||||
|
||||
if (!tcs)
|
||||
tcs = 1;
|
||||
@@ -5935,8 +5935,12 @@ static u16 bnxt_get_max_rss_ring(struct bnxt *bp)
|
||||
|
||||
int bnxt_get_nr_rss_ctxs(struct bnxt *bp, int rx_rings)
|
||||
{
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
|
||||
return DIV_ROUND_UP(rx_rings, BNXT_RSS_TABLE_ENTRIES_P5);
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
|
||||
if (!rx_rings)
|
||||
return 0;
|
||||
return bnxt_calc_nr_ring_pages(rx_rings - 1,
|
||||
BNXT_RSS_TABLE_ENTRIES_P5);
|
||||
}
|
||||
if (BNXT_CHIP_TYPE_NITRO_A0(bp))
|
||||
return 2;
|
||||
return 1;
|
||||
@@ -6926,7 +6930,7 @@ static int bnxt_hwrm_get_rings(struct bnxt *bp)
|
||||
if (cp < (rx + tx)) {
|
||||
rc = __bnxt_trim_rings(bp, &rx, &tx, cp, false);
|
||||
if (rc)
|
||||
return rc;
|
||||
goto get_rings_exit;
|
||||
if (bp->flags & BNXT_FLAG_AGG_RINGS)
|
||||
rx <<= 1;
|
||||
hw_resc->resv_rx_rings = rx;
|
||||
@@ -6938,8 +6942,9 @@ static int bnxt_hwrm_get_rings(struct bnxt *bp)
|
||||
hw_resc->resv_cp_rings = cp;
|
||||
hw_resc->resv_stat_ctxs = stats;
|
||||
}
|
||||
get_rings_exit:
|
||||
hwrm_req_drop(bp, req);
|
||||
return 0;
|
||||
return rc;
|
||||
}
|
||||
|
||||
int __bnxt_hwrm_get_tx_rings(struct bnxt *bp, u16 fid, int *tx_rings)
|
||||
@@ -7000,10 +7005,11 @@ __bnxt_hwrm_reserve_pf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
|
||||
|
||||
req->num_rx_rings = cpu_to_le16(rx_rings);
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
|
||||
u16 rss_ctx = bnxt_get_nr_rss_ctxs(bp, ring_grps);
|
||||
|
||||
req->num_cmpl_rings = cpu_to_le16(tx_rings + ring_grps);
|
||||
req->num_msix = cpu_to_le16(cp_rings);
|
||||
req->num_rsscos_ctxs =
|
||||
cpu_to_le16(DIV_ROUND_UP(ring_grps, 64));
|
||||
req->num_rsscos_ctxs = cpu_to_le16(rss_ctx);
|
||||
} else {
|
||||
req->num_cmpl_rings = cpu_to_le16(cp_rings);
|
||||
req->num_hw_ring_grps = cpu_to_le16(ring_grps);
|
||||
@@ -7050,8 +7056,10 @@ __bnxt_hwrm_reserve_vf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
|
||||
req->num_tx_rings = cpu_to_le16(tx_rings);
|
||||
req->num_rx_rings = cpu_to_le16(rx_rings);
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
|
||||
u16 rss_ctx = bnxt_get_nr_rss_ctxs(bp, ring_grps);
|
||||
|
||||
req->num_cmpl_rings = cpu_to_le16(tx_rings + ring_grps);
|
||||
req->num_rsscos_ctxs = cpu_to_le16(DIV_ROUND_UP(ring_grps, 64));
|
||||
req->num_rsscos_ctxs = cpu_to_le16(rss_ctx);
|
||||
} else {
|
||||
req->num_cmpl_rings = cpu_to_le16(cp_rings);
|
||||
req->num_hw_ring_grps = cpu_to_le16(ring_grps);
|
||||
@@ -9938,7 +9946,7 @@ static int __bnxt_num_tx_to_cp(struct bnxt *bp, int tx, int tx_sets, int tx_xdp)
|
||||
|
||||
int bnxt_num_tx_to_cp(struct bnxt *bp, int tx)
|
||||
{
|
||||
int tcs = netdev_get_num_tc(bp->dev);
|
||||
int tcs = bp->num_tc;
|
||||
|
||||
if (!tcs)
|
||||
tcs = 1;
|
||||
@@ -9947,7 +9955,7 @@ int bnxt_num_tx_to_cp(struct bnxt *bp, int tx)
|
||||
|
||||
static int bnxt_num_cp_to_tx(struct bnxt *bp, int tx_cp)
|
||||
{
|
||||
int tcs = netdev_get_num_tc(bp->dev);
|
||||
int tcs = bp->num_tc;
|
||||
|
||||
return (tx_cp - bp->tx_nr_rings_xdp) * tcs +
|
||||
bp->tx_nr_rings_xdp;
|
||||
@@ -9977,7 +9985,7 @@ static void bnxt_setup_msix(struct bnxt *bp)
|
||||
struct net_device *dev = bp->dev;
|
||||
int tcs, i;
|
||||
|
||||
tcs = netdev_get_num_tc(dev);
|
||||
tcs = bp->num_tc;
|
||||
if (tcs) {
|
||||
int i, off, count;
|
||||
|
||||
@@ -10009,8 +10017,10 @@ static void bnxt_setup_inta(struct bnxt *bp)
|
||||
{
|
||||
const int len = sizeof(bp->irq_tbl[0].name);
|
||||
|
||||
if (netdev_get_num_tc(bp->dev))
|
||||
if (bp->num_tc) {
|
||||
netdev_reset_tc(bp->dev);
|
||||
bp->num_tc = 0;
|
||||
}
|
||||
|
||||
snprintf(bp->irq_tbl[0].name, len, "%s-%s-%d", bp->dev->name, "TxRx",
|
||||
0);
|
||||
@@ -10236,8 +10246,8 @@ static void bnxt_clear_int_mode(struct bnxt *bp)
|
||||
|
||||
int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init)
|
||||
{
|
||||
int tcs = netdev_get_num_tc(bp->dev);
|
||||
bool irq_cleared = false;
|
||||
int tcs = bp->num_tc;
|
||||
int rc;
|
||||
|
||||
if (!bnxt_need_reserve_rings(bp))
|
||||
@@ -10263,6 +10273,7 @@ int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init)
|
||||
bp->tx_nr_rings - bp->tx_nr_rings_xdp)) {
|
||||
netdev_err(bp->dev, "tx ring reservation failure\n");
|
||||
netdev_reset_tc(bp->dev);
|
||||
bp->num_tc = 0;
|
||||
if (bp->tx_nr_rings_xdp)
|
||||
bp->tx_nr_rings_per_tc = bp->tx_nr_rings_xdp;
|
||||
else
|
||||
@@ -11564,10 +11575,12 @@ int bnxt_half_open_nic(struct bnxt *bp)
|
||||
netdev_err(bp->dev, "bnxt_alloc_mem err: %x\n", rc);
|
||||
goto half_open_err;
|
||||
}
|
||||
bnxt_init_napi(bp);
|
||||
set_bit(BNXT_STATE_HALF_OPEN, &bp->state);
|
||||
rc = bnxt_init_nic(bp, true);
|
||||
if (rc) {
|
||||
clear_bit(BNXT_STATE_HALF_OPEN, &bp->state);
|
||||
bnxt_del_napi(bp);
|
||||
netdev_err(bp->dev, "bnxt_init_nic err: %x\n", rc);
|
||||
goto half_open_err;
|
||||
}
|
||||
@@ -11586,6 +11599,7 @@ half_open_err:
|
||||
void bnxt_half_close_nic(struct bnxt *bp)
|
||||
{
|
||||
bnxt_hwrm_resource_free(bp, false, true);
|
||||
bnxt_del_napi(bp);
|
||||
bnxt_free_skbs(bp);
|
||||
bnxt_free_mem(bp, true);
|
||||
clear_bit(BNXT_STATE_HALF_OPEN, &bp->state);
|
||||
@@ -13232,6 +13246,11 @@ static int bnxt_fw_init_one_p1(struct bnxt *bp)
|
||||
|
||||
bp->fw_cap = 0;
|
||||
rc = bnxt_hwrm_ver_get(bp);
|
||||
/* FW may be unresponsive after FLR. FLR must complete within 100 msec
|
||||
* so wait before continuing with recovery.
|
||||
*/
|
||||
if (rc)
|
||||
msleep(100);
|
||||
bnxt_try_map_fw_health_reg(bp);
|
||||
if (rc) {
|
||||
rc = bnxt_try_recover_fw(bp);
|
||||
@@ -13784,7 +13803,7 @@ int bnxt_setup_mq_tc(struct net_device *dev, u8 tc)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (netdev_get_num_tc(dev) == tc)
|
||||
if (bp->num_tc == tc)
|
||||
return 0;
|
||||
|
||||
if (bp->flags & BNXT_FLAG_SHARED_RINGS)
|
||||
@@ -13802,9 +13821,11 @@ int bnxt_setup_mq_tc(struct net_device *dev, u8 tc)
|
||||
if (tc) {
|
||||
bp->tx_nr_rings = bp->tx_nr_rings_per_tc * tc;
|
||||
netdev_set_num_tc(dev, tc);
|
||||
bp->num_tc = tc;
|
||||
} else {
|
||||
bp->tx_nr_rings = bp->tx_nr_rings_per_tc;
|
||||
netdev_reset_tc(dev);
|
||||
bp->num_tc = 0;
|
||||
}
|
||||
bp->tx_nr_rings += bp->tx_nr_rings_xdp;
|
||||
tx_cp = bnxt_num_tx_to_cp(bp, bp->tx_nr_rings);
|
||||
|
||||
@@ -2225,6 +2225,7 @@ struct bnxt {
|
||||
u8 tc_to_qidx[BNXT_MAX_QUEUE];
|
||||
u8 q_ids[BNXT_MAX_QUEUE];
|
||||
u8 max_q;
|
||||
u8 num_tc;
|
||||
|
||||
unsigned int current_interval;
|
||||
#define BNXT_TIMER_INTERVAL HZ
|
||||
|
||||
@@ -228,7 +228,7 @@ static int bnxt_queue_remap(struct bnxt *bp, unsigned int lltc_mask)
|
||||
}
|
||||
}
|
||||
if (bp->ieee_ets) {
|
||||
int tc = netdev_get_num_tc(bp->dev);
|
||||
int tc = bp->num_tc;
|
||||
|
||||
if (!tc)
|
||||
tc = 1;
|
||||
|
||||
@@ -884,7 +884,7 @@ static void bnxt_get_channels(struct net_device *dev,
|
||||
if (max_tx_sch_inputs)
|
||||
max_tx_rings = min_t(int, max_tx_rings, max_tx_sch_inputs);
|
||||
|
||||
tcs = netdev_get_num_tc(dev);
|
||||
tcs = bp->num_tc;
|
||||
tx_grps = max(tcs, 1);
|
||||
if (bp->tx_nr_rings_xdp)
|
||||
tx_grps++;
|
||||
@@ -944,7 +944,7 @@ static int bnxt_set_channels(struct net_device *dev,
|
||||
if (channel->combined_count)
|
||||
sh = true;
|
||||
|
||||
tcs = netdev_get_num_tc(dev);
|
||||
tcs = bp->num_tc;
|
||||
|
||||
req_tx_rings = sh ? channel->combined_count : channel->tx_count;
|
||||
req_rx_rings = sh ? channel->combined_count : channel->rx_count;
|
||||
@@ -1574,7 +1574,8 @@ u32 bnxt_get_rxfh_indir_size(struct net_device *dev)
|
||||
struct bnxt *bp = netdev_priv(dev);
|
||||
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
|
||||
return ALIGN(bp->rx_nr_rings, BNXT_RSS_TABLE_ENTRIES_P5);
|
||||
return bnxt_get_nr_rss_ctxs(bp, bp->rx_nr_rings) *
|
||||
BNXT_RSS_TABLE_ENTRIES_P5;
|
||||
return HW_HASH_INDEX_SIZE;
|
||||
}
|
||||
|
||||
|
||||
@@ -407,7 +407,7 @@ static int bnxt_xdp_set(struct bnxt *bp, struct bpf_prog *prog)
|
||||
if (prog)
|
||||
tx_xdp = bp->rx_nr_rings;
|
||||
|
||||
tc = netdev_get_num_tc(dev);
|
||||
tc = bp->num_tc;
|
||||
if (!tc)
|
||||
tc = 1;
|
||||
rc = bnxt_check_rings(bp, bp->tx_nr_rings_per_tc, bp->rx_nr_rings,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user