mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
Merge tag 'net-5.19-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Jakub Kicinski:
"Including fixes from netfilter.
Current release - new code bugs:
- clear msg_get_inq in __sys_recvfrom() and __copy_msghdr_from_user()
- mptcp:
- invoke MP_FAIL response only when needed
- fix shutdown vs fallback race
- consistent map handling on failure
- octeon_ep: use bitwise AND
Previous releases - regressions:
- tipc: move bc link creation back to tipc_node_create, fix NPD
Previous releases - always broken:
- tcp: add a missing nf_reset_ct() in 3WHS handling to prevent socket
buffered skbs from keeping refcount on the conntrack module
- ipv6: take care of disable_policy when restoring routes
- tun: make sure to always disable and unlink NAPI instances
- phy: don't trigger state machine while in suspend
- netfilter: nf_tables: avoid skb access on nf_stolen
- asix: fix "can't send until first packet is send" issue
- usb: asix: do not force pause frames support
- nxp-nci: don't issue a zero length i2c_master_read()
Misc:
- ncsi: allow use of proper "mellanox" DT vendor prefix
- act_api: add a message for user space if any actions were already
flushed before the error was hit"
* tag 'net-5.19-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (55 commits)
net: dsa: felix: fix race between reading PSFP stats and port stats
selftest: tun: add test for NAPI dismantle
net: tun: avoid disabling NAPI twice
net: sparx5: mdb add/del handle non-sparx5 devices
net: sfp: fix memory leak in sfp_probe()
mlxsw: spectrum_router: Fix rollback in tunnel next hop init
net: rose: fix UAF bugs caused by timer handler
net: usb: ax88179_178a: Fix packet receiving
net: bonding: fix use-after-free after 802.3ad slave unbind
ipv6: fix lockdep splat in in6_dump_addrs()
net: phy: ax88772a: fix lost pause advertisement configuration
net: phy: Don't trigger state machine while in suspend
usbnet: fix memory allocation in helpers
selftests net: fix kselftest net fatal error
NFC: nxp-nci: don't print header length mismatch on i2c error
NFC: nxp-nci: Don't issue a zero length i2c_master_read()
net: tipc: fix possible refcount leak in tipc_sk_create()
nfc: nfcmrvl: Fix irq_of_parse_and_map() return value
net: ipv6: unexport __init-annotated seg6_hmac_net_init()
ipv6/sit: fix ipip6_tunnel_get_prl return value
...
This commit is contained in:
@@ -14397,9 +14397,8 @@ F: Documentation/devicetree/bindings/sound/nxp,tfa989x.yaml
|
||||
F: sound/soc/codecs/tfa989x.c
|
||||
|
||||
NXP-NCI NFC DRIVER
|
||||
R: Charles Gorand <charles.gorand@effinnov.com>
|
||||
L: linux-nfc@lists.01.org (subscribers-only)
|
||||
S: Supported
|
||||
S: Orphan
|
||||
F: Documentation/devicetree/bindings/net/nfc/nxp,nci.yaml
|
||||
F: drivers/nfc/nxp-nci
|
||||
|
||||
|
||||
@@ -2228,7 +2228,8 @@ void bond_3ad_unbind_slave(struct slave *slave)
|
||||
temp_aggregator->num_of_ports--;
|
||||
if (__agg_active_ports(temp_aggregator) == 0) {
|
||||
select_new_active_agg = temp_aggregator->is_active;
|
||||
ad_clear_agg(temp_aggregator);
|
||||
if (temp_aggregator->num_of_ports == 0)
|
||||
ad_clear_agg(temp_aggregator);
|
||||
if (select_new_active_agg) {
|
||||
slave_info(bond->dev, slave->dev, "Removing an active aggregator\n");
|
||||
/* select new active aggregator */
|
||||
|
||||
@@ -1302,12 +1302,12 @@ int bond_alb_initialize(struct bonding *bond, int rlb_enabled)
|
||||
return res;
|
||||
|
||||
if (rlb_enabled) {
|
||||
bond->alb_info.rlb_enabled = 1;
|
||||
res = rlb_initialize(bond);
|
||||
if (res) {
|
||||
tlb_deinitialize(bond);
|
||||
return res;
|
||||
}
|
||||
bond->alb_info.rlb_enabled = 1;
|
||||
} else {
|
||||
bond->alb_info.rlb_enabled = 0;
|
||||
}
|
||||
|
||||
@@ -878,6 +878,11 @@ static void bcm_sf2_sw_mac_link_up(struct dsa_switch *ds, int port,
|
||||
if (duplex == DUPLEX_FULL)
|
||||
reg |= DUPLX_MODE;
|
||||
|
||||
if (tx_pause)
|
||||
reg |= TXFLOW_CNTL;
|
||||
if (rx_pause)
|
||||
reg |= RXFLOW_CNTL;
|
||||
|
||||
core_writel(priv, reg, offset);
|
||||
}
|
||||
|
||||
|
||||
@@ -300,6 +300,7 @@ static int hellcreek_led_setup(struct hellcreek *hellcreek)
|
||||
const char *label, *state;
|
||||
int ret = -EINVAL;
|
||||
|
||||
of_node_get(hellcreek->dev->of_node);
|
||||
leds = of_find_node_by_name(hellcreek->dev->of_node, "leds");
|
||||
if (!leds) {
|
||||
dev_err(hellcreek->dev, "No LEDs specified in device tree!\n");
|
||||
|
||||
@@ -1886,6 +1886,8 @@ static void vsc9959_psfp_sgi_table_del(struct ocelot *ocelot,
|
||||
static void vsc9959_psfp_counters_get(struct ocelot *ocelot, u32 index,
|
||||
struct felix_stream_filter_counters *counters)
|
||||
{
|
||||
mutex_lock(&ocelot->stats_lock);
|
||||
|
||||
ocelot_rmw(ocelot, SYS_STAT_CFG_STAT_VIEW(index),
|
||||
SYS_STAT_CFG_STAT_VIEW_M,
|
||||
SYS_STAT_CFG);
|
||||
@@ -1900,6 +1902,8 @@ static void vsc9959_psfp_counters_get(struct ocelot *ocelot, u32 index,
|
||||
SYS_STAT_CFG_STAT_VIEW(index) |
|
||||
SYS_STAT_CFG_STAT_CLEAR_SHOT(0x10),
|
||||
SYS_STAT_CFG);
|
||||
|
||||
mutex_unlock(&ocelot->stats_lock);
|
||||
}
|
||||
|
||||
static int vsc9959_psfp_filter_add(struct ocelot *ocelot, int port,
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
|
||||
#define CN93_SDP_EPF_RINFO_SRN(val) ((val) & 0xFF)
|
||||
#define CN93_SDP_EPF_RINFO_RPVF(val) (((val) >> 32) & 0xF)
|
||||
#define CN93_SDP_EPF_RINFO_NVFS(val) (((val) >> 48) && 0xFF)
|
||||
#define CN93_SDP_EPF_RINFO_NVFS(val) (((val) >> 48) & 0xFF)
|
||||
|
||||
/* SDP Function select */
|
||||
#define CN93_SDP_FUNC_SEL_EPF_BIT_POS 8
|
||||
|
||||
@@ -4415,6 +4415,8 @@ static int mlxsw_sp_nexthop4_init(struct mlxsw_sp *mlxsw_sp,
|
||||
return 0;
|
||||
|
||||
err_nexthop_neigh_init:
|
||||
list_del(&nh->router_list_node);
|
||||
mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh);
|
||||
mlxsw_sp_nexthop_remove(mlxsw_sp, nh);
|
||||
return err;
|
||||
}
|
||||
@@ -6740,6 +6742,7 @@ static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp,
|
||||
const struct fib6_info *rt)
|
||||
{
|
||||
struct net_device *dev = rt->fib6_nh->fib_nh_dev;
|
||||
int err;
|
||||
|
||||
nh->nhgi = nh_grp->nhgi;
|
||||
nh->nh_weight = rt->fib6_nh->fib_nh_weight;
|
||||
@@ -6755,7 +6758,16 @@ static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp,
|
||||
return 0;
|
||||
nh->ifindex = dev->ifindex;
|
||||
|
||||
return mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, dev);
|
||||
err = mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, dev);
|
||||
if (err)
|
||||
goto err_nexthop_type_init;
|
||||
|
||||
return 0;
|
||||
|
||||
err_nexthop_type_init:
|
||||
list_del(&nh->router_list_node);
|
||||
mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void mlxsw_sp_nexthop6_fini(struct mlxsw_sp *mlxsw_sp,
|
||||
|
||||
@@ -396,6 +396,9 @@ static int sparx5_handle_port_mdb_add(struct net_device *dev,
|
||||
u32 mact_entry;
|
||||
int res, err;
|
||||
|
||||
if (!sparx5_netdevice_check(dev))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (netif_is_bridge_master(v->obj.orig_dev)) {
|
||||
sparx5_mact_learn(spx5, PGID_CPU, v->addr, v->vid);
|
||||
return 0;
|
||||
@@ -466,6 +469,9 @@ static int sparx5_handle_port_mdb_del(struct net_device *dev,
|
||||
u32 mact_entry, res, pgid_entry[3];
|
||||
int err;
|
||||
|
||||
if (!sparx5_netdevice_check(dev))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (netif_is_bridge_master(v->obj.orig_dev)) {
|
||||
sparx5_mact_forget(spx5, v->addr, v->vid);
|
||||
return 0;
|
||||
|
||||
@@ -1515,14 +1515,14 @@ static void epic_remove_one(struct pci_dev *pdev)
|
||||
struct net_device *dev = pci_get_drvdata(pdev);
|
||||
struct epic_private *ep = netdev_priv(dev);
|
||||
|
||||
unregister_netdev(dev);
|
||||
dma_free_coherent(&pdev->dev, TX_TOTAL_SIZE, ep->tx_ring,
|
||||
ep->tx_ring_dma);
|
||||
dma_free_coherent(&pdev->dev, RX_TOTAL_SIZE, ep->rx_ring,
|
||||
ep->rx_ring_dma);
|
||||
unregister_netdev(dev);
|
||||
pci_iounmap(pdev, ep->ioaddr);
|
||||
pci_release_regions(pdev);
|
||||
free_netdev(dev);
|
||||
pci_release_regions(pdev);
|
||||
pci_disable_device(pdev);
|
||||
/* pci_power_off(pdev, -1); */
|
||||
}
|
||||
|
||||
@@ -88,8 +88,10 @@ static void asix_ax88772a_link_change_notify(struct phy_device *phydev)
|
||||
/* Reset PHY, otherwise MII_LPA will provide outdated information.
|
||||
* This issue is reproducible only with some link partner PHYs
|
||||
*/
|
||||
if (phydev->state == PHY_NOLINK && phydev->drv->soft_reset)
|
||||
phydev->drv->soft_reset(phydev);
|
||||
if (phydev->state == PHY_NOLINK) {
|
||||
phy_init_hw(phydev);
|
||||
phy_start_aneg(phydev);
|
||||
}
|
||||
}
|
||||
|
||||
static struct phy_driver asix_driver[] = {
|
||||
|
||||
@@ -229,9 +229,7 @@ static int dp83822_config_intr(struct phy_device *phydev)
|
||||
if (misr_status < 0)
|
||||
return misr_status;
|
||||
|
||||
misr_status |= (DP83822_RX_ERR_HF_INT_EN |
|
||||
DP83822_FALSE_CARRIER_HF_INT_EN |
|
||||
DP83822_LINK_STAT_INT_EN |
|
||||
misr_status |= (DP83822_LINK_STAT_INT_EN |
|
||||
DP83822_ENERGY_DET_INT_EN |
|
||||
DP83822_LINK_QUAL_INT_EN);
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <net/netlink.h>
|
||||
#include <net/genetlink.h>
|
||||
#include <net/sock.h>
|
||||
@@ -976,6 +977,28 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat)
|
||||
struct phy_driver *drv = phydev->drv;
|
||||
irqreturn_t ret;
|
||||
|
||||
/* Wakeup interrupts may occur during a system sleep transition.
|
||||
* Postpone handling until the PHY has resumed.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_PM_SLEEP) && phydev->irq_suspended) {
|
||||
struct net_device *netdev = phydev->attached_dev;
|
||||
|
||||
if (netdev) {
|
||||
struct device *parent = netdev->dev.parent;
|
||||
|
||||
if (netdev->wol_enabled)
|
||||
pm_system_wakeup();
|
||||
else if (device_may_wakeup(&netdev->dev))
|
||||
pm_wakeup_dev_event(&netdev->dev, 0, true);
|
||||
else if (parent && device_may_wakeup(parent))
|
||||
pm_wakeup_dev_event(parent, 0, true);
|
||||
}
|
||||
|
||||
phydev->irq_rerun = 1;
|
||||
disable_irq_nosync(irq);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
mutex_lock(&phydev->lock);
|
||||
ret = drv->handle_interrupt(phydev);
|
||||
mutex_unlock(&phydev->lock);
|
||||
|
||||
@@ -278,6 +278,15 @@ static __maybe_unused int mdio_bus_phy_suspend(struct device *dev)
|
||||
if (phydev->mac_managed_pm)
|
||||
return 0;
|
||||
|
||||
/* Wakeup interrupts may occur during the system sleep transition when
|
||||
* the PHY is inaccessible. Set flag to postpone handling until the PHY
|
||||
* has resumed. Wait for concurrent interrupt handler to complete.
|
||||
*/
|
||||
if (phy_interrupt_is_valid(phydev)) {
|
||||
phydev->irq_suspended = 1;
|
||||
synchronize_irq(phydev->irq);
|
||||
}
|
||||
|
||||
/* We must stop the state machine manually, otherwise it stops out of
|
||||
* control, possibly with the phydev->lock held. Upon resume, netdev
|
||||
* may call phy routines that try to grab the same lock, and that may
|
||||
@@ -315,6 +324,20 @@ static __maybe_unused int mdio_bus_phy_resume(struct device *dev)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
no_resume:
|
||||
if (phy_interrupt_is_valid(phydev)) {
|
||||
phydev->irq_suspended = 0;
|
||||
synchronize_irq(phydev->irq);
|
||||
|
||||
/* Rerun interrupts which were postponed by phy_interrupt()
|
||||
* because they occurred during the system sleep transition.
|
||||
*/
|
||||
if (phydev->irq_rerun) {
|
||||
phydev->irq_rerun = 0;
|
||||
enable_irq(phydev->irq);
|
||||
irq_wake_thread(phydev->irq, phydev);
|
||||
}
|
||||
}
|
||||
|
||||
if (phydev->attached_dev && phydev->adjust_link)
|
||||
phy_start_machine(phydev);
|
||||
|
||||
|
||||
@@ -2516,7 +2516,7 @@ static int sfp_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, sfp);
|
||||
|
||||
err = devm_add_action(sfp->dev, sfp_cleanup, sfp);
|
||||
err = devm_add_action_or_reset(sfp->dev, sfp_cleanup, sfp);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
|
||||
@@ -273,6 +273,12 @@ static void tun_napi_init(struct tun_struct *tun, struct tun_file *tfile,
|
||||
}
|
||||
}
|
||||
|
||||
static void tun_napi_enable(struct tun_file *tfile)
|
||||
{
|
||||
if (tfile->napi_enabled)
|
||||
napi_enable(&tfile->napi);
|
||||
}
|
||||
|
||||
static void tun_napi_disable(struct tun_file *tfile)
|
||||
{
|
||||
if (tfile->napi_enabled)
|
||||
@@ -634,7 +640,8 @@ static void __tun_detach(struct tun_file *tfile, bool clean)
|
||||
tun = rtnl_dereference(tfile->tun);
|
||||
|
||||
if (tun && clean) {
|
||||
tun_napi_disable(tfile);
|
||||
if (!tfile->detached)
|
||||
tun_napi_disable(tfile);
|
||||
tun_napi_del(tfile);
|
||||
}
|
||||
|
||||
@@ -653,8 +660,10 @@ static void __tun_detach(struct tun_file *tfile, bool clean)
|
||||
if (clean) {
|
||||
RCU_INIT_POINTER(tfile->tun, NULL);
|
||||
sock_put(&tfile->sk);
|
||||
} else
|
||||
} else {
|
||||
tun_disable_queue(tun, tfile);
|
||||
tun_napi_disable(tfile);
|
||||
}
|
||||
|
||||
synchronize_net();
|
||||
tun_flow_delete_by_queue(tun, tun->numqueues + 1);
|
||||
@@ -727,6 +736,7 @@ static void tun_detach_all(struct net_device *dev)
|
||||
sock_put(&tfile->sk);
|
||||
}
|
||||
list_for_each_entry_safe(tfile, tmp, &tun->disabled, next) {
|
||||
tun_napi_del(tfile);
|
||||
tun_enable_queue(tfile);
|
||||
tun_queue_purge(tfile);
|
||||
xdp_rxq_info_unreg(&tfile->xdp_rxq);
|
||||
@@ -807,6 +817,7 @@ static int tun_attach(struct tun_struct *tun, struct file *file,
|
||||
|
||||
if (tfile->detached) {
|
||||
tun_enable_queue(tfile);
|
||||
tun_napi_enable(tfile);
|
||||
} else {
|
||||
sock_hold(&tfile->sk);
|
||||
tun_napi_init(tun, tfile, napi, napi_frags);
|
||||
|
||||
@@ -126,8 +126,7 @@
|
||||
AX_MEDIUM_RE)
|
||||
|
||||
#define AX88772_MEDIUM_DEFAULT \
|
||||
(AX_MEDIUM_FD | AX_MEDIUM_RFC | \
|
||||
AX_MEDIUM_TFC | AX_MEDIUM_PS | \
|
||||
(AX_MEDIUM_FD | AX_MEDIUM_PS | \
|
||||
AX_MEDIUM_AC | AX_MEDIUM_RE)
|
||||
|
||||
/* AX88772 & AX88178 RX_CTL values */
|
||||
|
||||
@@ -431,6 +431,7 @@ void asix_adjust_link(struct net_device *netdev)
|
||||
|
||||
asix_write_medium_mode(dev, mode, 0);
|
||||
phy_print_status(phydev);
|
||||
usbnet_link_change(dev, phydev->link, 0);
|
||||
}
|
||||
|
||||
int asix_write_gpio(struct usbnet *dev, u16 value, int sleep, int in_pm)
|
||||
|
||||
@@ -1472,6 +1472,42 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
|
||||
* are bundled into this buffer and where we can find an array of
|
||||
* per-packet metadata (which contains elements encoded into u16).
|
||||
*/
|
||||
|
||||
/* SKB contents for current firmware:
|
||||
* <packet 1> <padding>
|
||||
* ...
|
||||
* <packet N> <padding>
|
||||
* <per-packet metadata entry 1> <dummy header>
|
||||
* ...
|
||||
* <per-packet metadata entry N> <dummy header>
|
||||
* <padding2> <rx_hdr>
|
||||
*
|
||||
* where:
|
||||
* <packet N> contains pkt_len bytes:
|
||||
* 2 bytes of IP alignment pseudo header
|
||||
* packet received
|
||||
* <per-packet metadata entry N> contains 4 bytes:
|
||||
* pkt_len and fields AX_RXHDR_*
|
||||
* <padding> 0-7 bytes to terminate at
|
||||
* 8 bytes boundary (64-bit).
|
||||
* <padding2> 4 bytes to make rx_hdr terminate at
|
||||
* 8 bytes boundary (64-bit)
|
||||
* <dummy-header> contains 4 bytes:
|
||||
* pkt_len=0 and AX_RXHDR_DROP_ERR
|
||||
* <rx-hdr> contains 4 bytes:
|
||||
* pkt_cnt and hdr_off (offset of
|
||||
* <per-packet metadata entry 1>)
|
||||
*
|
||||
* pkt_cnt is number of entrys in the per-packet metadata.
|
||||
* In current firmware there is 2 entrys per packet.
|
||||
* The first points to the packet and the
|
||||
* second is a dummy header.
|
||||
* This was done probably to align fields in 64-bit and
|
||||
* maintain compatibility with old firmware.
|
||||
* This code assumes that <dummy header> and <padding2> are
|
||||
* optional.
|
||||
*/
|
||||
|
||||
if (skb->len < 4)
|
||||
return 0;
|
||||
skb_trim(skb, skb->len - 4);
|
||||
@@ -1485,51 +1521,66 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
|
||||
/* Make sure that the bounds of the metadata array are inside the SKB
|
||||
* (and in front of the counter at the end).
|
||||
*/
|
||||
if (pkt_cnt * 2 + hdr_off > skb->len)
|
||||
if (pkt_cnt * 4 + hdr_off > skb->len)
|
||||
return 0;
|
||||
pkt_hdr = (u32 *)(skb->data + hdr_off);
|
||||
|
||||
/* Packets must not overlap the metadata array */
|
||||
skb_trim(skb, hdr_off);
|
||||
|
||||
for (; ; pkt_cnt--, pkt_hdr++) {
|
||||
for (; pkt_cnt > 0; pkt_cnt--, pkt_hdr++) {
|
||||
u16 pkt_len_plus_padd;
|
||||
u16 pkt_len;
|
||||
|
||||
le32_to_cpus(pkt_hdr);
|
||||
pkt_len = (*pkt_hdr >> 16) & 0x1fff;
|
||||
pkt_len_plus_padd = (pkt_len + 7) & 0xfff8;
|
||||
|
||||
if (pkt_len > skb->len)
|
||||
/* Skip dummy header used for alignment
|
||||
*/
|
||||
if (pkt_len == 0)
|
||||
continue;
|
||||
|
||||
if (pkt_len_plus_padd > skb->len)
|
||||
return 0;
|
||||
|
||||
/* Check CRC or runt packet */
|
||||
if (((*pkt_hdr & (AX_RXHDR_CRC_ERR | AX_RXHDR_DROP_ERR)) == 0) &&
|
||||
pkt_len >= 2 + ETH_HLEN) {
|
||||
bool last = (pkt_cnt == 0);
|
||||
|
||||
if (last) {
|
||||
ax_skb = skb;
|
||||
} else {
|
||||
ax_skb = skb_clone(skb, GFP_ATOMIC);
|
||||
if (!ax_skb)
|
||||
return 0;
|
||||
}
|
||||
ax_skb->len = pkt_len;
|
||||
/* Skip IP alignment pseudo header */
|
||||
skb_pull(ax_skb, 2);
|
||||
skb_set_tail_pointer(ax_skb, ax_skb->len);
|
||||
ax_skb->truesize = pkt_len + sizeof(struct sk_buff);
|
||||
ax88179_rx_checksum(ax_skb, pkt_hdr);
|
||||
|
||||
if (last)
|
||||
return 1;
|
||||
|
||||
usbnet_skb_return(dev, ax_skb);
|
||||
if ((*pkt_hdr & (AX_RXHDR_CRC_ERR | AX_RXHDR_DROP_ERR)) ||
|
||||
pkt_len < 2 + ETH_HLEN) {
|
||||
dev->net->stats.rx_errors++;
|
||||
skb_pull(skb, pkt_len_plus_padd);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Trim this packet away from the SKB */
|
||||
if (!skb_pull(skb, (pkt_len + 7) & 0xFFF8))
|
||||
/* last packet */
|
||||
if (pkt_len_plus_padd == skb->len) {
|
||||
skb_trim(skb, pkt_len);
|
||||
|
||||
/* Skip IP alignment pseudo header */
|
||||
skb_pull(skb, 2);
|
||||
|
||||
skb->truesize = SKB_TRUESIZE(pkt_len_plus_padd);
|
||||
ax88179_rx_checksum(skb, pkt_hdr);
|
||||
return 1;
|
||||
}
|
||||
|
||||
ax_skb = skb_clone(skb, GFP_ATOMIC);
|
||||
if (!ax_skb)
|
||||
return 0;
|
||||
skb_trim(ax_skb, pkt_len);
|
||||
|
||||
/* Skip IP alignment pseudo header */
|
||||
skb_pull(ax_skb, 2);
|
||||
|
||||
skb->truesize = pkt_len_plus_padd +
|
||||
SKB_DATA_ALIGN(sizeof(struct sk_buff));
|
||||
ax88179_rx_checksum(ax_skb, pkt_hdr);
|
||||
usbnet_skb_return(dev, ax_skb);
|
||||
|
||||
skb_pull(skb, pkt_len_plus_padd);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sk_buff *
|
||||
|
||||
@@ -2004,7 +2004,7 @@ static int __usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype,
|
||||
cmd, reqtype, value, index, size);
|
||||
|
||||
if (size) {
|
||||
buf = kmalloc(size, GFP_KERNEL);
|
||||
buf = kmalloc(size, GFP_NOIO);
|
||||
if (!buf)
|
||||
goto out;
|
||||
}
|
||||
@@ -2036,7 +2036,7 @@ static int __usbnet_write_cmd(struct usbnet *dev, u8 cmd, u8 reqtype,
|
||||
cmd, reqtype, value, index, size);
|
||||
|
||||
if (data) {
|
||||
buf = kmemdup(data, size, GFP_KERNEL);
|
||||
buf = kmemdup(data, size, GFP_NOIO);
|
||||
if (!buf)
|
||||
goto out;
|
||||
} else {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user