Backport mac80211 patches from linux-6.1.y
This commit is contained in:
parent
c58c7488b1
commit
d04378f078
114 changed files with 1661 additions and 651 deletions
|
@ -337,3 +337,18 @@ Contact: netdev@vger.kernel.org
|
|||
Description:
|
||||
32-bit unsigned integer counting the number of times the link has
|
||||
been down
|
||||
|
||||
What: /sys/class/net/<iface>/threaded
|
||||
Date: Jan 2021
|
||||
KernelVersion: 5.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Boolean value to control the threaded mode per device. User could
|
||||
set this value to enable/disable threaded mode for all napi
|
||||
belonging to this device, without the need to do device up/down.
|
||||
|
||||
Possible values:
|
||||
== ==================================
|
||||
0 threaded mode disabled for this dev
|
||||
1 threaded mode enabled for this dev
|
||||
== ==================================
|
||||
|
|
|
@ -84,6 +84,7 @@ static void __init kirkwood_dt_eth_fixup(void)
|
|||
struct device_node *pnp = of_get_parent(np);
|
||||
struct clk *clk;
|
||||
struct property *pmac;
|
||||
u8 tmpmac[ETH_ALEN];
|
||||
void __iomem *io;
|
||||
u8 *macaddr;
|
||||
u32 reg;
|
||||
|
@ -93,7 +94,7 @@ static void __init kirkwood_dt_eth_fixup(void)
|
|||
|
||||
/* skip disabled nodes or nodes with valid MAC address*/
|
||||
if (!of_device_is_available(pnp) ||
|
||||
!IS_ERR(of_get_mac_address(np)))
|
||||
!of_get_mac_address(np, tmpmac))
|
||||
goto eth_fixup_skip;
|
||||
|
||||
clk = of_clk_get(pnp, 0);
|
||||
|
|
|
@ -1633,7 +1633,7 @@ CONFIG_CFG80211_DEFAULT_PS=y
|
|||
CONFIG_CFG80211_CRDA_SUPPORT=y
|
||||
CONFIG_CFG80211_WEXT=y
|
||||
CONFIG_CFG80211_WEXT_EXPORT=y
|
||||
CONFIG_MAC80211=y
|
||||
CONFIG_MAC80211=m
|
||||
CONFIG_MAC80211_STA_HASH_MAX_SIZE=0
|
||||
# CONFIG_WIMAX is not set
|
||||
CONFIG_RFKILL=y
|
||||
|
@ -2596,7 +2596,7 @@ CONFIG_BCMDHD_GET_OOB_STATE=y
|
|||
# CONFIG_WLAN_VENDOR_INTEL is not set
|
||||
# CONFIG_WLAN_VENDOR_INTERSIL is not set
|
||||
# CONFIG_WLAN_VENDOR_MARVELL is not set
|
||||
# CONFIG_WLAN_VENDOR_MEDIATEK is not set
|
||||
CONFIG_WLAN_VENDOR_MEDIATEK=y
|
||||
CONFIG_WLAN_VENDOR_MICROCHIP=y
|
||||
# CONFIG_WILC1000_SDIO is not set
|
||||
# CONFIG_WILC1000_SPI is not set
|
||||
|
@ -5819,6 +5819,7 @@ CONFIG_STAGING=y
|
|||
CONFIG_RTL8187=y
|
||||
CONFIG_RTLWIFI=y
|
||||
CONFIG_RTL8821AU=m
|
||||
CONFIG_MT7921U=m
|
||||
|
||||
#
|
||||
# IIO staging drivers
|
||||
|
|
|
@ -73,7 +73,6 @@ static int __init tsi108_eth_of_init(void)
|
|||
struct device_node *phy, *mdio;
|
||||
hw_info tsi_eth_data;
|
||||
const unsigned int *phy_id;
|
||||
const void *mac_addr;
|
||||
const phandle *ph;
|
||||
|
||||
memset(r, 0, sizeof(r));
|
||||
|
@ -101,9 +100,7 @@ static int __init tsi108_eth_of_init(void)
|
|||
goto err;
|
||||
}
|
||||
|
||||
mac_addr = of_get_mac_address(np);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(tsi_eth_data.mac_addr, mac_addr);
|
||||
of_get_mac_address(np, tsi_eth_data.mac_addr);
|
||||
|
||||
ph = of_get_property(np, "mdio-handle", NULL);
|
||||
mdio = of_find_node_by_phandle(*ph);
|
||||
|
|
|
@ -1450,10 +1450,10 @@ static int greth_of_probe(struct platform_device *ofdev)
|
|||
break;
|
||||
}
|
||||
if (i == 6) {
|
||||
const u8 *addr;
|
||||
u8 addr[ETH_ALEN];
|
||||
|
||||
addr = of_get_mac_address(ofdev->dev.of_node);
|
||||
if (!IS_ERR(addr)) {
|
||||
err = of_get_mac_address(ofdev->dev.of_node, addr);
|
||||
if (!err) {
|
||||
for (i = 0; i < 6; i++)
|
||||
macaddr[i] = (unsigned int) addr[i];
|
||||
} else {
|
||||
|
|
|
@ -790,7 +790,6 @@ static int emac_probe(struct platform_device *pdev)
|
|||
struct emac_board_info *db;
|
||||
struct net_device *ndev;
|
||||
int ret = 0;
|
||||
const char *mac_addr;
|
||||
|
||||
ndev = alloc_etherdev(sizeof(struct emac_board_info));
|
||||
if (!ndev) {
|
||||
|
@ -853,12 +852,9 @@ static int emac_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
/* Read MAC-address from DT */
|
||||
mac_addr = of_get_mac_address(np);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(ndev->dev_addr, mac_addr);
|
||||
|
||||
/* Check if the MAC address is valid, if not get a random one */
|
||||
if (!is_valid_ether_addr(ndev->dev_addr)) {
|
||||
ret = of_get_mac_address(np, ndev->dev_addr);
|
||||
if (ret) {
|
||||
/* if the MAC address is invalid get a random one */
|
||||
eth_hw_addr_random(ndev);
|
||||
dev_warn(&pdev->dev, "using random MAC address %pM\n",
|
||||
ndev->dev_addr);
|
||||
|
|
|
@ -1355,7 +1355,6 @@ static int altera_tse_probe(struct platform_device *pdev)
|
|||
struct resource *control_port;
|
||||
struct resource *dma_res;
|
||||
struct altera_tse_private *priv;
|
||||
const unsigned char *macaddr;
|
||||
void __iomem *descmap;
|
||||
const struct of_device_id *of_id = NULL;
|
||||
|
||||
|
@ -1532,10 +1531,8 @@ static int altera_tse_probe(struct platform_device *pdev)
|
|||
priv->rx_dma_buf_sz = ALTERA_RXDMABUFFER_SIZE;
|
||||
|
||||
/* get default MAC address from device tree */
|
||||
macaddr = of_get_mac_address(pdev->dev.of_node);
|
||||
if (!IS_ERR(macaddr))
|
||||
ether_addr_copy(ndev->dev_addr, macaddr);
|
||||
else
|
||||
ret = of_get_mac_address(pdev->dev.of_node, ndev->dev_addr);
|
||||
if (ret)
|
||||
eth_hw_addr_random(ndev);
|
||||
|
||||
/* get phy addr and create mdio */
|
||||
|
|
|
@ -857,7 +857,6 @@ int arc_emac_probe(struct net_device *ndev, int interface)
|
|||
struct device_node *phy_node;
|
||||
struct phy_device *phydev = NULL;
|
||||
struct arc_emac_priv *priv;
|
||||
const char *mac_addr;
|
||||
unsigned int id, clock_frequency, irq;
|
||||
int err;
|
||||
|
||||
|
@ -942,11 +941,8 @@ int arc_emac_probe(struct net_device *ndev, int interface)
|
|||
}
|
||||
|
||||
/* Get MAC address from device tree */
|
||||
mac_addr = of_get_mac_address(dev->of_node);
|
||||
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(ndev->dev_addr, mac_addr);
|
||||
else
|
||||
err = of_get_mac_address(dev->of_node, ndev->dev_addr);
|
||||
if (err)
|
||||
eth_hw_addr_random(ndev);
|
||||
|
||||
arc_emac_set_address_internal(ndev);
|
||||
|
|
|
@ -1857,7 +1857,6 @@ static int ag71xx_probe(struct platform_device *pdev)
|
|||
const struct ag71xx_dcfg *dcfg;
|
||||
struct net_device *ndev;
|
||||
struct resource *res;
|
||||
const void *mac_addr;
|
||||
int tx_size, err, i;
|
||||
struct ag71xx *ag;
|
||||
|
||||
|
@ -1953,10 +1952,8 @@ static int ag71xx_probe(struct platform_device *pdev)
|
|||
ag->stop_desc->ctrl = 0;
|
||||
ag->stop_desc->next = (u32)ag->stop_desc_dma;
|
||||
|
||||
mac_addr = of_get_mac_address(np);
|
||||
if (!IS_ERR(mac_addr))
|
||||
memcpy(ndev->dev_addr, mac_addr, ETH_ALEN);
|
||||
if (IS_ERR(mac_addr) || !is_valid_ether_addr(ndev->dev_addr)) {
|
||||
err = of_get_mac_address(np, ndev->dev_addr);
|
||||
if (err) {
|
||||
netif_err(ag, probe, ndev, "invalid MAC address, using random address\n");
|
||||
eth_random_addr(ndev->dev_addr);
|
||||
}
|
||||
|
|
|
@ -2468,7 +2468,6 @@ static int bcm_sysport_probe(struct platform_device *pdev)
|
|||
struct bcm_sysport_priv *priv;
|
||||
struct device_node *dn;
|
||||
struct net_device *dev;
|
||||
const void *macaddr;
|
||||
u32 txq, rxq;
|
||||
int ret;
|
||||
|
||||
|
@ -2563,12 +2562,10 @@ static int bcm_sysport_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
/* Initialize netdevice members */
|
||||
macaddr = of_get_mac_address(dn);
|
||||
if (IS_ERR(macaddr)) {
|
||||
ret = of_get_mac_address(dn, dev->dev_addr);
|
||||
if (ret) {
|
||||
dev_warn(&pdev->dev, "using random Ethernet MAC\n");
|
||||
eth_hw_addr_random(dev);
|
||||
} else {
|
||||
ether_addr_copy(dev->dev_addr, macaddr);
|
||||
}
|
||||
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
|
|
|
@ -115,7 +115,7 @@ static int bgmac_probe(struct bcma_device *core)
|
|||
struct ssb_sprom *sprom = &core->bus->sprom;
|
||||
struct mii_bus *mii_bus;
|
||||
struct bgmac *bgmac;
|
||||
const u8 *mac = NULL;
|
||||
const u8 *mac;
|
||||
int err;
|
||||
|
||||
bgmac = bgmac_alloc(&core->dev);
|
||||
|
@ -128,11 +128,10 @@ static int bgmac_probe(struct bcma_device *core)
|
|||
|
||||
bcma_set_drvdata(core, bgmac);
|
||||
|
||||
if (bgmac->dev->of_node)
|
||||
mac = of_get_mac_address(bgmac->dev->of_node);
|
||||
err = of_get_mac_address(bgmac->dev->of_node, bgmac->net_dev->dev_addr);
|
||||
|
||||
/* If no MAC address assigned via device tree, check SPROM */
|
||||
if (IS_ERR_OR_NULL(mac)) {
|
||||
if (err) {
|
||||
switch (core->core_unit) {
|
||||
case 0:
|
||||
mac = sprom->et0mac;
|
||||
|
@ -149,10 +148,9 @@ static int bgmac_probe(struct bcma_device *core)
|
|||
err = -ENOTSUPP;
|
||||
goto err;
|
||||
}
|
||||
ether_addr_copy(bgmac->net_dev->dev_addr, mac);
|
||||
}
|
||||
|
||||
ether_addr_copy(bgmac->net_dev->dev_addr, mac);
|
||||
|
||||
/* On BCM4706 we need common core to access PHY */
|
||||
if (core->id.id == BCMA_CORE_4706_MAC_GBIT &&
|
||||
!core->bus->drv_gmac_cmn.core) {
|
||||
|
|
|
@ -173,7 +173,7 @@ static int bgmac_probe(struct platform_device *pdev)
|
|||
struct device_node *np = pdev->dev.of_node;
|
||||
struct bgmac *bgmac;
|
||||
struct resource *regs;
|
||||
const u8 *mac_addr;
|
||||
int ret;
|
||||
|
||||
bgmac = bgmac_alloc(&pdev->dev);
|
||||
if (!bgmac)
|
||||
|
@ -192,11 +192,10 @@ static int bgmac_probe(struct platform_device *pdev)
|
|||
bgmac->dev = &pdev->dev;
|
||||
bgmac->dma_dev = &pdev->dev;
|
||||
|
||||
mac_addr = of_get_mac_address(np);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(bgmac->net_dev->dev_addr, mac_addr);
|
||||
else
|
||||
dev_warn(&pdev->dev, "MAC address not present in device tree\n");
|
||||
ret = of_get_mac_address(np, bgmac->net_dev->dev_addr);
|
||||
if (ret)
|
||||
dev_warn(&pdev->dev,
|
||||
"MAC address not present in device tree\n");
|
||||
|
||||
bgmac->irq = platform_get_irq(pdev, 0);
|
||||
if (bgmac->irq < 0)
|
||||
|
|
|
@ -4484,7 +4484,6 @@ static int macb_probe(struct platform_device *pdev)
|
|||
struct net_device *dev;
|
||||
struct resource *regs;
|
||||
void __iomem *mem;
|
||||
const char *mac;
|
||||
struct macb *bp;
|
||||
int err, val;
|
||||
|
||||
|
@ -4597,15 +4596,11 @@ static int macb_probe(struct platform_device *pdev)
|
|||
if (bp->caps & MACB_CAPS_NEEDS_RSTONUBR)
|
||||
bp->rx_intr_mask |= MACB_BIT(RXUBR);
|
||||
|
||||
mac = of_get_mac_address(np);
|
||||
if (PTR_ERR(mac) == -EPROBE_DEFER) {
|
||||
err = -EPROBE_DEFER;
|
||||
err = of_get_mac_address(np, bp->dev->dev_addr);
|
||||
if (err == -EPROBE_DEFER)
|
||||
goto err_out_free_netdev;
|
||||
} else if (!IS_ERR_OR_NULL(mac)) {
|
||||
ether_addr_copy(bp->dev->dev_addr, mac);
|
||||
} else {
|
||||
else if (err)
|
||||
macb_get_hwaddr(bp);
|
||||
}
|
||||
|
||||
err = of_get_phy_mode(np, &interface);
|
||||
if (err)
|
||||
|
|
|
@ -1385,7 +1385,6 @@ static int octeon_mgmt_probe(struct platform_device *pdev)
|
|||
struct net_device *netdev;
|
||||
struct octeon_mgmt *p;
|
||||
const __be32 *data;
|
||||
const u8 *mac;
|
||||
struct resource *res_mix;
|
||||
struct resource *res_agl;
|
||||
struct resource *res_agl_prt_ctl;
|
||||
|
@ -1502,11 +1501,8 @@ static int octeon_mgmt_probe(struct platform_device *pdev)
|
|||
netdev->min_mtu = 64 - OCTEON_MGMT_RX_HEADROOM;
|
||||
netdev->max_mtu = 16383 - OCTEON_MGMT_RX_HEADROOM - VLAN_HLEN;
|
||||
|
||||
mac = of_get_mac_address(pdev->dev.of_node);
|
||||
|
||||
if (!IS_ERR(mac))
|
||||
ether_addr_copy(netdev->dev_addr, mac);
|
||||
else
|
||||
result = of_get_mac_address(pdev->dev.of_node, netdev->dev_addr);
|
||||
if (result)
|
||||
eth_hw_addr_random(netdev);
|
||||
|
||||
p->phy_np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0);
|
||||
|
|
|
@ -1476,7 +1476,6 @@ static int bgx_init_of_phy(struct bgx *bgx)
|
|||
device_for_each_child_node(&bgx->pdev->dev, fwn) {
|
||||
struct phy_device *pd;
|
||||
struct device_node *phy_np;
|
||||
const char *mac;
|
||||
|
||||
/* Should always be an OF node. But if it is not, we
|
||||
* cannot handle it, so exit the loop.
|
||||
|
@ -1485,9 +1484,7 @@ static int bgx_init_of_phy(struct bgx *bgx)
|
|||
if (!node)
|
||||
break;
|
||||
|
||||
mac = of_get_mac_address(node);
|
||||
if (!IS_ERR(mac))
|
||||
ether_addr_copy(bgx->lmac[lmac].mac, mac);
|
||||
of_get_mac_address(node, bgx->lmac[lmac].mac);
|
||||
|
||||
SET_NETDEV_DEV(&bgx->lmac[lmac].netdev, &bgx->pdev->dev);
|
||||
bgx->lmac[lmac].lmacid = lmac;
|
||||
|
|
|
@ -1388,7 +1388,7 @@ static struct dm9000_plat_data *dm9000_parse_dt(struct device *dev)
|
|||
{
|
||||
struct dm9000_plat_data *pdata;
|
||||
struct device_node *np = dev->of_node;
|
||||
const void *mac_addr;
|
||||
int ret;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_OF) || !np)
|
||||
return ERR_PTR(-ENXIO);
|
||||
|
@ -1402,11 +1402,9 @@ static struct dm9000_plat_data *dm9000_parse_dt(struct device *dev)
|
|||
if (of_find_property(np, "davicom,no-eeprom", NULL))
|
||||
pdata->flags |= DM9000_PLATF_NO_EEPROM;
|
||||
|
||||
mac_addr = of_get_mac_address(np);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(pdata->dev_addr, mac_addr);
|
||||
else if (PTR_ERR(mac_addr) == -EPROBE_DEFER)
|
||||
return ERR_CAST(mac_addr);
|
||||
ret = of_get_mac_address(np, pdata->dev_addr);
|
||||
if (ret == -EPROBE_DEFER)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
return pdata;
|
||||
}
|
||||
|
|
|
@ -1151,11 +1151,7 @@ static int ethoc_probe(struct platform_device *pdev)
|
|||
ether_addr_copy(netdev->dev_addr, pdata->hwaddr);
|
||||
priv->phy_id = pdata->phy_id;
|
||||
} else {
|
||||
const void *mac;
|
||||
|
||||
mac = of_get_mac_address(pdev->dev.of_node);
|
||||
if (!IS_ERR(mac))
|
||||
ether_addr_copy(netdev->dev_addr, mac);
|
||||
of_get_mac_address(pdev->dev.of_node, netdev->dev_addr);
|
||||
priv->phy_id = -1;
|
||||
}
|
||||
|
||||
|
|
|
@ -575,7 +575,6 @@ static s32 nps_enet_probe(struct platform_device *pdev)
|
|||
struct net_device *ndev;
|
||||
struct nps_enet_priv *priv;
|
||||
s32 err = 0;
|
||||
const char *mac_addr;
|
||||
|
||||
if (!dev->of_node)
|
||||
return -ENODEV;
|
||||
|
@ -602,10 +601,8 @@ static s32 nps_enet_probe(struct platform_device *pdev)
|
|||
dev_dbg(dev, "Registers base address is 0x%p\n", priv->regs_base);
|
||||
|
||||
/* set kernel MAC address to dev */
|
||||
mac_addr = of_get_mac_address(dev->of_node);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(ndev->dev_addr, mac_addr);
|
||||
else
|
||||
err = of_get_mac_address(dev->of_node, ndev->dev_addr);
|
||||
if (err)
|
||||
eth_hw_addr_random(ndev);
|
||||
|
||||
/* Get IRQ number */
|
||||
|
|
|
@ -1666,6 +1666,7 @@ static void fec_get_mac(struct net_device *ndev)
|
|||
struct fec_enet_private *fep = netdev_priv(ndev);
|
||||
struct fec_platform_data *pdata = dev_get_platdata(&fep->pdev->dev);
|
||||
unsigned char *iap, tmpaddr[ETH_ALEN];
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* try to get mac address in following order:
|
||||
|
@ -1681,9 +1682,9 @@ static void fec_get_mac(struct net_device *ndev)
|
|||
if (!is_valid_ether_addr(iap)) {
|
||||
struct device_node *np = fep->pdev->dev.of_node;
|
||||
if (np) {
|
||||
const char *mac = of_get_mac_address(np);
|
||||
if (!IS_ERR(mac))
|
||||
iap = (unsigned char *) mac;
|
||||
ret = of_get_mac_address(np, tmpaddr);
|
||||
if (!ret)
|
||||
iap = tmpaddr;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -813,7 +813,6 @@ static int mpc52xx_fec_probe(struct platform_device *op)
|
|||
const u32 *prop;
|
||||
int prop_size;
|
||||
struct device_node *np = op->dev.of_node;
|
||||
const char *mac_addr;
|
||||
|
||||
phys_addr_t rx_fifo;
|
||||
phys_addr_t tx_fifo;
|
||||
|
@ -891,10 +890,8 @@ static int mpc52xx_fec_probe(struct platform_device *op)
|
|||
*
|
||||
* First try to read MAC address from DT
|
||||
*/
|
||||
mac_addr = of_get_mac_address(np);
|
||||
if (!IS_ERR(mac_addr)) {
|
||||
ether_addr_copy(ndev->dev_addr, mac_addr);
|
||||
} else {
|
||||
rv = of_get_mac_address(np, ndev->dev_addr);
|
||||
if (rv) {
|
||||
struct mpc52xx_fec __iomem *fec = priv->fec;
|
||||
|
||||
/*
|
||||
|
|
|
@ -616,7 +616,6 @@ static int mac_probe(struct platform_device *_of_dev)
|
|||
struct platform_device *of_dev;
|
||||
struct resource res;
|
||||
struct mac_priv_s *priv;
|
||||
const u8 *mac_addr;
|
||||
u32 val;
|
||||
u8 fman_id;
|
||||
phy_interface_t phy_if;
|
||||
|
@ -734,11 +733,9 @@ static int mac_probe(struct platform_device *_of_dev)
|
|||
priv->cell_index = (u8)val;
|
||||
|
||||
/* Get the MAC address */
|
||||
mac_addr = of_get_mac_address(mac_node);
|
||||
if (IS_ERR(mac_addr))
|
||||
err = of_get_mac_address(mac_node, mac_dev->addr);
|
||||
if (err)
|
||||
dev_warn(dev, "of_get_mac_address(%pOF) failed\n", mac_node);
|
||||
else
|
||||
ether_addr_copy(mac_dev->addr, mac_addr);
|
||||
|
||||
/* Get the port handles */
|
||||
nph = of_count_phandle_with_args(mac_node, "fsl,fman-ports", NULL);
|
||||
|
@ -864,7 +861,7 @@ static int mac_probe(struct platform_device *_of_dev)
|
|||
if (err < 0)
|
||||
dev_err(dev, "fman_set_mac_active_pause() = %d\n", err);
|
||||
|
||||
if (!IS_ERR(mac_addr))
|
||||
if (!is_zero_ether_addr(mac_dev->addr))
|
||||
dev_info(dev, "FMan MAC address: %pM\n", mac_dev->addr);
|
||||
|
||||
priv->eth_dev = dpaa_eth_add_device(fman_id, mac_dev);
|
||||
|
|
|
@ -918,7 +918,6 @@ static int fs_enet_probe(struct platform_device *ofdev)
|
|||
const u32 *data;
|
||||
struct clk *clk;
|
||||
int err;
|
||||
const u8 *mac_addr;
|
||||
const char *phy_connection_type;
|
||||
int privsize, len, ret = -ENODEV;
|
||||
|
||||
|
@ -1006,9 +1005,7 @@ static int fs_enet_probe(struct platform_device *ofdev)
|
|||
spin_lock_init(&fep->lock);
|
||||
spin_lock_init(&fep->tx_lock);
|
||||
|
||||
mac_addr = of_get_mac_address(ofdev->dev.of_node);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(ndev->dev_addr, mac_addr);
|
||||
of_get_mac_address(ofdev->dev.of_node, ndev->dev_addr);
|
||||
|
||||
ret = fep->ops->allocate_bd(ndev);
|
||||
if (ret)
|
||||
|
|
|
@ -641,7 +641,6 @@ static phy_interface_t gfar_get_interface(struct net_device *dev)
|
|||
static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
|
||||
{
|
||||
const char *model;
|
||||
const void *mac_addr;
|
||||
int err = 0, i;
|
||||
phy_interface_t interface;
|
||||
struct net_device *dev = NULL;
|
||||
|
@ -783,11 +782,8 @@ static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
|
|||
if (stash_len || stash_idx)
|
||||
priv->device_flags |= FSL_GIANFAR_DEV_HAS_BUF_STASHING;
|
||||
|
||||
mac_addr = of_get_mac_address(np);
|
||||
|
||||
if (!IS_ERR(mac_addr)) {
|
||||
ether_addr_copy(dev->dev_addr, mac_addr);
|
||||
} else {
|
||||
err = of_get_mac_address(np, dev->dev_addr);
|
||||
if (err) {
|
||||
eth_hw_addr_random(dev);
|
||||
dev_info(&ofdev->dev, "Using random MAC address: %pM\n", dev->dev_addr);
|
||||
}
|
||||
|
|
|
@ -3696,7 +3696,6 @@ static int ucc_geth_probe(struct platform_device* ofdev)
|
|||
int err, ucc_num, max_speed = 0;
|
||||
const unsigned int *prop;
|
||||
const char *sprop;
|
||||
const void *mac_addr;
|
||||
phy_interface_t phy_interface;
|
||||
static const int enet_to_speed[] = {
|
||||
SPEED_10, SPEED_10, SPEED_10,
|
||||
|
@ -3906,9 +3905,7 @@ static int ucc_geth_probe(struct platform_device* ofdev)
|
|||
goto err_free_netdev;
|
||||
}
|
||||
|
||||
mac_addr = of_get_mac_address(np);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(dev->dev_addr, mac_addr);
|
||||
of_get_mac_address(np, dev->dev_addr);
|
||||
|
||||
ugeth->ug_info = ug_info;
|
||||
ugeth->dev = device;
|
||||
|
|
|
@ -772,7 +772,6 @@ static int hisi_femac_drv_probe(struct platform_device *pdev)
|
|||
struct net_device *ndev;
|
||||
struct hisi_femac_priv *priv;
|
||||
struct phy_device *phy;
|
||||
const char *mac_addr;
|
||||
int ret;
|
||||
|
||||
ndev = alloc_etherdev(sizeof(*priv));
|
||||
|
@ -842,10 +841,8 @@ static int hisi_femac_drv_probe(struct platform_device *pdev)
|
|||
(unsigned long)phy->phy_id,
|
||||
phy_modes(phy->interface));
|
||||
|
||||
mac_addr = of_get_mac_address(node);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(ndev->dev_addr, mac_addr);
|
||||
if (!is_valid_ether_addr(ndev->dev_addr)) {
|
||||
ret = of_get_mac_address(node, ndev->dev_addr);
|
||||
if (ret) {
|
||||
eth_hw_addr_random(ndev);
|
||||
dev_warn(dev, "using random MAC address %pM\n",
|
||||
ndev->dev_addr);
|
||||
|
|
|
@ -1098,7 +1098,6 @@ static int hix5hd2_dev_probe(struct platform_device *pdev)
|
|||
struct net_device *ndev;
|
||||
struct hix5hd2_priv *priv;
|
||||
struct mii_bus *bus;
|
||||
const char *mac_addr;
|
||||
int ret;
|
||||
|
||||
ndev = alloc_etherdev(sizeof(struct hix5hd2_priv));
|
||||
|
@ -1220,10 +1219,8 @@ static int hix5hd2_dev_probe(struct platform_device *pdev)
|
|||
goto out_phy_node;
|
||||
}
|
||||
|
||||
mac_addr = of_get_mac_address(node);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(ndev->dev_addr, mac_addr);
|
||||
if (!is_valid_ether_addr(ndev->dev_addr)) {
|
||||
ret = of_get_mac_address(node, ndev->dev_addr);
|
||||
if (ret) {
|
||||
eth_hw_addr_random(ndev);
|
||||
netdev_warn(ndev, "using random MAC address %pM\n",
|
||||
ndev->dev_addr);
|
||||
|
|
|
@ -440,7 +440,6 @@ static int xrx200_probe(struct platform_device *pdev)
|
|||
struct resource *res;
|
||||
struct xrx200_priv *priv;
|
||||
struct net_device *net_dev;
|
||||
const u8 *mac;
|
||||
int err;
|
||||
|
||||
/* alloc the network device */
|
||||
|
@ -484,10 +483,8 @@ static int xrx200_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(priv->clk);
|
||||
}
|
||||
|
||||
mac = of_get_mac_address(np);
|
||||
if (!IS_ERR(mac))
|
||||
ether_addr_copy(net_dev->dev_addr, mac);
|
||||
else
|
||||
err = of_get_mac_address(np, net_dev->dev_addr);
|
||||
if (err)
|
||||
eth_hw_addr_random(net_dev);
|
||||
|
||||
/* bring up the dma engine and IP core */
|
||||
|
|
|
@ -2701,7 +2701,6 @@ static int mv643xx_eth_shared_of_add_port(struct platform_device *pdev,
|
|||
struct platform_device *ppdev;
|
||||
struct mv643xx_eth_platform_data ppd;
|
||||
struct resource res;
|
||||
const char *mac_addr;
|
||||
int ret;
|
||||
int dev_num = 0;
|
||||
|
||||
|
@ -2732,9 +2731,7 @@ static int mv643xx_eth_shared_of_add_port(struct platform_device *pdev,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
mac_addr = of_get_mac_address(pnp);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(ppd.mac_addr, mac_addr);
|
||||
of_get_mac_address(pnp, ppd.mac_addr);
|
||||
|
||||
mv643xx_eth_property(pnp, "tx-queue-size", ppd.tx_queue_size);
|
||||
mv643xx_eth_property(pnp, "tx-sram-addr", ppd.tx_sram_addr);
|
||||
|
|
|
@ -5062,7 +5062,6 @@ static int mvneta_probe(struct platform_device *pdev)
|
|||
struct net_device *dev;
|
||||
struct phylink *phylink;
|
||||
struct phy *comphy;
|
||||
const char *dt_mac_addr;
|
||||
char hw_mac_addr[ETH_ALEN];
|
||||
phy_interface_t phy_mode;
|
||||
const char *mac_from;
|
||||
|
@ -5158,10 +5157,9 @@ static int mvneta_probe(struct platform_device *pdev)
|
|||
goto err_free_ports;
|
||||
}
|
||||
|
||||
dt_mac_addr = of_get_mac_address(dn);
|
||||
if (!IS_ERR(dt_mac_addr)) {
|
||||
err = of_get_mac_address(dn, dev->dev_addr);
|
||||
if (!err) {
|
||||
mac_from = "device tree";
|
||||
ether_addr_copy(dev->dev_addr, dt_mac_addr);
|
||||
} else {
|
||||
mvneta_get_mac_addr(pp, hw_mac_addr);
|
||||
if (is_valid_ether_addr(hw_mac_addr)) {
|
||||
|
|
|
@ -466,20 +466,17 @@ static int prestera_switch_set_base_mac_addr(struct prestera_switch *sw)
|
|||
{
|
||||
struct device_node *base_mac_np;
|
||||
struct device_node *np;
|
||||
const char *base_mac;
|
||||
int ret;
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "marvell,prestera");
|
||||
base_mac_np = of_parse_phandle(np, "base-mac-provider", 0);
|
||||
|
||||
base_mac = of_get_mac_address(base_mac_np);
|
||||
of_node_put(base_mac_np);
|
||||
if (!IS_ERR(base_mac))
|
||||
ether_addr_copy(sw->base_mac, base_mac);
|
||||
|
||||
if (!is_valid_ether_addr(sw->base_mac)) {
|
||||
ret = of_get_mac_address(base_mac_np, sw->base_mac);
|
||||
if (ret) {
|
||||
eth_random_addr(sw->base_mac);
|
||||
dev_info(prestera_dev(sw), "using random base mac address\n");
|
||||
}
|
||||
of_node_put(base_mac_np);
|
||||
|
||||
return prestera_hw_switch_mac_set(sw, sw->base_mac);
|
||||
}
|
||||
|
|
|
@ -1392,7 +1392,6 @@ static int pxa168_eth_probe(struct platform_device *pdev)
|
|||
struct resource *res;
|
||||
struct clk *clk;
|
||||
struct device_node *np;
|
||||
const unsigned char *mac_addr = NULL;
|
||||
int err;
|
||||
|
||||
printk(KERN_NOTICE "PXA168 10/100 Ethernet Driver\n");
|
||||
|
@ -1435,12 +1434,8 @@ static int pxa168_eth_probe(struct platform_device *pdev)
|
|||
|
||||
INIT_WORK(&pep->tx_timeout_task, pxa168_eth_tx_timeout_task);
|
||||
|
||||
if (pdev->dev.of_node)
|
||||
mac_addr = of_get_mac_address(pdev->dev.of_node);
|
||||
|
||||
if (!IS_ERR_OR_NULL(mac_addr)) {
|
||||
ether_addr_copy(dev->dev_addr, mac_addr);
|
||||
} else {
|
||||
err = of_get_mac_address(pdev->dev.of_node, dev->dev_addr);
|
||||
if (err) {
|
||||
/* try reading the mac address, if set by the bootloader */
|
||||
pxa168_eth_get_mac_address(dev, dev->dev_addr);
|
||||
if (!is_valid_ether_addr(dev->dev_addr)) {
|
||||
|
|
|
@ -4725,7 +4725,7 @@ static struct net_device *sky2_init_netdev(struct sky2_hw *hw, unsigned port,
|
|||
{
|
||||
struct sky2_port *sky2;
|
||||
struct net_device *dev = alloc_etherdev(sizeof(*sky2));
|
||||
const void *iap;
|
||||
int ret;
|
||||
|
||||
if (!dev)
|
||||
return NULL;
|
||||
|
@ -4795,10 +4795,8 @@ static struct net_device *sky2_init_netdev(struct sky2_hw *hw, unsigned port,
|
|||
* 1) from device tree data
|
||||
* 2) from internal registers set by bootloader
|
||||
*/
|
||||
iap = of_get_mac_address(hw->pdev->dev.of_node);
|
||||
if (!IS_ERR(iap))
|
||||
ether_addr_copy(dev->dev_addr, iap);
|
||||
else
|
||||
ret = of_get_mac_address(hw->pdev->dev.of_node, dev->dev_addr);
|
||||
if (ret)
|
||||
memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8,
|
||||
ETH_ALEN);
|
||||
|
||||
|
|
|
@ -2521,14 +2521,11 @@ static int __init mtk_init(struct net_device *dev)
|
|||
{
|
||||
struct mtk_mac *mac = netdev_priv(dev);
|
||||
struct mtk_eth *eth = mac->hw;
|
||||
const char *mac_addr;
|
||||
int ret;
|
||||
|
||||
mac_addr = of_get_mac_address(mac->of_node);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(dev->dev_addr, mac_addr);
|
||||
|
||||
/* If the mac address is invalid, use random mac address */
|
||||
if (!is_valid_ether_addr(dev->dev_addr)) {
|
||||
ret = of_get_mac_address(mac->of_node, dev->dev_addr);
|
||||
if (ret) {
|
||||
/* If the mac address is invalid, use random mac address */
|
||||
eth_hw_addr_random(dev);
|
||||
dev_err(eth->dev, "generated random MAC address %pM\n",
|
||||
dev->dev_addr);
|
||||
|
|
|
@ -194,11 +194,10 @@ static void ks8851_read_mac_addr(struct net_device *dev)
|
|||
static void ks8851_init_mac(struct ks8851_net *ks, struct device_node *np)
|
||||
{
|
||||
struct net_device *dev = ks->netdev;
|
||||
const u8 *mac_addr;
|
||||
int ret;
|
||||
|
||||
mac_addr = of_get_mac_address(np);
|
||||
if (!IS_ERR(mac_addr)) {
|
||||
ether_addr_copy(dev->dev_addr, mac_addr);
|
||||
ret = of_get_mac_address(np, dev->dev_addr);
|
||||
if (!ret) {
|
||||
ks8851_write_mac_addr(dev);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -2844,7 +2844,6 @@ static int lan743x_pcidev_probe(struct pci_dev *pdev,
|
|||
{
|
||||
struct lan743x_adapter *adapter = NULL;
|
||||
struct net_device *netdev = NULL;
|
||||
const void *mac_addr;
|
||||
int ret = -ENODEV;
|
||||
|
||||
netdev = devm_alloc_etherdev(&pdev->dev,
|
||||
|
@ -2861,9 +2860,7 @@ static int lan743x_pcidev_probe(struct pci_dev *pdev,
|
|||
NETIF_MSG_IFDOWN | NETIF_MSG_TX_QUEUED;
|
||||
netdev->max_mtu = LAN743X_MAX_FRAME_SIZE;
|
||||
|
||||
mac_addr = of_get_mac_address(pdev->dev.of_node);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(adapter->mac_address, mac_addr);
|
||||
of_get_mac_address(pdev->dev.of_node, adapter->mac_address);
|
||||
|
||||
ret = lan743x_pci_init(adapter, pdev);
|
||||
if (ret)
|
||||
|
|
|
@ -1347,9 +1347,7 @@ static int lpc_eth_drv_probe(struct platform_device *pdev)
|
|||
__lpc_get_mac(pldat, ndev->dev_addr);
|
||||
|
||||
if (!is_valid_ether_addr(ndev->dev_addr)) {
|
||||
const char *macaddr = of_get_mac_address(np);
|
||||
if (!IS_ERR(macaddr))
|
||||
ether_addr_copy(ndev->dev_addr, macaddr);
|
||||
of_get_mac_address(np, ndev->dev_addr);
|
||||
}
|
||||
if (!is_valid_ether_addr(ndev->dev_addr))
|
||||
eth_hw_addr_random(ndev);
|
||||
|
|
|
@ -884,7 +884,7 @@ qca_spi_probe(struct spi_device *spi)
|
|||
struct net_device *qcaspi_devs = NULL;
|
||||
u8 legacy_mode = 0;
|
||||
u16 signature;
|
||||
const char *mac;
|
||||
int ret;
|
||||
|
||||
if (!spi->dev.of_node) {
|
||||
dev_err(&spi->dev, "Missing device tree\n");
|
||||
|
@ -961,12 +961,8 @@ qca_spi_probe(struct spi_device *spi)
|
|||
|
||||
spi_set_drvdata(spi, qcaspi_devs);
|
||||
|
||||
mac = of_get_mac_address(spi->dev.of_node);
|
||||
|
||||
if (!IS_ERR(mac))
|
||||
ether_addr_copy(qca->net_dev->dev_addr, mac);
|
||||
|
||||
if (!is_valid_ether_addr(qca->net_dev->dev_addr)) {
|
||||
ret = of_get_mac_address(spi->dev.of_node, qca->net_dev->dev_addr);
|
||||
if (ret) {
|
||||
eth_hw_addr_random(qca->net_dev);
|
||||
dev_info(&spi->dev, "Using random MAC address: %pM\n",
|
||||
qca->net_dev->dev_addr);
|
||||
|
|
|
@ -323,7 +323,6 @@ static int qca_uart_probe(struct serdev_device *serdev)
|
|||
{
|
||||
struct net_device *qcauart_dev = alloc_etherdev(sizeof(struct qcauart));
|
||||
struct qcauart *qca;
|
||||
const char *mac;
|
||||
u32 speed = 115200;
|
||||
int ret;
|
||||
|
||||
|
@ -348,12 +347,8 @@ static int qca_uart_probe(struct serdev_device *serdev)
|
|||
|
||||
of_property_read_u32(serdev->dev.of_node, "current-speed", &speed);
|
||||
|
||||
mac = of_get_mac_address(serdev->dev.of_node);
|
||||
|
||||
if (!IS_ERR(mac))
|
||||
ether_addr_copy(qca->net_dev->dev_addr, mac);
|
||||
|
||||
if (!is_valid_ether_addr(qca->net_dev->dev_addr)) {
|
||||
ret = of_get_mac_address(serdev->dev.of_node, qca->net_dev->dev_addr);
|
||||
if (ret) {
|
||||
eth_hw_addr_random(qca->net_dev);
|
||||
dev_info(&serdev->dev, "Using random MAC address: %pM\n",
|
||||
qca->net_dev->dev_addr);
|
||||
|
|
|
@ -109,11 +109,13 @@ static void ravb_set_buffer_align(struct sk_buff *skb)
|
|||
* Ethernet AVB device doesn't have ROM for MAC address.
|
||||
* This function gets the MAC address that was used by a bootloader.
|
||||
*/
|
||||
static void ravb_read_mac_address(struct net_device *ndev, const u8 *mac)
|
||||
static void ravb_read_mac_address(struct device_node *np,
|
||||
struct net_device *ndev)
|
||||
{
|
||||
if (!IS_ERR(mac)) {
|
||||
ether_addr_copy(ndev->dev_addr, mac);
|
||||
} else {
|
||||
int ret;
|
||||
|
||||
ret = of_get_mac_address(np, ndev->dev_addr);
|
||||
if (ret) {
|
||||
u32 mahr = ravb_read(ndev, MAHR);
|
||||
u32 malr = ravb_read(ndev, MALR);
|
||||
|
||||
|
@ -2191,7 +2193,7 @@ static int ravb_probe(struct platform_device *pdev)
|
|||
priv->msg_enable = RAVB_DEF_MSG_ENABLE;
|
||||
|
||||
/* Read and set MAC address */
|
||||
ravb_read_mac_address(ndev, of_get_mac_address(np));
|
||||
ravb_read_mac_address(np, ndev);
|
||||
if (!is_valid_ether_addr(ndev->dev_addr)) {
|
||||
dev_warn(&pdev->dev,
|
||||
"no valid MAC address supplied, using a random one\n");
|
||||
|
|
|
@ -3145,7 +3145,6 @@ static struct sh_eth_plat_data *sh_eth_parse_dt(struct device *dev)
|
|||
struct device_node *np = dev->of_node;
|
||||
struct sh_eth_plat_data *pdata;
|
||||
phy_interface_t interface;
|
||||
const char *mac_addr;
|
||||
int ret;
|
||||
|
||||
pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
|
||||
|
@ -3157,9 +3156,7 @@ static struct sh_eth_plat_data *sh_eth_parse_dt(struct device *dev)
|
|||
return NULL;
|
||||
pdata->phy_interface = interface;
|
||||
|
||||
mac_addr = of_get_mac_address(np);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(pdata->mac_addr, mac_addr);
|
||||
of_get_mac_address(np, pdata->mac_addr);
|
||||
|
||||
pdata->no_ether_link =
|
||||
of_property_read_bool(np, "renesas,no-ether-link");
|
||||
|
|
|
@ -25,8 +25,7 @@
|
|||
|
||||
#ifdef CONFIG_OF
|
||||
static int sxgbe_probe_config_dt(struct platform_device *pdev,
|
||||
struct sxgbe_plat_data *plat,
|
||||
const char **mac)
|
||||
struct sxgbe_plat_data *plat)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct sxgbe_dma_cfg *dma_cfg;
|
||||
|
@ -35,7 +34,6 @@ static int sxgbe_probe_config_dt(struct platform_device *pdev,
|
|||
if (!np)
|
||||
return -ENODEV;
|
||||
|
||||
*mac = of_get_mac_address(np);
|
||||
err = of_get_phy_mode(np, &plat->interface);
|
||||
if (err && err != -ENODEV)
|
||||
return err;
|
||||
|
@ -63,8 +61,7 @@ static int sxgbe_probe_config_dt(struct platform_device *pdev,
|
|||
}
|
||||
#else
|
||||
static int sxgbe_probe_config_dt(struct platform_device *pdev,
|
||||
struct sxgbe_plat_data *plat,
|
||||
const char **mac)
|
||||
struct sxgbe_plat_data *plat)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
@ -85,7 +82,6 @@ static int sxgbe_platform_probe(struct platform_device *pdev)
|
|||
void __iomem *addr;
|
||||
struct sxgbe_priv_data *priv = NULL;
|
||||
struct sxgbe_plat_data *plat_dat = NULL;
|
||||
const char *mac = NULL;
|
||||
struct net_device *ndev = platform_get_drvdata(pdev);
|
||||
struct device_node *node = dev->of_node;
|
||||
|
||||
|
@ -101,7 +97,7 @@ static int sxgbe_platform_probe(struct platform_device *pdev)
|
|||
if (!plat_dat)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = sxgbe_probe_config_dt(pdev, plat_dat, &mac);
|
||||
ret = sxgbe_probe_config_dt(pdev, plat_dat);
|
||||
if (ret) {
|
||||
pr_err("%s: main dt probe failed\n", __func__);
|
||||
return ret;
|
||||
|
@ -122,8 +118,7 @@ static int sxgbe_platform_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
/* Get MAC address if available (DT) */
|
||||
if (!IS_ERR_OR_NULL(mac))
|
||||
ether_addr_copy(priv->dev->dev_addr, mac);
|
||||
of_get_mac_address(node, priv->dev->dev_addr);
|
||||
|
||||
/* Get the TX/RX IRQ numbers */
|
||||
for (i = 0, chan = 1; i < SXGBE_TX_QUEUES; i++) {
|
||||
|
|
|
@ -1559,7 +1559,6 @@ static int ave_probe(struct platform_device *pdev)
|
|||
struct ave_private *priv;
|
||||
struct net_device *ndev;
|
||||
struct device_node *np;
|
||||
const void *mac_addr;
|
||||
void __iomem *base;
|
||||
const char *name;
|
||||
int i, irq, ret;
|
||||
|
@ -1600,12 +1599,9 @@ static int ave_probe(struct platform_device *pdev)
|
|||
|
||||
ndev->max_mtu = AVE_MAX_ETHFRAME - (ETH_HLEN + ETH_FCS_LEN);
|
||||
|
||||
mac_addr = of_get_mac_address(np);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(ndev->dev_addr, mac_addr);
|
||||
|
||||
/* if the mac address is invalid, use random mac address */
|
||||
if (!is_valid_ether_addr(ndev->dev_addr)) {
|
||||
ret = of_get_mac_address(np, ndev->dev_addr);
|
||||
if (ret) {
|
||||
/* if the mac address is invalid, use random mac address */
|
||||
eth_hw_addr_random(ndev);
|
||||
dev_warn(dev, "Using random MAC address: %pM\n",
|
||||
ndev->dev_addr);
|
||||
|
|
|
@ -115,7 +115,7 @@ static int anarion_dwmac_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(gmac))
|
||||
return PTR_ERR(gmac);
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat))
|
||||
return PTR_ERR(plat_dat);
|
||||
|
||||
|
|
|
@ -445,7 +445,7 @@ static int dwc_eth_dwmac_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(stmmac_res.addr))
|
||||
return PTR_ERR(stmmac_res.addr);
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat))
|
||||
return PTR_ERR(plat_dat);
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ static int dwmac_generic_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
|
||||
if (pdev->dev.of_node) {
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat)) {
|
||||
dev_err(&pdev->dev, "dt configuration failed\n");
|
||||
return PTR_ERR(plat_dat);
|
||||
|
|
|
@ -226,7 +226,7 @@ static int imx_dwmac_probe(struct platform_device *pdev)
|
|||
if (!dwmac)
|
||||
return -ENOMEM;
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat))
|
||||
return PTR_ERR(plat_dat);
|
||||
|
||||
|
|
|
@ -88,7 +88,7 @@ static int intel_eth_plat_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat)) {
|
||||
dev_err(&pdev->dev, "dt configuration failed\n");
|
||||
return PTR_ERR(plat_dat);
|
||||
|
|
|
@ -255,7 +255,7 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
|
|||
if (val)
|
||||
return val;
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat))
|
||||
return PTR_ERR(plat_dat);
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ static int lpc18xx_dwmac_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat))
|
||||
return PTR_ERR(plat_dat);
|
||||
|
||||
|
|
|
@ -407,7 +407,7 @@ static int mediatek_dwmac_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat))
|
||||
return PTR_ERR(plat_dat);
|
||||
|
||||
|
|
|
@ -52,7 +52,7 @@ static int meson6_dwmac_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat))
|
||||
return PTR_ERR(plat_dat);
|
||||
|
||||
|
|
|
@ -370,7 +370,7 @@ static int meson8b_dwmac_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat))
|
||||
return PTR_ERR(plat_dat);
|
||||
|
||||
|
|
|
@ -118,7 +118,7 @@ static int oxnas_dwmac_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat))
|
||||
return PTR_ERR(plat_dat);
|
||||
|
||||
|
|
|
@ -461,7 +461,7 @@ static int qcom_ethqos_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat)) {
|
||||
dev_err(&pdev->dev, "dt configuration failed\n");
|
||||
return PTR_ERR(plat_dat);
|
||||
|
|
|
@ -1386,7 +1386,7 @@ static int rk_gmac_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat))
|
||||
return PTR_ERR(plat_dat);
|
||||
|
||||
|
|
|
@ -397,7 +397,7 @@ static int socfpga_dwmac_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat))
|
||||
return PTR_ERR(plat_dat);
|
||||
|
||||
|
|
|
@ -325,7 +325,7 @@ static int sti_dwmac_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat))
|
||||
return PTR_ERR(plat_dat);
|
||||
|
||||
|
|
|
@ -373,7 +373,7 @@ static int stm32_dwmac_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat))
|
||||
return PTR_ERR(plat_dat);
|
||||
|
||||
|
|
|
@ -1203,7 +1203,7 @@ static int sun8i_dwmac_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return -EINVAL;
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat))
|
||||
return PTR_ERR(plat_dat);
|
||||
|
||||
|
|
|
@ -108,7 +108,7 @@ static int sun7i_gmac_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
|
||||
plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
||||
if (IS_ERR(plat_dat))
|
||||
return PTR_ERR(plat_dat);
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
|
||||
struct stmmac_resources {
|
||||
void __iomem *addr;
|
||||
const char *mac;
|
||||
u8 mac[ETH_ALEN];
|
||||
int wol_irq;
|
||||
int lpi_irq;
|
||||
int irq;
|
||||
|
|
|
@ -5019,7 +5019,7 @@ int stmmac_dvr_probe(struct device *device,
|
|||
priv->wol_irq = res->wol_irq;
|
||||
priv->lpi_irq = res->lpi_irq;
|
||||
|
||||
if (!IS_ERR_OR_NULL(res->mac))
|
||||
if (!is_zero_ether_addr(res->mac))
|
||||
memcpy(priv->dev->dev_addr, res->mac, ETH_ALEN);
|
||||
|
||||
dev_set_drvdata(device, priv->dev);
|
||||
|
|
|
@ -395,7 +395,7 @@ static int stmmac_of_get_mac_mode(struct device_node *np)
|
|||
* set some private fields that will be used by the main at runtime.
|
||||
*/
|
||||
struct plat_stmmacenet_data *
|
||||
stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
|
||||
stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct plat_stmmacenet_data *plat;
|
||||
|
@ -407,12 +407,12 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
|
|||
if (!plat)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
*mac = of_get_mac_address(np);
|
||||
if (IS_ERR(*mac)) {
|
||||
if (PTR_ERR(*mac) == -EPROBE_DEFER)
|
||||
return ERR_CAST(*mac);
|
||||
rc = of_get_mac_address(np, mac);
|
||||
if (rc) {
|
||||
if (rc == -EPROBE_DEFER)
|
||||
return ERR_PTR(rc);
|
||||
|
||||
*mac = NULL;
|
||||
eth_zero_addr(mac);
|
||||
}
|
||||
|
||||
phy_mode = device_get_phy_mode(&pdev->dev);
|
||||
|
@ -643,7 +643,7 @@ void stmmac_remove_config_dt(struct platform_device *pdev,
|
|||
}
|
||||
#else
|
||||
struct plat_stmmacenet_data *
|
||||
stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
|
||||
stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)
|
||||
{
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "stmmac.h"
|
||||
|
||||
struct plat_stmmacenet_data *
|
||||
stmmac_probe_config_dt(struct platform_device *pdev, const char **mac);
|
||||
stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac);
|
||||
void stmmac_remove_config_dt(struct platform_device *pdev,
|
||||
struct plat_stmmacenet_data *plat);
|
||||
|
||||
|
|
|
@ -1714,7 +1714,6 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common)
|
|||
|
||||
for_each_child_of_node(node, port_np) {
|
||||
struct am65_cpsw_port *port;
|
||||
const void *mac_addr;
|
||||
u32 port_id;
|
||||
|
||||
/* it is not a slave port node, continue */
|
||||
|
@ -1797,15 +1796,15 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common)
|
|||
goto of_node_put;
|
||||
}
|
||||
|
||||
mac_addr = of_get_mac_address(port_np);
|
||||
if (!IS_ERR(mac_addr)) {
|
||||
ether_addr_copy(port->slave.mac_addr, mac_addr);
|
||||
} else if (am65_cpsw_am654_get_efuse_macid(port_np,
|
||||
port->port_id,
|
||||
port->slave.mac_addr) ||
|
||||
!is_valid_ether_addr(port->slave.mac_addr)) {
|
||||
random_ether_addr(port->slave.mac_addr);
|
||||
dev_err(dev, "Use random MAC address\n");
|
||||
ret = of_get_mac_address(port_np, port->slave.mac_addr);
|
||||
if (ret) {
|
||||
am65_cpsw_am654_get_efuse_macid(port_np,
|
||||
port->port_id,
|
||||
port->slave.mac_addr);
|
||||
if (!is_valid_ether_addr(port->slave.mac_addr)) {
|
||||
random_ether_addr(port->slave.mac_addr);
|
||||
dev_err(dev, "Use random MAC address\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
of_node_put(node);
|
||||
|
|
|
@ -1308,7 +1308,6 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data,
|
|||
|
||||
for_each_available_child_of_node(node, slave_node) {
|
||||
struct cpsw_slave_data *slave_data = data->slave_data + i;
|
||||
const void *mac_addr = NULL;
|
||||
int lenp;
|
||||
const __be32 *parp;
|
||||
|
||||
|
@ -1380,10 +1379,8 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data,
|
|||
}
|
||||
|
||||
no_phy_slave:
|
||||
mac_addr = of_get_mac_address(slave_node);
|
||||
if (!IS_ERR(mac_addr)) {
|
||||
ether_addr_copy(slave_data->mac_addr, mac_addr);
|
||||
} else {
|
||||
ret = of_get_mac_address(slave_node, slave_data->mac_addr);
|
||||
if (ret) {
|
||||
ret = ti_cm_get_macid(&pdev->dev, i,
|
||||
slave_data->mac_addr);
|
||||
if (ret)
|
||||
|
|
|
@ -1269,7 +1269,6 @@ static int cpsw_probe_dt(struct cpsw_common *cpsw)
|
|||
|
||||
for_each_child_of_node(tmp_node, port_np) {
|
||||
struct cpsw_slave_data *slave_data;
|
||||
const void *mac_addr;
|
||||
u32 port_id;
|
||||
|
||||
ret = of_property_read_u32(port_np, "reg", &port_id);
|
||||
|
@ -1328,10 +1327,8 @@ static int cpsw_probe_dt(struct cpsw_common *cpsw)
|
|||
goto err_node_put;
|
||||
}
|
||||
|
||||
mac_addr = of_get_mac_address(port_np);
|
||||
if (!IS_ERR(mac_addr)) {
|
||||
ether_addr_copy(slave_data->mac_addr, mac_addr);
|
||||
} else {
|
||||
ret = of_get_mac_address(port_np, slave_data->mac_addr);
|
||||
if (ret) {
|
||||
ret = ti_cm_get_macid(dev, port_id - 1,
|
||||
slave_data->mac_addr);
|
||||
if (ret)
|
||||
|
|
|
@ -1699,7 +1699,6 @@ davinci_emac_of_get_pdata(struct platform_device *pdev, struct emac_priv *priv)
|
|||
const struct of_device_id *match;
|
||||
const struct emac_platform_data *auxdata;
|
||||
struct emac_platform_data *pdata = NULL;
|
||||
const u8 *mac_addr;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_OF) || !pdev->dev.of_node)
|
||||
return dev_get_platdata(&pdev->dev);
|
||||
|
@ -1711,11 +1710,8 @@ davinci_emac_of_get_pdata(struct platform_device *pdev, struct emac_priv *priv)
|
|||
np = pdev->dev.of_node;
|
||||
pdata->version = EMAC_VERSION_2;
|
||||
|
||||
if (!is_valid_ether_addr(pdata->mac_addr)) {
|
||||
mac_addr = of_get_mac_address(np);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(pdata->mac_addr, mac_addr);
|
||||
}
|
||||
if (!is_valid_ether_addr(pdata->mac_addr))
|
||||
of_get_mac_address(np, pdata->mac_addr);
|
||||
|
||||
of_property_read_u32(np, "ti,davinci-ctrl-reg-offset",
|
||||
&pdata->ctrl_reg_offset);
|
||||
|
|
|
@ -1966,7 +1966,6 @@ static int netcp_create_interface(struct netcp_device *netcp_device,
|
|||
struct resource res;
|
||||
void __iomem *efuse = NULL;
|
||||
u32 efuse_mac = 0;
|
||||
const void *mac_addr;
|
||||
u8 efuse_mac_addr[6];
|
||||
u32 temp[2];
|
||||
int ret = 0;
|
||||
|
@ -2036,10 +2035,8 @@ static int netcp_create_interface(struct netcp_device *netcp_device,
|
|||
devm_iounmap(dev, efuse);
|
||||
devm_release_mem_region(dev, res.start, size);
|
||||
} else {
|
||||
mac_addr = of_get_mac_address(node_interface);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(ndev->dev_addr, mac_addr);
|
||||
else
|
||||
ret = of_get_mac_address(node_interface, ndev->dev_addr);
|
||||
if (ret)
|
||||
eth_random_addr(ndev->dev_addr);
|
||||
}
|
||||
|
||||
|
|
|
@ -423,8 +423,14 @@ static int w5100_spi_probe(struct spi_device *spi)
|
|||
const struct of_device_id *of_id;
|
||||
const struct w5100_ops *ops;
|
||||
kernel_ulong_t driver_data;
|
||||
const void *mac = NULL;
|
||||
u8 tmpmac[ETH_ALEN];
|
||||
int priv_size;
|
||||
const void *mac = of_get_mac_address(spi->dev.of_node);
|
||||
int ret;
|
||||
|
||||
ret = of_get_mac_address(spi->dev.of_node, tmpmac);
|
||||
if (!ret)
|
||||
mac = tmpmac;
|
||||
|
||||
if (spi->dev.of_node) {
|
||||
of_id = of_match_device(w5100_of_match, &spi->dev);
|
||||
|
|
|
@ -1159,7 +1159,7 @@ int w5100_probe(struct device *dev, const struct w5100_ops *ops,
|
|||
INIT_WORK(&priv->setrx_work, w5100_setrx_work);
|
||||
INIT_WORK(&priv->restart_work, w5100_restart_work);
|
||||
|
||||
if (!IS_ERR_OR_NULL(mac_addr))
|
||||
if (mac_addr)
|
||||
memcpy(ndev->dev_addr, mac_addr, ETH_ALEN);
|
||||
else
|
||||
eth_hw_addr_random(ndev);
|
||||
|
|
|
@ -438,7 +438,7 @@ static void temac_do_set_mac_address(struct net_device *ndev)
|
|||
|
||||
static int temac_init_mac_address(struct net_device *ndev, const void *address)
|
||||
{
|
||||
ether_addr_copy(ndev->dev_addr, address);
|
||||
memcpy(ndev->dev_addr, address, ETH_ALEN);
|
||||
if (!is_valid_ether_addr(ndev->dev_addr))
|
||||
eth_hw_addr_random(ndev);
|
||||
temac_do_set_mac_address(ndev);
|
||||
|
@ -1370,7 +1370,7 @@ static int temac_probe(struct platform_device *pdev)
|
|||
struct device_node *temac_np = dev_of_node(&pdev->dev), *dma_np;
|
||||
struct temac_local *lp;
|
||||
struct net_device *ndev;
|
||||
const void *addr;
|
||||
u8 addr[ETH_ALEN];
|
||||
__be32 *p;
|
||||
bool little_endian;
|
||||
int rc = 0;
|
||||
|
@ -1563,8 +1563,8 @@ static int temac_probe(struct platform_device *pdev)
|
|||
|
||||
if (temac_np) {
|
||||
/* Retrieve the MAC address */
|
||||
addr = of_get_mac_address(temac_np);
|
||||
if (IS_ERR(addr)) {
|
||||
rc = of_get_mac_address(temac_np, addr);
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "could not find MAC address\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
|
|
@ -1843,8 +1843,8 @@ static int axienet_probe(struct platform_device *pdev)
|
|||
struct device_node *np;
|
||||
struct axienet_local *lp;
|
||||
struct net_device *ndev;
|
||||
const void *mac_addr;
|
||||
struct resource *ethres;
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
int addr_width = 32;
|
||||
u32 value;
|
||||
|
||||
|
@ -2049,13 +2049,14 @@ static int axienet_probe(struct platform_device *pdev)
|
|||
dev_info(&pdev->dev, "Ethernet core IRQ not defined\n");
|
||||
|
||||
/* Retrieve the MAC address */
|
||||
mac_addr = of_get_mac_address(pdev->dev.of_node);
|
||||
if (IS_ERR(mac_addr)) {
|
||||
dev_warn(&pdev->dev, "could not find MAC address property: %ld\n",
|
||||
PTR_ERR(mac_addr));
|
||||
mac_addr = NULL;
|
||||
ret = of_get_mac_address(pdev->dev.of_node, mac_addr);
|
||||
if (!ret) {
|
||||
axienet_set_mac_address(ndev, mac_addr);
|
||||
} else {
|
||||
dev_warn(&pdev->dev, "could not find MAC address property: %d\n",
|
||||
ret);
|
||||
axienet_set_mac_address(ndev, NULL);
|
||||
}
|
||||
axienet_set_mac_address(ndev, mac_addr);
|
||||
|
||||
lp->coalesce_count_rx = XAXIDMA_DFT_RX_THRESHOLD;
|
||||
lp->coalesce_count_tx = XAXIDMA_DFT_TX_THRESHOLD;
|
||||
|
|
|
@ -1107,7 +1107,6 @@ static int xemaclite_of_probe(struct platform_device *ofdev)
|
|||
struct net_device *ndev = NULL;
|
||||
struct net_local *lp = NULL;
|
||||
struct device *dev = &ofdev->dev;
|
||||
const void *mac_address;
|
||||
|
||||
int rc = 0;
|
||||
|
||||
|
@ -1149,12 +1148,9 @@ static int xemaclite_of_probe(struct platform_device *ofdev)
|
|||
lp->next_rx_buf_to_use = 0x0;
|
||||
lp->tx_ping_pong = get_bool(ofdev, "xlnx,tx-ping-pong");
|
||||
lp->rx_ping_pong = get_bool(ofdev, "xlnx,rx-ping-pong");
|
||||
mac_address = of_get_mac_address(ofdev->dev.of_node);
|
||||
|
||||
if (!IS_ERR(mac_address)) {
|
||||
/* Set the MAC address. */
|
||||
ether_addr_copy(ndev->dev_addr, mac_address);
|
||||
} else {
|
||||
rc = of_get_mac_address(ofdev->dev.of_node, ndev->dev_addr);
|
||||
if (rc) {
|
||||
dev_warn(dev, "No MAC address found, using random\n");
|
||||
eth_hw_addr_random(ndev);
|
||||
}
|
||||
|
|
|
@ -1295,9 +1295,8 @@ static void ath11k_peer_assoc_h_he(struct ath11k *ar,
|
|||
* request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
|
||||
* length.
|
||||
*/
|
||||
ampdu_factor = (he_cap->he_cap_elem.mac_cap_info[3] &
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) >>
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_SHIFT;
|
||||
ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
|
||||
|
||||
if (ampdu_factor) {
|
||||
if (sta->vht_cap.vht_supported)
|
||||
|
@ -3648,7 +3647,7 @@ ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
|
|||
IEEE80211_HE_MAC_CAP4_BQR;
|
||||
he_cap_elem->mac_cap_info[4] &= ~m;
|
||||
|
||||
m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECVITE_TRANSMISSION |
|
||||
m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
|
||||
IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
|
||||
IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
|
||||
IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
|
||||
|
@ -3658,7 +3657,7 @@ ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
|
|||
IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
|
||||
he_cap_elem->phy_cap_info[2] &= ~m;
|
||||
|
||||
m = IEEE80211_HE_PHY_CAP3_RX_HE_MU_PPDU_FROM_NON_AP_STA |
|
||||
m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
|
||||
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
|
||||
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
|
||||
he_cap_elem->phy_cap_info[3] &= ~m;
|
||||
|
@ -3670,13 +3669,13 @@ ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
|
|||
he_cap_elem->phy_cap_info[5] &= ~m;
|
||||
|
||||
m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
|
||||
IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB |
|
||||
IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
|
||||
IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
|
||||
IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
|
||||
he_cap_elem->phy_cap_info[6] &= ~m;
|
||||
|
||||
m = IEEE80211_HE_PHY_CAP7_SRP_BASED_SR |
|
||||
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR |
|
||||
m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
|
||||
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
|
||||
IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
|
||||
IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
|
||||
he_cap_elem->phy_cap_info[7] &= ~m;
|
||||
|
@ -6313,7 +6312,7 @@ static int __ath11k_mac_register(struct ath11k *ar)
|
|||
ar->hw->queues = ATH11K_HW_MAX_QUEUES;
|
||||
ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN;
|
||||
ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1;
|
||||
ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF;
|
||||
ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
|
||||
|
||||
ar->hw->vif_data_size = sizeof(struct ath11k_vif);
|
||||
ar->hw->sta_data_size = sizeof(struct ath11k_sta);
|
||||
|
|
|
@ -618,7 +618,6 @@ static int ath9k_of_init(struct ath_softc *sc)
|
|||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
enum ath_bus_type bus_type = common->bus_ops->ath_bus_type;
|
||||
const char *mac;
|
||||
char eeprom_name[100];
|
||||
int ret;
|
||||
|
||||
|
@ -641,9 +640,7 @@ static int ath9k_of_init(struct ath_softc *sc)
|
|||
ah->ah_flags |= AH_NO_EEP_SWAP;
|
||||
}
|
||||
|
||||
mac = of_get_mac_address(np);
|
||||
if (!IS_ERR(mac))
|
||||
ether_addr_copy(common->macaddr, mac);
|
||||
of_get_mac_address(np, common->macaddr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -595,9 +595,9 @@ static struct ieee80211_sband_iftype_data iwl_he_capa[] = {
|
|||
IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP,
|
||||
.mac_cap_info[3] =
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2,
|
||||
.mac_cap_info[4] =
|
||||
IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU |
|
||||
IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU |
|
||||
IEEE80211_HE_MAC_CAP4_MULTI_TID_AGG_TX_QOS_B39,
|
||||
.mac_cap_info[5] =
|
||||
IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B40 |
|
||||
|
@ -630,7 +630,7 @@ static struct ieee80211_sband_iftype_data iwl_he_capa[] = {
|
|||
.phy_cap_info[6] =
|
||||
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT,
|
||||
.phy_cap_info[7] =
|
||||
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR |
|
||||
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
|
||||
IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI |
|
||||
IEEE80211_HE_PHY_CAP7_MAX_NC_1,
|
||||
.phy_cap_info[8] =
|
||||
|
@ -643,7 +643,8 @@ static struct ieee80211_sband_iftype_data iwl_he_capa[] = {
|
|||
IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
|
||||
IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
|
||||
IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB |
|
||||
IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_RESERVED,
|
||||
(IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED <<
|
||||
IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_POS),
|
||||
},
|
||||
/*
|
||||
* Set default Tx/Rx HE MCS NSS Support field.
|
||||
|
@ -679,9 +680,9 @@ static struct ieee80211_sband_iftype_data iwl_he_capa[] = {
|
|||
IEEE80211_HE_MAC_CAP2_BSR,
|
||||
.mac_cap_info[3] =
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2,
|
||||
.mac_cap_info[4] =
|
||||
IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
||||
IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
|
||||
.mac_cap_info[5] =
|
||||
IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU,
|
||||
.phy_cap_info[0] =
|
||||
|
@ -718,7 +719,8 @@ static struct ieee80211_sband_iftype_data iwl_he_capa[] = {
|
|||
.phy_cap_info[9] =
|
||||
IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
|
||||
IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB |
|
||||
IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_RESERVED,
|
||||
IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED
|
||||
<< IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_POS,
|
||||
},
|
||||
/*
|
||||
* Set default Tx/Rx HE MCS NSS Support field.
|
||||
|
|
|
@ -2202,24 +2202,24 @@ static void iwl_mvm_cfg_he_sta(struct iwl_mvm *mvm,
|
|||
}
|
||||
|
||||
flags |= STA_CTXT_HE_PACKET_EXT;
|
||||
} else if ((sta->he_cap.he_cap_elem.phy_cap_info[9] &
|
||||
IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_MASK) !=
|
||||
IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_RESERVED) {
|
||||
} else if (u8_get_bits(sta->he_cap.he_cap_elem.phy_cap_info[9],
|
||||
IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK)
|
||||
!= IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED) {
|
||||
int low_th = -1;
|
||||
int high_th = -1;
|
||||
|
||||
/* Take the PPE thresholds from the nominal padding info */
|
||||
switch (sta->he_cap.he_cap_elem.phy_cap_info[9] &
|
||||
IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_MASK) {
|
||||
case IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_0US:
|
||||
switch (u8_get_bits(sta->he_cap.he_cap_elem.phy_cap_info[9],
|
||||
IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK)) {
|
||||
case IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_0US:
|
||||
low_th = IWL_HE_PKT_EXT_NONE;
|
||||
high_th = IWL_HE_PKT_EXT_NONE;
|
||||
break;
|
||||
case IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_8US:
|
||||
case IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_8US:
|
||||
low_th = IWL_HE_PKT_EXT_BPSK;
|
||||
high_th = IWL_HE_PKT_EXT_NONE;
|
||||
break;
|
||||
case IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_16US:
|
||||
case IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US:
|
||||
low_th = IWL_HE_PKT_EXT_NONE;
|
||||
high_th = IWL_HE_PKT_EXT_BPSK;
|
||||
break;
|
||||
|
|
|
@ -639,12 +639,12 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
|
|||
if (!hw)
|
||||
return NULL;
|
||||
|
||||
hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF;
|
||||
hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
|
||||
|
||||
if (cfg->max_tx_agg_size)
|
||||
hw->max_tx_aggregation_subframes = cfg->max_tx_agg_size;
|
||||
else
|
||||
hw->max_tx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF;
|
||||
hw->max_tx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
|
||||
|
||||
op_mode = hw->priv;
|
||||
|
||||
|
|
|
@ -315,6 +315,12 @@ static struct net_device *hwsim_mon; /* global monitor netdev */
|
|||
.hw_value = (_freq), \
|
||||
}
|
||||
|
||||
#define CHAN6G(_freq) { \
|
||||
.band = NL80211_BAND_6GHZ, \
|
||||
.center_freq = (_freq), \
|
||||
.hw_value = (_freq), \
|
||||
}
|
||||
|
||||
static const struct ieee80211_channel hwsim_channels_2ghz[] = {
|
||||
CHAN2G(2412), /* Channel 1 */
|
||||
CHAN2G(2417), /* Channel 2 */
|
||||
|
@ -381,6 +387,68 @@ static const struct ieee80211_channel hwsim_channels_5ghz[] = {
|
|||
CHAN5G(5925), /* Channel 185 */
|
||||
};
|
||||
|
||||
static const struct ieee80211_channel hwsim_channels_6ghz[] = {
|
||||
CHAN6G(5955), /* Channel 1 */
|
||||
CHAN6G(5975), /* Channel 5 */
|
||||
CHAN6G(5995), /* Channel 9 */
|
||||
CHAN6G(6015), /* Channel 13 */
|
||||
CHAN6G(6035), /* Channel 17 */
|
||||
CHAN6G(6055), /* Channel 21 */
|
||||
CHAN6G(6075), /* Channel 25 */
|
||||
CHAN6G(6095), /* Channel 29 */
|
||||
CHAN6G(6115), /* Channel 33 */
|
||||
CHAN6G(6135), /* Channel 37 */
|
||||
CHAN6G(6155), /* Channel 41 */
|
||||
CHAN6G(6175), /* Channel 45 */
|
||||
CHAN6G(6195), /* Channel 49 */
|
||||
CHAN6G(6215), /* Channel 53 */
|
||||
CHAN6G(6235), /* Channel 57 */
|
||||
CHAN6G(6255), /* Channel 61 */
|
||||
CHAN6G(6275), /* Channel 65 */
|
||||
CHAN6G(6295), /* Channel 69 */
|
||||
CHAN6G(6315), /* Channel 73 */
|
||||
CHAN6G(6335), /* Channel 77 */
|
||||
CHAN6G(6355), /* Channel 81 */
|
||||
CHAN6G(6375), /* Channel 85 */
|
||||
CHAN6G(6395), /* Channel 89 */
|
||||
CHAN6G(6415), /* Channel 93 */
|
||||
CHAN6G(6435), /* Channel 97 */
|
||||
CHAN6G(6455), /* Channel 181 */
|
||||
CHAN6G(6475), /* Channel 105 */
|
||||
CHAN6G(6495), /* Channel 109 */
|
||||
CHAN6G(6515), /* Channel 113 */
|
||||
CHAN6G(6535), /* Channel 117 */
|
||||
CHAN6G(6555), /* Channel 121 */
|
||||
CHAN6G(6575), /* Channel 125 */
|
||||
CHAN6G(6595), /* Channel 129 */
|
||||
CHAN6G(6615), /* Channel 133 */
|
||||
CHAN6G(6635), /* Channel 137 */
|
||||
CHAN6G(6655), /* Channel 141 */
|
||||
CHAN6G(6675), /* Channel 145 */
|
||||
CHAN6G(6695), /* Channel 149 */
|
||||
CHAN6G(6715), /* Channel 153 */
|
||||
CHAN6G(6735), /* Channel 157 */
|
||||
CHAN6G(6755), /* Channel 161 */
|
||||
CHAN6G(6775), /* Channel 165 */
|
||||
CHAN6G(6795), /* Channel 169 */
|
||||
CHAN6G(6815), /* Channel 173 */
|
||||
CHAN6G(6835), /* Channel 177 */
|
||||
CHAN6G(6855), /* Channel 181 */
|
||||
CHAN6G(6875), /* Channel 185 */
|
||||
CHAN6G(6895), /* Channel 189 */
|
||||
CHAN6G(6915), /* Channel 193 */
|
||||
CHAN6G(6935), /* Channel 197 */
|
||||
CHAN6G(6955), /* Channel 201 */
|
||||
CHAN6G(6975), /* Channel 205 */
|
||||
CHAN6G(6995), /* Channel 209 */
|
||||
CHAN6G(7015), /* Channel 213 */
|
||||
CHAN6G(7035), /* Channel 217 */
|
||||
CHAN6G(7055), /* Channel 221 */
|
||||
CHAN6G(7075), /* Channel 225 */
|
||||
CHAN6G(7095), /* Channel 229 */
|
||||
CHAN6G(7115), /* Channel 233 */
|
||||
};
|
||||
|
||||
#define NUM_S1G_CHANS_US 51
|
||||
static struct ieee80211_channel hwsim_channels_s1g[NUM_S1G_CHANS_US];
|
||||
|
||||
|
@ -552,6 +620,7 @@ struct mac80211_hwsim_data {
|
|||
struct ieee80211_supported_band bands[NUM_NL80211_BANDS];
|
||||
struct ieee80211_channel channels_2ghz[ARRAY_SIZE(hwsim_channels_2ghz)];
|
||||
struct ieee80211_channel channels_5ghz[ARRAY_SIZE(hwsim_channels_5ghz)];
|
||||
struct ieee80211_channel channels_6ghz[ARRAY_SIZE(hwsim_channels_6ghz)];
|
||||
struct ieee80211_channel channels_s1g[ARRAY_SIZE(hwsim_channels_s1g)];
|
||||
struct ieee80211_rate rates[ARRAY_SIZE(hwsim_rates)];
|
||||
struct ieee80211_iface_combination if_combination;
|
||||
|
@ -583,7 +652,8 @@ struct mac80211_hwsim_data {
|
|||
struct ieee80211_channel *channel;
|
||||
unsigned long next_start, start, end;
|
||||
} survey_data[ARRAY_SIZE(hwsim_channels_2ghz) +
|
||||
ARRAY_SIZE(hwsim_channels_5ghz)];
|
||||
ARRAY_SIZE(hwsim_channels_5ghz) +
|
||||
ARRAY_SIZE(hwsim_channels_6ghz)];
|
||||
|
||||
struct ieee80211_channel *channel;
|
||||
u64 beacon_int /* beacon interval in us */;
|
||||
|
@ -2767,8 +2837,8 @@ static const struct ieee80211_sband_iftype_data he_capa_2ghz[] = {
|
|||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||
.mac_cap_info[3] =
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
|
||||
.phy_cap_info[1] =
|
||||
IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
|
||||
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
||||
|
@ -2811,8 +2881,8 @@ static const struct ieee80211_sband_iftype_data he_capa_2ghz[] = {
|
|||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||
.mac_cap_info[3] =
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
|
||||
.phy_cap_info[1] =
|
||||
IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
|
||||
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
||||
|
@ -2857,8 +2927,8 @@ static const struct ieee80211_sband_iftype_data he_capa_5ghz[] = {
|
|||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||
.mac_cap_info[3] =
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
|
||||
.phy_cap_info[0] =
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
|
||||
|
@ -2905,8 +2975,8 @@ static const struct ieee80211_sband_iftype_data he_capa_5ghz[] = {
|
|||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||
.mac_cap_info[3] =
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU,
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
|
||||
.phy_cap_info[0] =
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
|
||||
|
@ -2940,15 +3010,19 @@ static void mac80211_hwsim_he_capab(struct ieee80211_supported_band *sband)
|
|||
{
|
||||
u16 n_iftype_data;
|
||||
|
||||
if (sband->band == NL80211_BAND_2GHZ) {
|
||||
switch (sband->band) {
|
||||
case NL80211_BAND_2GHZ:
|
||||
n_iftype_data = ARRAY_SIZE(he_capa_2ghz);
|
||||
sband->iftype_data =
|
||||
(struct ieee80211_sband_iftype_data *)he_capa_2ghz;
|
||||
} else if (sband->band == NL80211_BAND_5GHZ) {
|
||||
break;
|
||||
case NL80211_BAND_5GHZ:
|
||||
case NL80211_BAND_6GHZ:
|
||||
n_iftype_data = ARRAY_SIZE(he_capa_5ghz);
|
||||
sband->iftype_data =
|
||||
(struct ieee80211_sband_iftype_data *)he_capa_5ghz;
|
||||
} else {
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3194,6 +3268,8 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
|
|||
sizeof(hwsim_channels_2ghz));
|
||||
memcpy(data->channels_5ghz, hwsim_channels_5ghz,
|
||||
sizeof(hwsim_channels_5ghz));
|
||||
memcpy(data->channels_6ghz, hwsim_channels_6ghz,
|
||||
sizeof(hwsim_channels_6ghz));
|
||||
memcpy(data->channels_s1g, hwsim_channels_s1g,
|
||||
sizeof(hwsim_channels_s1g));
|
||||
memcpy(data->rates, hwsim_rates, sizeof(hwsim_rates));
|
||||
|
@ -3238,6 +3314,12 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
|
|||
sband->vht_cap.vht_mcs.tx_mcs_map =
|
||||
sband->vht_cap.vht_mcs.rx_mcs_map;
|
||||
break;
|
||||
case NL80211_BAND_6GHZ:
|
||||
sband->channels = data->channels_6ghz;
|
||||
sband->n_channels = ARRAY_SIZE(hwsim_channels_6ghz);
|
||||
sband->bitrates = data->rates + 4;
|
||||
sband->n_bitrates = ARRAY_SIZE(hwsim_rates) - 4;
|
||||
break;
|
||||
case NL80211_BAND_S1GHZ:
|
||||
memcpy(&sband->s1g_cap, &hwsim_s1g_cap,
|
||||
sizeof(sband->s1g_cap));
|
||||
|
@ -3248,6 +3330,13 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
|
|||
continue;
|
||||
}
|
||||
|
||||
mac80211_hwsim_he_capab(sband);
|
||||
|
||||
hw->wiphy->bands[band] = sband;
|
||||
|
||||
if (band == NL80211_BAND_6GHZ)
|
||||
continue;
|
||||
|
||||
sband->ht_cap.ht_supported = true;
|
||||
sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
|
||||
IEEE80211_HT_CAP_GRN_FLD |
|
||||
|
@ -3261,10 +3350,6 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
|
|||
sband->ht_cap.mcs.rx_mask[0] = 0xff;
|
||||
sband->ht_cap.mcs.rx_mask[1] = 0xff;
|
||||
sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
|
||||
|
||||
mac80211_hwsim_he_capab(sband);
|
||||
|
||||
hw->wiphy->bands[band] = sband;
|
||||
}
|
||||
|
||||
/* By default all radios belong to the first group */
|
||||
|
|
|
@ -990,11 +990,7 @@ static void rt2x00lib_rate(struct ieee80211_rate *entry,
|
|||
|
||||
void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr)
|
||||
{
|
||||
const char *mac_addr;
|
||||
|
||||
mac_addr = of_get_mac_address(rt2x00dev->dev->of_node);
|
||||
if (!IS_ERR(mac_addr))
|
||||
ether_addr_copy(eeprom_mac_addr, mac_addr);
|
||||
of_get_mac_address(rt2x00dev->dev->of_node, eeprom_mac_addr);
|
||||
|
||||
if (!is_valid_ether_addr(eeprom_mac_addr)) {
|
||||
eth_random_addr(eeprom_mac_addr);
|
||||
|
|
|
@ -45,37 +45,29 @@ int of_get_phy_mode(struct device_node *np, phy_interface_t *interface)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(of_get_phy_mode);
|
||||
|
||||
static const void *of_get_mac_addr(struct device_node *np, const char *name)
|
||||
static int of_get_mac_addr(struct device_node *np, const char *name, u8 *addr)
|
||||
{
|
||||
struct property *pp = of_find_property(np, name, NULL);
|
||||
|
||||
if (pp && pp->length == ETH_ALEN && is_valid_ether_addr(pp->value))
|
||||
return pp->value;
|
||||
return NULL;
|
||||
if (pp && pp->length == ETH_ALEN && is_valid_ether_addr(pp->value)) {
|
||||
memcpy(addr, pp->value, ETH_ALEN);
|
||||
return 0;
|
||||
}
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static const void *of_get_mac_addr_nvmem(struct device_node *np)
|
||||
static int of_get_mac_addr_nvmem(struct device_node *np, u8 *addr)
|
||||
{
|
||||
int ret;
|
||||
const void *mac;
|
||||
u8 nvmem_mac[ETH_ALEN];
|
||||
struct platform_device *pdev = of_find_device_by_node(np);
|
||||
int ret;
|
||||
|
||||
if (!pdev)
|
||||
return ERR_PTR(-ENODEV);
|
||||
return -ENODEV;
|
||||
|
||||
ret = nvmem_get_mac_address(&pdev->dev, &nvmem_mac);
|
||||
if (ret) {
|
||||
put_device(&pdev->dev);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
mac = devm_kmemdup(&pdev->dev, nvmem_mac, ETH_ALEN, GFP_KERNEL);
|
||||
ret = nvmem_get_mac_address(&pdev->dev, addr);
|
||||
put_device(&pdev->dev);
|
||||
if (!mac)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
return mac;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -98,24 +90,27 @@ static const void *of_get_mac_addr_nvmem(struct device_node *np)
|
|||
* this case, the real MAC is in 'local-mac-address', and 'mac-address' exists
|
||||
* but is all zeros.
|
||||
*
|
||||
* Return: Will be a valid pointer on success and ERR_PTR in case of error.
|
||||
* Return: 0 on success and errno in case of error.
|
||||
*/
|
||||
const void *of_get_mac_address(struct device_node *np)
|
||||
int of_get_mac_address(struct device_node *np, u8 *addr)
|
||||
{
|
||||
const void *addr;
|
||||
int ret;
|
||||
|
||||
addr = of_get_mac_addr(np, "mac-address");
|
||||
if (addr)
|
||||
return addr;
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
|
||||
addr = of_get_mac_addr(np, "local-mac-address");
|
||||
if (addr)
|
||||
return addr;
|
||||
ret = of_get_mac_addr(np, "mac-address", addr);
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
||||
addr = of_get_mac_addr(np, "address");
|
||||
if (addr)
|
||||
return addr;
|
||||
ret = of_get_mac_addr(np, "local-mac-address", addr);
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
||||
return of_get_mac_addr_nvmem(np);
|
||||
ret = of_get_mac_addr(np, "address", addr);
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
||||
return of_get_mac_addr_nvmem(np, addr);
|
||||
}
|
||||
EXPORT_SYMBOL(of_get_mac_address);
|
||||
|
|
|
@ -407,14 +407,10 @@ static int cvm_oct_common_set_mac_address(struct net_device *dev, void *addr)
|
|||
int cvm_oct_common_init(struct net_device *dev)
|
||||
{
|
||||
struct octeon_ethernet *priv = netdev_priv(dev);
|
||||
const u8 *mac = NULL;
|
||||
int ret;
|
||||
|
||||
if (priv->of_node)
|
||||
mac = of_get_mac_address(priv->of_node);
|
||||
|
||||
if (!IS_ERR_OR_NULL(mac))
|
||||
ether_addr_copy(dev->dev_addr, mac);
|
||||
else
|
||||
ret = of_get_mac_address(priv->of_node, dev->dev_addr);
|
||||
if (ret)
|
||||
eth_hw_addr_random(dev);
|
||||
|
||||
/*
|
||||
|
|
|
@ -339,7 +339,6 @@ int wfx_probe(struct wfx_dev *wdev)
|
|||
{
|
||||
int i;
|
||||
int err;
|
||||
const void *macaddr;
|
||||
struct gpio_desc *gpio_saved;
|
||||
|
||||
// During first part of boot, gpio_wakeup cannot yet been used. So
|
||||
|
@ -428,9 +427,9 @@ int wfx_probe(struct wfx_dev *wdev)
|
|||
|
||||
for (i = 0; i < ARRAY_SIZE(wdev->addresses); i++) {
|
||||
eth_zero_addr(wdev->addresses[i].addr);
|
||||
macaddr = of_get_mac_address(wdev->dev->of_node);
|
||||
if (!IS_ERR_OR_NULL(macaddr)) {
|
||||
ether_addr_copy(wdev->addresses[i].addr, macaddr);
|
||||
err = of_get_mac_address(wdev->dev->of_node,
|
||||
wdev->addresses[i].addr);
|
||||
if (!err) {
|
||||
wdev->addresses[i].addr[ETH_ALEN - 1] += i;
|
||||
} else {
|
||||
ether_addr_copy(wdev->addresses[i].addr,
|
||||
|
|
|
@ -1023,6 +1023,8 @@ struct ieee80211_tpc_report_ie {
|
|||
#define IEEE80211_ADDBA_EXT_FRAG_LEVEL_MASK GENMASK(2, 1)
|
||||
#define IEEE80211_ADDBA_EXT_FRAG_LEVEL_SHIFT 1
|
||||
#define IEEE80211_ADDBA_EXT_NO_FRAG BIT(0)
|
||||
#define IEEE80211_ADDBA_EXT_BUF_SIZE_MASK GENMASK(7, 5)
|
||||
#define IEEE80211_ADDBA_EXT_BUF_SIZE_SHIFT 10
|
||||
|
||||
struct ieee80211_addba_ext_ie {
|
||||
u8 data;
|
||||
|
@ -1650,11 +1652,12 @@ struct ieee80211_ht_operation {
|
|||
* A-MPDU buffer sizes
|
||||
* According to HT size varies from 8 to 64 frames
|
||||
* HE adds the ability to have up to 256 frames.
|
||||
* EHT adds the ability to have up to 1K frames.
|
||||
*/
|
||||
#define IEEE80211_MIN_AMPDU_BUF 0x8
|
||||
#define IEEE80211_MAX_AMPDU_BUF_HT 0x40
|
||||
#define IEEE80211_MAX_AMPDU_BUF 0x100
|
||||
|
||||
#define IEEE80211_MAX_AMPDU_BUF_HE 0x100
|
||||
#define IEEE80211_MAX_AMPDU_BUF_EHT 0x400
|
||||
|
||||
/* Spatial Multiplexing Power Save Modes (for capability) */
|
||||
#define WLAN_HT_CAP_SM_PS_STATIC 0
|
||||
|
@ -2005,24 +2008,23 @@ int ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *cap,
|
|||
* A-MDPU Length Exponent field in the HT capabilities, VHT capabilities and the
|
||||
* same field in the HE capabilities.
|
||||
*/
|
||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_USE_VHT 0x00
|
||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_1 0x08
|
||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2 0x10
|
||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED 0x18
|
||||
|
||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_0 0x00
|
||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_1 0x08
|
||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2 0x10
|
||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3 0x18
|
||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK 0x18
|
||||
#define IEEE80211_HE_MAC_CAP3_AMSDU_FRAG 0x20
|
||||
#define IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED 0x40
|
||||
#define IEEE80211_HE_MAC_CAP3_RX_CTRL_FRAME_TO_MULTIBSS 0x80
|
||||
|
||||
#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_SHIFT 3
|
||||
|
||||
#define IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG 0x01
|
||||
#define IEEE80211_HE_MAC_CAP4_QTP 0x02
|
||||
#define IEEE80211_HE_MAC_CAP4_BQR 0x04
|
||||
#define IEEE80211_HE_MAC_CAP4_SRP_RESP 0x08
|
||||
#define IEEE80211_HE_MAC_CAP4_PSR_RESP 0x08
|
||||
#define IEEE80211_HE_MAC_CAP4_NDP_FB_REP 0x10
|
||||
#define IEEE80211_HE_MAC_CAP4_OPS 0x20
|
||||
#define IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU 0x40
|
||||
#define IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU 0x40
|
||||
/* Multi TID agg TX is split between byte #4 and #5
|
||||
* The value is a combination of B39,B40,B41
|
||||
*/
|
||||
|
@ -2030,7 +2032,7 @@ int ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *cap,
|
|||
|
||||
#define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B40 0x01
|
||||
#define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B41 0x02
|
||||
#define IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECVITE_TRANSMISSION 0x04
|
||||
#define IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION 0x04
|
||||
#define IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU 0x08
|
||||
#define IEEE80211_HE_MAC_CAP5_OM_CTRL_UL_MU_DATA_DIS_RX 0x10
|
||||
#define IEEE80211_HE_MAC_CAP5_HE_DYNAMIC_SM_PS 0x20
|
||||
|
@ -2088,7 +2090,7 @@ int ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *cap,
|
|||
#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK 0x18
|
||||
#define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_1 0x00
|
||||
#define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_2 0x20
|
||||
#define IEEE80211_HE_PHY_CAP3_RX_HE_MU_PPDU_FROM_NON_AP_STA 0x40
|
||||
#define IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU 0x40
|
||||
#define IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER 0x80
|
||||
|
||||
#define IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE 0x01
|
||||
|
@ -2135,15 +2137,15 @@ int ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *cap,
|
|||
|
||||
#define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_42_SU 0x01
|
||||
#define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU 0x02
|
||||
#define IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMER_FB 0x04
|
||||
#define IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB 0x08
|
||||
#define IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB 0x04
|
||||
#define IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB 0x08
|
||||
#define IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB 0x10
|
||||
#define IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE 0x20
|
||||
#define IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO 0x40
|
||||
#define IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT 0x80
|
||||
|
||||
#define IEEE80211_HE_PHY_CAP7_SRP_BASED_SR 0x01
|
||||
#define IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR 0x02
|
||||
#define IEEE80211_HE_PHY_CAP7_PSR_BASED_SR 0x01
|
||||
#define IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP 0x02
|
||||
#define IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI 0x04
|
||||
#define IEEE80211_HE_PHY_CAP7_MAX_NC_1 0x08
|
||||
#define IEEE80211_HE_PHY_CAP7_MAX_NC_2 0x10
|
||||
|
@ -2174,11 +2176,12 @@ int ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *cap,
|
|||
#define IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU 0x08
|
||||
#define IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB 0x10
|
||||
#define IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB 0x20
|
||||
#define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_0US 0x00
|
||||
#define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_8US 0x40
|
||||
#define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_16US 0x80
|
||||
#define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_RESERVED 0xc0
|
||||
#define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_MASK 0xc0
|
||||
#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_0US 0x0
|
||||
#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_8US 0x1
|
||||
#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US 0x2
|
||||
#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED 0x3
|
||||
#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_POS 6
|
||||
#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK 0xc0
|
||||
|
||||
/* 802.11ax HE TX/RX MCS NSS Support */
|
||||
#define IEEE80211_TX_RX_MCS_NSS_SUPP_HIGHEST_MCS_POS (3)
|
||||
|
|
|
@ -353,6 +353,7 @@ struct napi_struct {
|
|||
struct list_head dev_list;
|
||||
struct hlist_node napi_hash_node;
|
||||
unsigned int napi_id;
|
||||
struct task_struct *thread;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
|
@ -368,6 +369,8 @@ enum {
|
|||
NAPI_STATE_LISTED, /* NAPI added to system lists */
|
||||
NAPI_STATE_NO_BUSY_POLL,/* Do not add in napi_hash, no busy polling */
|
||||
NAPI_STATE_IN_BUSY_POLL,/* sk_busy_loop() owns this NAPI */
|
||||
NAPI_STATE_THREADED, /* The poll is performed inside its own thread*/
|
||||
NAPI_STATE_SCHED_THREADED, /* Napi is currently scheduled in threaded mode */
|
||||
};
|
||||
|
||||
enum {
|
||||
|
@ -378,6 +381,8 @@ enum {
|
|||
NAPIF_STATE_LISTED = BIT(NAPI_STATE_LISTED),
|
||||
NAPIF_STATE_NO_BUSY_POLL = BIT(NAPI_STATE_NO_BUSY_POLL),
|
||||
NAPIF_STATE_IN_BUSY_POLL = BIT(NAPI_STATE_IN_BUSY_POLL),
|
||||
NAPIF_STATE_THREADED = BIT(NAPI_STATE_THREADED),
|
||||
NAPIF_STATE_SCHED_THREADED = BIT(NAPI_STATE_SCHED_THREADED),
|
||||
};
|
||||
|
||||
enum gro_result {
|
||||
|
@ -499,6 +504,8 @@ static inline bool napi_complete(struct napi_struct *n)
|
|||
return napi_complete_done(n, 0);
|
||||
}
|
||||
|
||||
int dev_set_threaded(struct net_device *dev, bool threaded);
|
||||
|
||||
/**
|
||||
* napi_disable - prevent NAPI from scheduling
|
||||
* @n: NAPI context
|
||||
|
@ -508,20 +515,7 @@ static inline bool napi_complete(struct napi_struct *n)
|
|||
*/
|
||||
void napi_disable(struct napi_struct *n);
|
||||
|
||||
/**
|
||||
* napi_enable - enable NAPI scheduling
|
||||
* @n: NAPI context
|
||||
*
|
||||
* Resume NAPI from being scheduled on this context.
|
||||
* Must be paired with napi_disable.
|
||||
*/
|
||||
static inline void napi_enable(struct napi_struct *n)
|
||||
{
|
||||
BUG_ON(!test_bit(NAPI_STATE_SCHED, &n->state));
|
||||
smp_mb__before_atomic();
|
||||
clear_bit(NAPI_STATE_SCHED, &n->state);
|
||||
clear_bit(NAPI_STATE_NPSVC, &n->state);
|
||||
}
|
||||
void napi_enable(struct napi_struct *n);
|
||||
|
||||
/**
|
||||
* napi_synchronize - wait until NAPI is not running
|
||||
|
@ -1893,6 +1887,8 @@ enum netdev_ml_priv_type {
|
|||
*
|
||||
* @wol_enabled: Wake-on-LAN is enabled
|
||||
*
|
||||
* @threaded: napi threaded mode is enabled
|
||||
*
|
||||
* @net_notifier_list: List of per-net netdev notifier block
|
||||
* that follow this device when it is moved
|
||||
* to another network namespace.
|
||||
|
@ -2209,6 +2205,7 @@ struct net_device {
|
|||
struct lock_class_key *qdisc_running_key;
|
||||
bool proto_down;
|
||||
unsigned wol_enabled:1;
|
||||
unsigned threaded:1;
|
||||
|
||||
struct list_head net_notifier_list;
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
struct net_device;
|
||||
extern int of_get_phy_mode(struct device_node *np, phy_interface_t *interface);
|
||||
extern const void *of_get_mac_address(struct device_node *np);
|
||||
extern int of_get_mac_address(struct device_node *np, u8 *mac);
|
||||
extern struct net_device *of_find_net_device_by_node(struct device_node *np);
|
||||
#else
|
||||
static inline int of_get_phy_mode(struct device_node *np,
|
||||
|
@ -22,9 +22,9 @@ static inline int of_get_phy_mode(struct device_node *np,
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline const void *of_get_mac_address(struct device_node *np)
|
||||
static inline int of_get_mac_address(struct device_node *np, u8 *mac)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline struct net_device *of_find_net_device_by_node(struct device_node *np)
|
||||
|
|
131
include/linux/soc/mediatek/mtk_wed.h
Normal file
131
include/linux/soc/mediatek/mtk_wed.h
Normal file
|
@ -0,0 +1,131 @@
|
|||
#ifndef __MTK_WED_H
|
||||
#define __MTK_WED_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#define MTK_WED_TX_QUEUES 2
|
||||
|
||||
struct mtk_wed_hw;
|
||||
struct mtk_wdma_desc;
|
||||
|
||||
struct mtk_wed_ring {
|
||||
struct mtk_wdma_desc *desc;
|
||||
dma_addr_t desc_phys;
|
||||
int size;
|
||||
|
||||
u32 reg_base;
|
||||
void __iomem *wpdma;
|
||||
};
|
||||
|
||||
struct mtk_wed_device {
|
||||
#ifdef CONFIG_NET_MEDIATEK_SOC_WED
|
||||
const struct mtk_wed_ops *ops;
|
||||
struct device *dev;
|
||||
struct mtk_wed_hw *hw;
|
||||
bool init_done, running;
|
||||
int wdma_idx;
|
||||
int irq;
|
||||
|
||||
struct mtk_wed_ring tx_ring[MTK_WED_TX_QUEUES];
|
||||
struct mtk_wed_ring txfree_ring;
|
||||
struct mtk_wed_ring tx_wdma[MTK_WED_TX_QUEUES];
|
||||
|
||||
struct {
|
||||
int size;
|
||||
void **pages;
|
||||
struct mtk_wdma_desc *desc;
|
||||
dma_addr_t desc_phys;
|
||||
} buf_ring;
|
||||
|
||||
/* filled by driver: */
|
||||
struct {
|
||||
struct pci_dev *pci_dev;
|
||||
|
||||
u32 wpdma_phys;
|
||||
|
||||
u16 token_start;
|
||||
unsigned int nbuf;
|
||||
|
||||
u32 (*init_buf)(void *ptr, dma_addr_t phys, int token_id);
|
||||
int (*offload_enable)(struct mtk_wed_device *wed);
|
||||
void (*offload_disable)(struct mtk_wed_device *wed);
|
||||
} wlan;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct mtk_wed_ops {
|
||||
int (*attach)(struct mtk_wed_device *dev);
|
||||
int (*tx_ring_setup)(struct mtk_wed_device *dev, int ring,
|
||||
void __iomem *regs);
|
||||
int (*txfree_ring_setup)(struct mtk_wed_device *dev,
|
||||
void __iomem *regs);
|
||||
void (*detach)(struct mtk_wed_device *dev);
|
||||
|
||||
void (*stop)(struct mtk_wed_device *dev);
|
||||
void (*start)(struct mtk_wed_device *dev, u32 irq_mask);
|
||||
void (*reset_dma)(struct mtk_wed_device *dev);
|
||||
|
||||
u32 (*reg_read)(struct mtk_wed_device *dev, u32 reg);
|
||||
void (*reg_write)(struct mtk_wed_device *dev, u32 reg, u32 val);
|
||||
|
||||
u32 (*irq_get)(struct mtk_wed_device *dev, u32 mask);
|
||||
void (*irq_set_mask)(struct mtk_wed_device *dev, u32 mask);
|
||||
};
|
||||
|
||||
extern const struct mtk_wed_ops __rcu *mtk_soc_wed_ops;
|
||||
|
||||
static inline int
|
||||
mtk_wed_device_attach(struct mtk_wed_device *dev)
|
||||
{
|
||||
int ret = -ENODEV;
|
||||
|
||||
#ifdef CONFIG_NET_MEDIATEK_SOC_WED
|
||||
rcu_read_lock();
|
||||
dev->ops = rcu_dereference(mtk_soc_wed_ops);
|
||||
if (dev->ops)
|
||||
ret = dev->ops->attach(dev);
|
||||
else
|
||||
rcu_read_unlock();
|
||||
|
||||
if (ret)
|
||||
dev->ops = NULL;
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NET_MEDIATEK_SOC_WED
|
||||
#define mtk_wed_device_active(_dev) !!(_dev)->ops
|
||||
#define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev)
|
||||
#define mtk_wed_device_start(_dev, _mask) (_dev)->ops->start(_dev, _mask)
|
||||
#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) \
|
||||
(_dev)->ops->tx_ring_setup(_dev, _ring, _regs)
|
||||
#define mtk_wed_device_txfree_ring_setup(_dev, _regs) \
|
||||
(_dev)->ops->txfree_ring_setup(_dev, _regs)
|
||||
#define mtk_wed_device_reg_read(_dev, _reg) \
|
||||
(_dev)->ops->reg_read(_dev, _reg)
|
||||
#define mtk_wed_device_reg_write(_dev, _reg, _val) \
|
||||
(_dev)->ops->reg_write(_dev, _reg, _val)
|
||||
#define mtk_wed_device_irq_get(_dev, _mask) \
|
||||
(_dev)->ops->irq_get(_dev, _mask)
|
||||
#define mtk_wed_device_irq_set_mask(_dev, _mask) \
|
||||
(_dev)->ops->irq_set_mask(_dev, _mask)
|
||||
#else
|
||||
static inline bool mtk_wed_device_active(struct mtk_wed_device *dev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#define mtk_wed_device_detach(_dev) do {} while (0)
|
||||
#define mtk_wed_device_start(_dev, _mask) do {} while (0)
|
||||
#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) -ENODEV
|
||||
#define mtk_wed_device_txfree_ring_setup(_dev, _ring, _regs) -ENODEV
|
||||
#define mtk_wed_device_reg_read(_dev, _reg) 0
|
||||
#define mtk_wed_device_reg_write(_dev, _reg, _val) do {} while (0)
|
||||
#define mtk_wed_device_irq_get(_dev, _mask) 0
|
||||
#define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0)
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -1759,6 +1759,53 @@ struct station_info {
|
|||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cfg80211_sar_sub_specs - sub specs limit
|
||||
* @power: power limitation in 0.25dbm
|
||||
* @freq_range_index: index the power limitation applies to
|
||||
*/
|
||||
struct cfg80211_sar_sub_specs {
|
||||
s32 power;
|
||||
u32 freq_range_index;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cfg80211_sar_specs - sar limit specs
|
||||
* @type: it's set with power in 0.25dbm or other types
|
||||
* @num_sub_specs: number of sar sub specs
|
||||
* @sub_specs: memory to hold the sar sub specs
|
||||
*/
|
||||
struct cfg80211_sar_specs {
|
||||
enum nl80211_sar_type type;
|
||||
u32 num_sub_specs;
|
||||
struct cfg80211_sar_sub_specs sub_specs[];
|
||||
};
|
||||
|
||||
/**
|
||||
* @struct cfg80211_sar_chan_ranges - sar frequency ranges
|
||||
* @start_freq: start range edge frequency
|
||||
* @end_freq: end range edge frequency
|
||||
*/
|
||||
struct cfg80211_sar_freq_ranges {
|
||||
u32 start_freq;
|
||||
u32 end_freq;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cfg80211_sar_capa - sar limit capability
|
||||
* @type: it's set via power in 0.25dbm or other types
|
||||
* @num_freq_ranges: number of frequency ranges
|
||||
* @freq_ranges: memory to hold the freq ranges.
|
||||
*
|
||||
* Note: WLAN driver may append new ranges or split an existing
|
||||
* range to small ones and then append them.
|
||||
*/
|
||||
struct cfg80211_sar_capa {
|
||||
enum nl80211_sar_type type;
|
||||
u32 num_freq_ranges;
|
||||
const struct cfg80211_sar_freq_ranges *freq_ranges;
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_CFG80211)
|
||||
/**
|
||||
* cfg80211_get_station - retrieve information about a given station
|
||||
|
@ -4301,6 +4348,8 @@ struct cfg80211_ops {
|
|||
struct cfg80211_tid_config *tid_conf);
|
||||
int (*reset_tid_config)(struct wiphy *wiphy, struct net_device *dev,
|
||||
const u8 *peer, u8 tids);
|
||||
int (*set_sar_specs)(struct wiphy *wiphy,
|
||||
struct cfg80211_sar_specs *sar);
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
ANDROID_KABI_RESERVE(3);
|
||||
|
@ -4939,6 +4988,7 @@ struct wiphy_iftype_akm_suites {
|
|||
* %NL80211_TID_CONFIG_ATTR_RETRY_LONG attributes
|
||||
*/
|
||||
struct wiphy {
|
||||
u16 mbssid_max_interfaces;
|
||||
/* assign these fields before you register the wiphy */
|
||||
|
||||
u8 perm_addr[ETH_ALEN];
|
||||
|
@ -5075,6 +5125,8 @@ struct wiphy {
|
|||
|
||||
u8 max_data_retry_count;
|
||||
|
||||
const struct cfg80211_sar_capa *sar_capa;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
|
||||
char priv[] __aligned(NETDEV_ALIGN);
|
||||
|
@ -6400,6 +6452,7 @@ cfg80211_chandef_to_scan_width(const struct cfg80211_chan_def *chandef)
|
|||
* @dev: network device
|
||||
* @buf: authentication frame (header + body)
|
||||
* @len: length of the frame data
|
||||
* @reconnect: immediate reconnect is desired (include the nl80211 attribute)
|
||||
*
|
||||
* This function is called whenever an authentication, disassociation or
|
||||
* deauthentication frame has been received and processed in station mode.
|
||||
|
@ -6480,7 +6533,8 @@ void cfg80211_abandon_assoc(struct net_device *dev, struct cfg80211_bss *bss);
|
|||
* locally generated ones. This function may sleep. The caller must hold the
|
||||
* corresponding wdev's mutex.
|
||||
*/
|
||||
void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len);
|
||||
void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len,
|
||||
bool reconnect);
|
||||
|
||||
/**
|
||||
* cfg80211_rx_unprot_mlme_mgmt - notification of unprotected mlme mgmt frame
|
||||
|
|
|
@ -208,7 +208,7 @@ struct dsa_port {
|
|||
unsigned int index;
|
||||
const char *name;
|
||||
struct dsa_port *cpu_dp;
|
||||
const char *mac;
|
||||
u8 mac[ETH_ALEN];
|
||||
struct device_node *dn;
|
||||
unsigned int ageing_time;
|
||||
bool vlan_filtering;
|
||||
|
|
|
@ -1124,20 +1124,41 @@ ieee80211_info_get_tx_time_est(struct ieee80211_tx_info *info)
|
|||
return info->tx_time_est << 2;
|
||||
}
|
||||
|
||||
/***
|
||||
* struct ieee80211_rate_status - mrr stage for status path
|
||||
*
|
||||
* This struct is used in struct ieee80211_tx_status to provide drivers a
|
||||
* dynamic way to report about used rates and power levels per packet.
|
||||
*
|
||||
* @rate_idx The actual used rate.
|
||||
* @try_count How often the rate was tried.
|
||||
* @tx_power_idx An idx into the ieee80211_hw->tx_power_levels list of the
|
||||
* corresponding wifi hardware. The idx shall point to the power level
|
||||
* that was used when sending the packet.
|
||||
*/
|
||||
struct ieee80211_rate_status {
|
||||
struct rate_info rate_idx;
|
||||
u8 try_count;
|
||||
u8 tx_power_idx;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_tx_status - extended tx status info for rate control
|
||||
*
|
||||
* @sta: Station that the packet was transmitted for
|
||||
* @info: Basic tx status information
|
||||
* @skb: Packet skb (can be NULL if not provided by the driver)
|
||||
* @rate: The TX rate that was used when sending the packet
|
||||
* @rates: Mrr stages that were used when sending the packet
|
||||
* @n_rates: Number of mrr stages (count of instances for @rates)
|
||||
* @free_list: list where processed skbs are stored to be free'd by the driver
|
||||
*/
|
||||
struct ieee80211_tx_status {
|
||||
struct ieee80211_sta *sta;
|
||||
struct ieee80211_tx_info *info;
|
||||
struct sk_buff *skb;
|
||||
struct rate_info *rate;
|
||||
struct ieee80211_rate_status *rates;
|
||||
u8 n_rates;
|
||||
|
||||
struct list_head *free_list;
|
||||
};
|
||||
|
||||
|
@ -1299,6 +1320,8 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
|
|||
* the "0-length PSDU" field included there. The value for it is
|
||||
* in &struct ieee80211_rx_status. Note that if this value isn't
|
||||
* known the frame shouldn't be reported.
|
||||
* @RX_FLAG_8023: the frame has an 802.3 header (decap offload performed by
|
||||
* hardware or driver)
|
||||
*/
|
||||
enum mac80211_rx_flags {
|
||||
RX_FLAG_MMIC_ERROR = BIT(0),
|
||||
|
@ -1331,6 +1354,7 @@ enum mac80211_rx_flags {
|
|||
RX_FLAG_RADIOTAP_HE_MU = BIT(27),
|
||||
RX_FLAG_RADIOTAP_LSIG = BIT(28),
|
||||
RX_FLAG_NO_PSDU = BIT(29),
|
||||
RX_FLAG_8023 = BIT(30),
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -1654,11 +1678,15 @@ enum ieee80211_vif_flags {
|
|||
* The driver supports sending frames passed as 802.3 frames by mac80211.
|
||||
* It must also support sending 802.11 packets for the same interface.
|
||||
* @IEEE80211_OFFLOAD_ENCAP_4ADDR: support 4-address mode encapsulation offload
|
||||
* @IEEE80211_OFFLOAD_DECAP_ENABLED: rx encapsulation offload is enabled
|
||||
* The driver supports passing received 802.11 frames as 802.3 frames to
|
||||
* mac80211.
|
||||
*/
|
||||
|
||||
enum ieee80211_offload_flags {
|
||||
IEEE80211_OFFLOAD_ENCAP_ENABLED = BIT(0),
|
||||
IEEE80211_OFFLOAD_ENCAP_4ADDR = BIT(1),
|
||||
IEEE80211_OFFLOAD_DECAP_ENABLED = BIT(2),
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -2398,6 +2426,9 @@ struct ieee80211_txq {
|
|||
* @IEEE80211_HW_SUPPORTS_TX_ENCAP_OFFLOAD: Hardware supports tx encapsulation
|
||||
* offload
|
||||
*
|
||||
* @IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD: Hardware supports rx decapsulation
|
||||
* offload
|
||||
*
|
||||
* @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
|
||||
*/
|
||||
enum ieee80211_hw_flags {
|
||||
|
@ -2451,6 +2482,7 @@ enum ieee80211_hw_flags {
|
|||
IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID,
|
||||
IEEE80211_HW_AMPDU_KEYBORDER_SUPPORT,
|
||||
IEEE80211_HW_SUPPORTS_TX_ENCAP_OFFLOAD,
|
||||
IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD,
|
||||
|
||||
/* keep last, obviously */
|
||||
NUM_IEEE80211_HW_FLAGS
|
||||
|
@ -2580,6 +2612,12 @@ enum ieee80211_hw_flags {
|
|||
* refilling deficit of each TXQ.
|
||||
*
|
||||
* @max_mtu: the max mtu could be set.
|
||||
*
|
||||
* @tx_power_levels: a list of power levels supported by the wifi hardware.
|
||||
* The power levels can be specified either as integer or fractions.
|
||||
* The power level at idx 0 shall be the maximum positive power level.
|
||||
*
|
||||
* @max_txpwr_levels_idx: the maximum valid idx of 'tx_power_levels' list.
|
||||
*/
|
||||
struct ieee80211_hw {
|
||||
struct ieee80211_conf conf;
|
||||
|
@ -2618,6 +2656,8 @@ struct ieee80211_hw {
|
|||
u8 tx_sk_pacing_shift;
|
||||
u8 weight_multiplier;
|
||||
u32 max_mtu;
|
||||
const s8 *tx_power_levels;
|
||||
u8 max_txpwr_levels_idx;
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
};
|
||||
|
@ -4206,6 +4246,11 @@ struct ieee80211_ops {
|
|||
struct ieee80211_vif *vif);
|
||||
void (*sta_set_4addr)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, bool enabled);
|
||||
int (*set_sar_specs)(struct ieee80211_hw *hw,
|
||||
const struct cfg80211_sar_specs *sar);
|
||||
void (*sta_set_decap_offload)(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, bool enabled);
|
||||
|
||||
ANDROID_KABI_RESERVE(1);
|
||||
ANDROID_KABI_RESERVE(2);
|
||||
|
@ -4863,6 +4908,7 @@ struct ieee80211_mutable_offsets {
|
|||
u16 tim_offset;
|
||||
u16 tim_length;
|
||||
|
||||
u16 mbssid_off;
|
||||
u16 cntdwn_counter_offs[IEEE80211_MAX_CNTDWN_COUNTERS_NUM];
|
||||
};
|
||||
|
||||
|
@ -5895,6 +5941,17 @@ void ieee80211_beacon_loss(struct ieee80211_vif *vif);
|
|||
*/
|
||||
void ieee80211_connection_loss(struct ieee80211_vif *vif);
|
||||
|
||||
/**
|
||||
* ieee80211_disconnect - request disconnection
|
||||
*
|
||||
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
||||
* @reconnect: immediate reconnect is desired
|
||||
*
|
||||
* Request disconnection from the current network and, if enabled, send a
|
||||
* hint to the higher layers that immediate reconnect is desired.
|
||||
*/
|
||||
void ieee80211_disconnect(struct ieee80211_vif *vif, bool reconnect);
|
||||
|
||||
/**
|
||||
* ieee80211_resume_disconnect - disconnect from AP after resume
|
||||
*
|
||||
|
|
|
@ -655,6 +655,9 @@
|
|||
* When a security association was established on an 802.1X network using
|
||||
* fast transition, this event should be followed by an
|
||||
* %NL80211_CMD_PORT_AUTHORIZED event.
|
||||
* Following a %NL80211_CMD_ROAM event userspace can issue
|
||||
* %NL80211_CMD_GET_SCAN in order to obtain the scan information for the
|
||||
* new BSS the card/driver roamed to.
|
||||
* @NL80211_CMD_DISCONNECT: drop a given connection; also used to notify
|
||||
* userspace that a connection was dropped by the AP or due to other
|
||||
* reasons, for this the %NL80211_ATTR_DISCONNECTED_BY_AP and
|
||||
|
@ -757,7 +760,8 @@
|
|||
* of any other interfaces, and other interfaces will again take
|
||||
* precedence when they are used.
|
||||
*
|
||||
* @NL80211_CMD_SET_WDS_PEER: Set the MAC address of the peer on a WDS interface.
|
||||
* @NL80211_CMD_SET_WDS_PEER: Set the MAC address of the peer on a WDS interface
|
||||
* (no longer supported).
|
||||
*
|
||||
* @NL80211_CMD_SET_MULTICAST_TO_UNICAST: Configure if this AP should perform
|
||||
* multicast to unicast conversion. When enabled, all multicast packets
|
||||
|
@ -1177,6 +1181,10 @@
|
|||
* includes the contents of the frame. %NL80211_ATTR_ACK flag is included
|
||||
* if the recipient acknowledged the frame.
|
||||
*
|
||||
* @NL80211_CMD_SET_SAR_SPECS: SAR power limitation configuration is
|
||||
* passed using %NL80211_ATTR_SAR_SPEC. %NL80211_ATTR_WIPHY is used to
|
||||
* specify the wiphy index to be applied to.
|
||||
*
|
||||
* @NL80211_CMD_MAX: highest used command number
|
||||
* @__NL80211_CMD_AFTER_LAST: internal use
|
||||
*/
|
||||
|
@ -1407,6 +1415,8 @@ enum nl80211_commands {
|
|||
|
||||
NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS,
|
||||
|
||||
NL80211_CMD_SET_SAR_SPECS,
|
||||
|
||||
/* add new commands above here */
|
||||
|
||||
/* used to define NL80211_CMD_MAX below */
|
||||
|
@ -1750,8 +1760,9 @@ enum nl80211_commands {
|
|||
* specify just a single bitrate, which is to be used for the beacon.
|
||||
* The driver must also specify support for this with the extended
|
||||
* features NL80211_EXT_FEATURE_BEACON_RATE_LEGACY,
|
||||
* NL80211_EXT_FEATURE_BEACON_RATE_HT and
|
||||
* NL80211_EXT_FEATURE_BEACON_RATE_VHT.
|
||||
* NL80211_EXT_FEATURE_BEACON_RATE_HT,
|
||||
* NL80211_EXT_FEATURE_BEACON_RATE_VHT and
|
||||
* NL80211_EXT_FEATURE_BEACON_RATE_HE.
|
||||
*
|
||||
* @NL80211_ATTR_FRAME_MATCH: A binary attribute which typically must contain
|
||||
* at least one byte, currently used with @NL80211_CMD_REGISTER_FRAME.
|
||||
|
@ -1955,8 +1966,15 @@ enum nl80211_commands {
|
|||
* @NL80211_ATTR_PROBE_RESP: Probe Response template data. Contains the entire
|
||||
* probe-response frame. The DA field in the 802.11 header is zero-ed out,
|
||||
* to be filled by the FW.
|
||||
* @NL80211_ATTR_DISABLE_HT: Force HT capable interfaces to disable
|
||||
* this feature. Currently, only supported in mac80211 drivers.
|
||||
* @NL80211_ATTR_DISABLE_HT: Force HT capable interfaces to disable
|
||||
* this feature during association. This is a flag attribute.
|
||||
* Currently only supported in mac80211 drivers.
|
||||
* @NL80211_ATTR_DISABLE_VHT: Force VHT capable interfaces to disable
|
||||
* this feature during association. This is a flag attribute.
|
||||
* Currently only supported in mac80211 drivers.
|
||||
* @NL80211_ATTR_DISABLE_HE: Force HE capable interfaces to disable
|
||||
* this feature during association. This is a flag attribute.
|
||||
* Currently only supported in mac80211 drivers.
|
||||
* @NL80211_ATTR_HT_CAPABILITY_MASK: Specify which bits of the
|
||||
* ATTR_HT_CAPABILITY to which attention should be paid.
|
||||
* Currently, only mac80211 NICs support this feature.
|
||||
|
@ -2077,7 +2095,8 @@ enum nl80211_commands {
|
|||
* until the channel switch event.
|
||||
* @NL80211_ATTR_CH_SWITCH_BLOCK_TX: flag attribute specifying that transmission
|
||||
* must be blocked on the current channel (before the channel switch
|
||||
* operation).
|
||||
* operation). Also included in the channel switch started event if quiet
|
||||
* was requested by the AP.
|
||||
* @NL80211_ATTR_CSA_IES: Nested set of attributes containing the IE information
|
||||
* for the time while performing a channel switch.
|
||||
* @NL80211_ATTR_CNTDWN_OFFS_BEACON: An array of offsets (u16) to the channel
|
||||
|
@ -2532,6 +2551,15 @@ enum nl80211_commands {
|
|||
* This is a u8 attribute that encapsulates one of the values from
|
||||
* &enum nl80211_sae_pwe_mechanism.
|
||||
*
|
||||
* @NL80211_ATTR_SAR_SPEC: SAR power limitation specification when
|
||||
* used with %NL80211_CMD_SET_SAR_SPECS. The message contains fields
|
||||
* of %nl80211_sar_attrs which specifies the sar type and related
|
||||
* sar specs. Sar specs contains array of %nl80211_sar_specs_attrs.
|
||||
*
|
||||
* @NL80211_ATTR_RECONNECT_REQUESTED: flag attribute, used with deauth and
|
||||
* disassoc events to indicate that an immediate reconnect to the AP
|
||||
* is desired.
|
||||
*
|
||||
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
|
||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
|
@ -3023,6 +3051,12 @@ enum nl80211_attrs {
|
|||
|
||||
NL80211_ATTR_SAE_PWE,
|
||||
|
||||
NL80211_ATTR_RECONNECT_REQUESTED,
|
||||
|
||||
NL80211_ATTR_SAR_SPEC,
|
||||
|
||||
NL80211_ATTR_DISABLE_HE,
|
||||
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
|
@ -5903,6 +5937,19 @@ enum nl80211_feature_flags {
|
|||
* @NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP: Driver/device supports
|
||||
* unsolicited broadcast probe response transmission
|
||||
*
|
||||
* @NL80211_EXT_FEATURE_BEACON_RATE_HE: Driver supports beacon rate
|
||||
* configuration (AP/mesh) with HE rates.
|
||||
*
|
||||
* @NL80211_EXT_FEATURE_SECURE_LTF: Device supports secure LTF measurement
|
||||
* exchange protocol.
|
||||
*
|
||||
* @NL80211_EXT_FEATURE_SECURE_RTT: Device supports secure RTT measurement
|
||||
* exchange protocol.
|
||||
*
|
||||
* @NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE: Device supports management
|
||||
* frame protection for all management frames exchanged during the
|
||||
* negotiation and range measurement procedure.
|
||||
*
|
||||
* @NUM_NL80211_EXT_FEATURES: number of extended features.
|
||||
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
|
||||
*/
|
||||
|
@ -5963,6 +6010,10 @@ enum nl80211_ext_feature_index {
|
|||
NL80211_EXT_FEATURE_SAE_OFFLOAD_AP,
|
||||
NL80211_EXT_FEATURE_FILS_DISCOVERY,
|
||||
NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP,
|
||||
NL80211_EXT_FEATURE_BEACON_RATE_HE,
|
||||
NL80211_EXT_FEATURE_SECURE_LTF,
|
||||
NL80211_EXT_FEATURE_SECURE_RTT,
|
||||
NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE,
|
||||
|
||||
/* add new features before the definition below */
|
||||
NUM_NL80211_EXT_FEATURES,
|
||||
|
@ -6260,11 +6311,13 @@ struct nl80211_vendor_cmd_info {
|
|||
* @NL80211_TDLS_PEER_HT: TDLS peer is HT capable.
|
||||
* @NL80211_TDLS_PEER_VHT: TDLS peer is VHT capable.
|
||||
* @NL80211_TDLS_PEER_WMM: TDLS peer is WMM capable.
|
||||
* @NL80211_TDLS_PEER_HE: TDLS peer is HE capable.
|
||||
*/
|
||||
enum nl80211_tdls_peer_capability {
|
||||
NL80211_TDLS_PEER_HT = 1<<0,
|
||||
NL80211_TDLS_PEER_VHT = 1<<1,
|
||||
NL80211_TDLS_PEER_WMM = 1<<2,
|
||||
NL80211_TDLS_PEER_HE = 1<<3,
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -6856,6 +6909,9 @@ enum nl80211_peer_measurement_ftm_capa {
|
|||
* if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor
|
||||
* %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based
|
||||
* ranging will be used.
|
||||
* @NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK: negotiate for LMR feedback. Only
|
||||
* valid if either %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED or
|
||||
* %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set.
|
||||
*
|
||||
* @NUM_NL80211_PMSR_FTM_REQ_ATTR: internal
|
||||
* @NL80211_PMSR_FTM_REQ_ATTR_MAX: highest attribute number
|
||||
|
@ -6874,6 +6930,7 @@ enum nl80211_peer_measurement_ftm_req {
|
|||
NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC,
|
||||
NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED,
|
||||
NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED,
|
||||
NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK,
|
||||
|
||||
/* keep last */
|
||||
NUM_NL80211_PMSR_FTM_REQ_ATTR,
|
||||
|
@ -7132,6 +7189,97 @@ enum nl80211_unsol_bcast_probe_resp_attributes {
|
|||
__NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_LAST - 1
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_sar_type - type of SAR specs
|
||||
*
|
||||
* @NL80211_SAR_TYPE_POWER: power limitation specified in 0.25dBm unit
|
||||
*
|
||||
*/
|
||||
enum nl80211_sar_type {
|
||||
NL80211_SAR_TYPE_POWER,
|
||||
|
||||
/* add new type here */
|
||||
|
||||
/* Keep last */
|
||||
NUM_NL80211_SAR_TYPE,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_sar_attrs - Attributes for SAR spec
|
||||
*
|
||||
* @NL80211_SAR_ATTR_TYPE: the SAR type as defined in &enum nl80211_sar_type.
|
||||
*
|
||||
* @NL80211_SAR_ATTR_SPECS: Nested array of SAR power
|
||||
* limit specifications. Each specification contains a set
|
||||
* of %nl80211_sar_specs_attrs.
|
||||
*
|
||||
* For SET operation, it contains array of %NL80211_SAR_ATTR_SPECS_POWER
|
||||
* and %NL80211_SAR_ATTR_SPECS_RANGE_INDEX.
|
||||
*
|
||||
* For sar_capa dump, it contains array of
|
||||
* %NL80211_SAR_ATTR_SPECS_START_FREQ
|
||||
* and %NL80211_SAR_ATTR_SPECS_END_FREQ.
|
||||
*
|
||||
* @__NL80211_SAR_ATTR_LAST: Internal
|
||||
* @NL80211_SAR_ATTR_MAX: highest sar attribute
|
||||
*
|
||||
* These attributes are used with %NL80211_CMD_SET_SAR_SPEC
|
||||
*/
|
||||
enum nl80211_sar_attrs {
|
||||
__NL80211_SAR_ATTR_INVALID,
|
||||
|
||||
NL80211_SAR_ATTR_TYPE,
|
||||
NL80211_SAR_ATTR_SPECS,
|
||||
|
||||
__NL80211_SAR_ATTR_LAST,
|
||||
NL80211_SAR_ATTR_MAX = __NL80211_SAR_ATTR_LAST - 1,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_sar_specs_attrs - Attributes for SAR power limit specs
|
||||
*
|
||||
* @NL80211_SAR_ATTR_SPECS_POWER: Required (s32)value to specify the actual
|
||||
* power limit value in units of 0.25 dBm if type is
|
||||
* NL80211_SAR_TYPE_POWER. (i.e., a value of 44 represents 11 dBm).
|
||||
* 0 means userspace doesn't have SAR limitation on this associated range.
|
||||
*
|
||||
* @NL80211_SAR_ATTR_SPECS_RANGE_INDEX: Required (u32) value to specify the
|
||||
* index of exported freq range table and the associated power limitation
|
||||
* is applied to this range.
|
||||
*
|
||||
* Userspace isn't required to set all the ranges advertised by WLAN driver,
|
||||
* and userspace can skip some certain ranges. These skipped ranges don't
|
||||
* have SAR limitations, and they are same as setting the
|
||||
* %NL80211_SAR_ATTR_SPECS_POWER to any unreasonable high value because any
|
||||
* value higher than regulatory allowed value just means SAR power
|
||||
* limitation is removed, but it's required to set at least one range.
|
||||
* It's not allowed to set duplicated range in one SET operation.
|
||||
*
|
||||
* Every SET operation overwrites previous SET operation.
|
||||
*
|
||||
* @NL80211_SAR_ATTR_SPECS_START_FREQ: Required (u32) value to specify the start
|
||||
* frequency of this range edge when registering SAR capability to wiphy.
|
||||
* It's not a channel center frequency. The unit is kHz.
|
||||
*
|
||||
* @NL80211_SAR_ATTR_SPECS_END_FREQ: Required (u32) value to specify the end
|
||||
* frequency of this range edge when registering SAR capability to wiphy.
|
||||
* It's not a channel center frequency. The unit is kHz.
|
||||
*
|
||||
* @__NL80211_SAR_ATTR_SPECS_LAST: Internal
|
||||
* @NL80211_SAR_ATTR_SPECS_MAX: highest sar specs attribute
|
||||
*/
|
||||
enum nl80211_sar_specs_attrs {
|
||||
__NL80211_SAR_ATTR_SPECS_INVALID,
|
||||
|
||||
NL80211_SAR_ATTR_SPECS_POWER,
|
||||
NL80211_SAR_ATTR_SPECS_RANGE_INDEX,
|
||||
NL80211_SAR_ATTR_SPECS_START_FREQ,
|
||||
NL80211_SAR_ATTR_SPECS_END_FREQ,
|
||||
|
||||
__NL80211_SAR_ATTR_SPECS_LAST,
|
||||
NL80211_SAR_ATTR_SPECS_MAX = __NL80211_SAR_ATTR_SPECS_LAST - 1,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_sae_pwe_mechanism - The mechanism(s) allowed for SAE PWE
|
||||
* derivation. Applicable only when WPA3-Personal SAE authentication is
|
||||
|
|
206
net/core/dev.c
206
net/core/dev.c
|
@ -91,6 +91,7 @@
|
|||
#include <linux/etherdevice.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/bpf.h>
|
||||
#include <linux/bpf_trace.h>
|
||||
#include <net/net_namespace.h>
|
||||
|
@ -1507,6 +1508,27 @@ void netdev_notify_peers(struct net_device *dev)
|
|||
}
|
||||
EXPORT_SYMBOL(netdev_notify_peers);
|
||||
|
||||
static int napi_threaded_poll(void *data);
|
||||
|
||||
static int napi_kthread_create(struct napi_struct *n)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
/* Create and wake up the kthread once to put it in
|
||||
* TASK_INTERRUPTIBLE mode to avoid the blocked task
|
||||
* warning and work with loadavg.
|
||||
*/
|
||||
n->thread = kthread_run(napi_threaded_poll, n, "napi/%s-%d",
|
||||
n->dev->name, n->napi_id);
|
||||
if (IS_ERR(n->thread)) {
|
||||
err = PTR_ERR(n->thread);
|
||||
pr_err("kthread_run failed with err %d\n", err);
|
||||
n->thread = NULL;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __dev_open(struct net_device *dev, struct netlink_ext_ack *extack)
|
||||
{
|
||||
const struct net_device_ops *ops = dev->netdev_ops;
|
||||
|
@ -4277,6 +4299,24 @@ int gro_normal_batch __read_mostly = 8;
|
|||
static inline void ____napi_schedule(struct softnet_data *sd,
|
||||
struct napi_struct *napi)
|
||||
{
|
||||
struct task_struct *thread;
|
||||
|
||||
if (test_bit(NAPI_STATE_THREADED, &napi->state)) {
|
||||
/* Paired with smp_mb__before_atomic() in
|
||||
* napi_enable()/dev_set_threaded().
|
||||
* Use READ_ONCE() to guarantee a complete
|
||||
* read on napi->thread. Only call
|
||||
* wake_up_process() when it's not NULL.
|
||||
*/
|
||||
thread = READ_ONCE(napi->thread);
|
||||
if (thread) {
|
||||
if (thread->state != TASK_INTERRUPTIBLE)
|
||||
set_bit(NAPI_STATE_SCHED_THREADED, &napi->state);
|
||||
wake_up_process(thread);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
list_add_tail(&napi->poll_list, &sd->poll_list);
|
||||
__raise_softirq_irqoff(NET_RX_SOFTIRQ);
|
||||
}
|
||||
|
@ -6535,7 +6575,8 @@ bool napi_complete_done(struct napi_struct *n, int work_done)
|
|||
|
||||
WARN_ON_ONCE(!(val & NAPIF_STATE_SCHED));
|
||||
|
||||
new = val & ~(NAPIF_STATE_MISSED | NAPIF_STATE_SCHED);
|
||||
new = val & ~(NAPIF_STATE_MISSED | NAPIF_STATE_SCHED |
|
||||
NAPIF_STATE_SCHED_THREADED);
|
||||
|
||||
/* If STATE_MISSED was set, leave STATE_SCHED set,
|
||||
* because we will call napi->poll() one more time.
|
||||
|
@ -6744,6 +6785,51 @@ static void init_gro_hash(struct napi_struct *napi)
|
|||
napi->gro_bitmask = 0;
|
||||
}
|
||||
|
||||
int dev_set_threaded(struct net_device *dev, bool threaded)
|
||||
{
|
||||
struct napi_struct *napi;
|
||||
int err = 0;
|
||||
|
||||
if (dev->threaded == threaded)
|
||||
return 0;
|
||||
|
||||
if (threaded) {
|
||||
list_for_each_entry(napi, &dev->napi_list, dev_list) {
|
||||
if (!napi->thread) {
|
||||
err = napi_kthread_create(napi);
|
||||
if (err) {
|
||||
threaded = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dev->threaded = threaded;
|
||||
|
||||
/* Make sure kthread is created before THREADED bit
|
||||
* is set.
|
||||
*/
|
||||
smp_mb__before_atomic();
|
||||
|
||||
/* Setting/unsetting threaded mode on a napi might not immediately
|
||||
* take effect, if the current napi instance is actively being
|
||||
* polled. In this case, the switch between threaded mode and
|
||||
* softirq mode will happen in the next round of napi_schedule().
|
||||
* This should not cause hiccups/stalls to the live traffic.
|
||||
*/
|
||||
list_for_each_entry(napi, &dev->napi_list, dev_list) {
|
||||
if (threaded)
|
||||
set_bit(NAPI_STATE_THREADED, &napi->state);
|
||||
else
|
||||
clear_bit(NAPI_STATE_THREADED, &napi->state);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(dev_set_threaded);
|
||||
|
||||
void netif_napi_add(struct net_device *dev, struct napi_struct *napi,
|
||||
int (*poll)(struct napi_struct *, int), int weight)
|
||||
{
|
||||
|
@ -6771,6 +6857,12 @@ void netif_napi_add(struct net_device *dev, struct napi_struct *napi,
|
|||
set_bit(NAPI_STATE_NPSVC, &napi->state);
|
||||
list_add_rcu(&napi->dev_list, &dev->napi_list);
|
||||
napi_hash_add(napi);
|
||||
/* Create kthread for this napi if dev->threaded is set.
|
||||
* Clear dev->threaded if kthread creation failed so that
|
||||
* threaded mode will not be enabled in napi_enable().
|
||||
*/
|
||||
if (dev->threaded && napi_kthread_create(napi))
|
||||
dev->threaded = 0;
|
||||
}
|
||||
EXPORT_SYMBOL(netif_napi_add);
|
||||
|
||||
|
@ -6787,9 +6879,28 @@ void napi_disable(struct napi_struct *n)
|
|||
hrtimer_cancel(&n->timer);
|
||||
|
||||
clear_bit(NAPI_STATE_DISABLE, &n->state);
|
||||
clear_bit(NAPI_STATE_THREADED, &n->state);
|
||||
}
|
||||
EXPORT_SYMBOL(napi_disable);
|
||||
|
||||
/**
|
||||
* napi_enable - enable NAPI scheduling
|
||||
* @n: NAPI context
|
||||
*
|
||||
* Resume NAPI from being scheduled on this context.
|
||||
* Must be paired with napi_disable.
|
||||
*/
|
||||
void napi_enable(struct napi_struct *n)
|
||||
{
|
||||
BUG_ON(!test_bit(NAPI_STATE_SCHED, &n->state));
|
||||
smp_mb__before_atomic();
|
||||
clear_bit(NAPI_STATE_SCHED, &n->state);
|
||||
clear_bit(NAPI_STATE_NPSVC, &n->state);
|
||||
if (n->dev->threaded && n->thread)
|
||||
set_bit(NAPI_STATE_THREADED, &n->state);
|
||||
}
|
||||
EXPORT_SYMBOL(napi_enable);
|
||||
|
||||
static void flush_gro_hash(struct napi_struct *napi)
|
||||
{
|
||||
int i;
|
||||
|
@ -6815,18 +6926,17 @@ void __netif_napi_del(struct napi_struct *napi)
|
|||
|
||||
flush_gro_hash(napi);
|
||||
napi->gro_bitmask = 0;
|
||||
if (napi->thread) {
|
||||
kthread_stop(napi->thread);
|
||||
napi->thread = NULL;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(__netif_napi_del);
|
||||
|
||||
static int napi_poll(struct napi_struct *n, struct list_head *repoll)
|
||||
static int __napi_poll(struct napi_struct *n, bool *repoll)
|
||||
{
|
||||
void *have;
|
||||
int work, weight;
|
||||
|
||||
list_del_init(&n->poll_list);
|
||||
|
||||
have = netpoll_poll_lock(n);
|
||||
|
||||
weight = n->weight;
|
||||
|
||||
/* This NAPI_STATE_SCHED test is for avoiding a race
|
||||
|
@ -6846,7 +6956,7 @@ static int napi_poll(struct napi_struct *n, struct list_head *repoll)
|
|||
n->poll, work, weight);
|
||||
|
||||
if (likely(work < weight))
|
||||
goto out_unlock;
|
||||
return work;
|
||||
|
||||
/* Drivers must not modify the NAPI state if they
|
||||
* consume the entire weight. In such cases this code
|
||||
|
@ -6855,7 +6965,7 @@ static int napi_poll(struct napi_struct *n, struct list_head *repoll)
|
|||
*/
|
||||
if (unlikely(napi_disable_pending(n))) {
|
||||
napi_complete(n);
|
||||
goto out_unlock;
|
||||
return work;
|
||||
}
|
||||
|
||||
if (n->gro_bitmask) {
|
||||
|
@ -6873,17 +6983,89 @@ static int napi_poll(struct napi_struct *n, struct list_head *repoll)
|
|||
if (unlikely(!list_empty(&n->poll_list))) {
|
||||
pr_warn_once("%s: Budget exhausted after napi rescheduled\n",
|
||||
n->dev ? n->dev->name : "backlog");
|
||||
goto out_unlock;
|
||||
return work;
|
||||
}
|
||||
|
||||
list_add_tail(&n->poll_list, repoll);
|
||||
*repoll = true;
|
||||
|
||||
return work;
|
||||
}
|
||||
|
||||
static int napi_poll(struct napi_struct *n, struct list_head *repoll)
|
||||
{
|
||||
bool do_repoll = false;
|
||||
void *have;
|
||||
int work;
|
||||
|
||||
list_del_init(&n->poll_list);
|
||||
|
||||
have = netpoll_poll_lock(n);
|
||||
|
||||
work = __napi_poll(n, &do_repoll);
|
||||
|
||||
if (do_repoll)
|
||||
list_add_tail(&n->poll_list, repoll);
|
||||
|
||||
out_unlock:
|
||||
netpoll_poll_unlock(have);
|
||||
|
||||
return work;
|
||||
}
|
||||
|
||||
static int napi_thread_wait(struct napi_struct *napi)
|
||||
{
|
||||
bool woken = false;
|
||||
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
|
||||
while (!kthread_should_stop()) {
|
||||
/* Testing SCHED_THREADED bit here to make sure the current
|
||||
* kthread owns this napi and could poll on this napi.
|
||||
* Testing SCHED bit is not enough because SCHED bit might be
|
||||
* set by some other busy poll thread or by napi_disable().
|
||||
*/
|
||||
if (test_bit(NAPI_STATE_SCHED_THREADED, &napi->state) || woken) {
|
||||
WARN_ON(!list_empty(&napi->poll_list));
|
||||
__set_current_state(TASK_RUNNING);
|
||||
return 0;
|
||||
}
|
||||
|
||||
schedule();
|
||||
/* woken being true indicates this thread owns this napi. */
|
||||
woken = true;
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
}
|
||||
__set_current_state(TASK_RUNNING);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int napi_threaded_poll(void *data)
|
||||
{
|
||||
struct napi_struct *napi = data;
|
||||
void *have;
|
||||
|
||||
while (!napi_thread_wait(napi)) {
|
||||
for (;;) {
|
||||
bool repoll = false;
|
||||
|
||||
local_bh_disable();
|
||||
|
||||
have = netpoll_poll_lock(napi);
|
||||
__napi_poll(napi, &repoll);
|
||||
netpoll_poll_unlock(have);
|
||||
|
||||
__kfree_skb_flush();
|
||||
local_bh_enable();
|
||||
|
||||
if (!repoll)
|
||||
break;
|
||||
|
||||
cond_resched();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __latent_entropy void net_rx_action(struct softirq_action *h)
|
||||
{
|
||||
struct softnet_data *sd = this_cpu_ptr(&softnet_data);
|
||||
|
|
|
@ -587,6 +587,45 @@ static ssize_t phys_switch_id_show(struct device *dev,
|
|||
}
|
||||
static DEVICE_ATTR_RO(phys_switch_id);
|
||||
|
||||
static ssize_t threaded_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct net_device *netdev = to_net_dev(dev);
|
||||
ssize_t ret = -EINVAL;
|
||||
|
||||
if (!rtnl_trylock())
|
||||
return restart_syscall();
|
||||
|
||||
if (dev_isalive(netdev))
|
||||
ret = sprintf(buf, fmt_dec, netdev->threaded);
|
||||
|
||||
rtnl_unlock();
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int modify_napi_threaded(struct net_device *dev, unsigned long val)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (list_empty(&dev->napi_list))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (val != 0 && val != 1)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ret = dev_set_threaded(dev, val);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t threaded_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t len)
|
||||
{
|
||||
return netdev_store(dev, attr, buf, len, modify_napi_threaded);
|
||||
}
|
||||
static DEVICE_ATTR_RW(threaded);
|
||||
|
||||
static struct attribute *net_class_attrs[] __ro_after_init = {
|
||||
&dev_attr_netdev_group.attr,
|
||||
&dev_attr_type.attr,
|
||||
|
@ -619,6 +658,7 @@ static struct attribute *net_class_attrs[] __ro_after_init = {
|
|||
&dev_attr_proto_down.attr,
|
||||
&dev_attr_carrier_up_count.attr,
|
||||
&dev_attr_carrier_down_count.attr,
|
||||
&dev_attr_threaded.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(net_class);
|
||||
|
|
|
@ -288,7 +288,7 @@ static int dsa_port_setup(struct dsa_port *dp)
|
|||
|
||||
break;
|
||||
case DSA_PORT_TYPE_USER:
|
||||
dp->mac = of_get_mac_address(dp->dn);
|
||||
of_get_mac_address(dp->dn, dp->mac);
|
||||
err = dsa_slave_create(dp);
|
||||
if (err)
|
||||
break;
|
||||
|
|
|
@ -1818,7 +1818,7 @@ int dsa_slave_create(struct dsa_port *port)
|
|||
slave_dev->hw_features |= NETIF_F_HW_TC;
|
||||
slave_dev->features |= NETIF_F_LLTX;
|
||||
slave_dev->ethtool_ops = &dsa_slave_ethtool_ops;
|
||||
if (!IS_ERR_OR_NULL(port->mac))
|
||||
if (!is_zero_ether_addr(port->mac))
|
||||
ether_addr_copy(slave_dev->dev_addr, port->mac);
|
||||
else
|
||||
eth_hw_addr_inherit(slave_dev, master);
|
||||
|
|
|
@ -506,13 +506,14 @@ unsigned char * __weak arch_get_platform_mac_address(void)
|
|||
|
||||
int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr)
|
||||
{
|
||||
const unsigned char *addr = NULL;
|
||||
unsigned char *addr;
|
||||
int ret;
|
||||
|
||||
if (dev->of_node)
|
||||
addr = of_get_mac_address(dev->of_node);
|
||||
if (IS_ERR_OR_NULL(addr))
|
||||
addr = arch_get_platform_mac_address();
|
||||
ret = of_get_mac_address(dev->of_node, mac_addr);
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
||||
addr = arch_get_platform_mac_address();
|
||||
if (!addr)
|
||||
return -ENODEV;
|
||||
|
||||
|
|
|
@ -310,7 +310,7 @@ void ___ieee80211_start_rx_ba_session(struct sta_info *sta,
|
|||
}
|
||||
|
||||
if (sta->sta.he_cap.has_he)
|
||||
max_buf_size = IEEE80211_MAX_AMPDU_BUF;
|
||||
max_buf_size = IEEE80211_MAX_AMPDU_BUF_HE;
|
||||
else
|
||||
max_buf_size = IEEE80211_MAX_AMPDU_BUF_HT;
|
||||
|
||||
|
|
|
@ -4101,6 +4101,17 @@ static int ieee80211_reset_tid_config(struct wiphy *wiphy,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int ieee80211_set_sar_specs(struct wiphy *wiphy,
|
||||
struct cfg80211_sar_specs *sar)
|
||||
{
|
||||
struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||
|
||||
if (!local->ops->set_sar_specs)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return local->ops->set_sar_specs(&local->hw, sar);
|
||||
}
|
||||
|
||||
const struct cfg80211_ops mac80211_config_ops = {
|
||||
.add_virtual_intf = ieee80211_add_iface,
|
||||
.del_virtual_intf = ieee80211_del_iface,
|
||||
|
@ -4204,4 +4215,5 @@ const struct cfg80211_ops mac80211_config_ops = {
|
|||
.probe_mesh_link = ieee80211_probe_mesh_link,
|
||||
.set_tid_config = ieee80211_set_tid_config,
|
||||
.reset_tid_config = ieee80211_reset_tid_config,
|
||||
.set_sar_specs = ieee80211_set_sar_specs,
|
||||
};
|
||||
|
|
|
@ -405,6 +405,7 @@ static const char *hw_flag_names[] = {
|
|||
FLAG(SUPPORTS_ONLY_HE_MULTI_BSSID),
|
||||
FLAG(AMPDU_KEYBORDER_SUPPORT),
|
||||
FLAG(SUPPORTS_TX_ENCAP_OFFLOAD),
|
||||
FLAG(SUPPORTS_RX_DECAP_OFFLOAD),
|
||||
#undef FLAG
|
||||
};
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue