mirror of
https://github.com/suyu-emu/horinux.git
synced 2026-09-21 14:15:21 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller:
1) mlx4 doesn't check fully for supported valid RSS hash function, fix
from Amir Vadai
2) Off by one in ibmveth_change_mtu(), from David Gibson
3) Prevent altera chip from reporting false error interrupts in some
circumstances, from Chee Nouk Phoon
4) Get rid of that stupid endless loop trying to allocate a FIN packet
in TCP, and in the process kill deadlocks. From Eric Dumazet
5) Fix get_rps_cpus() crash due to wrong invalid-cpu value, also from
Eric Dumazet
6) Fix two bugs in async rhashtable resizing, from Thomas Graf
7) Fix topology server listener socket namespace bug in TIPC, from Ying
Xue
8) Add some missing HAS_DMA kconfig dependencies, from Geert
Uytterhoeven
9) bgmac driver intends to force re-polling but does so by returning
the wrong value from it's ->poll() handler. Fix from Rafał Miłecki
10) When the creater of an rhashtable configures a max size for it,
don't bark in the logs and drop insertions when that is exceeded.
Fix from Johannes Berg
11) Recover from out of order packets in ppp mppe properly, from Sylvain
Rochet
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (41 commits)
bnx2x: really disable TPA if 'disable_tpa' option is set
net:treewide: Fix typo in drivers/net
net/mlx4_en: Prevent setting invalid RSS hash function
mdio-mux-gpio: use new gpiod_get_array and gpiod_put_array functions
netfilter; Add some missing default cases to switch statements in nft_reject.
ppp: mppe: discard late packet in stateless mode
ppp: mppe: sanity error path rework
net/bonding: Make DRV macros private
net: rfs: fix crash in get_rps_cpus()
altera tse: add support for fixed-links.
pxa168: fix double deallocation of managed resources
net: fix crash in build_skb()
net: eth: altera: Resolve false errors from MSGDMA to TSE
ehea: Fix memory hook reference counting crashes
net/tg3: Release IRQs on permanent error
net: mdio-gpio: support access that may sleep
inet: fix possible panic in reqsk_queue_unlink()
rhashtable: don't attempt to grow when at max_size
bgmac: fix requests for extra polling calls from NAPI
tcp: avoid looping in tcp_send_fin()
...
This commit is contained in:
@@ -18,3 +18,12 @@ platform_labels - INTEGER
|
||||
|
||||
Possible values: 0 - 1048575
|
||||
Default: 0
|
||||
|
||||
conf/<interface>/input - BOOL
|
||||
Control whether packets can be input on this interface.
|
||||
|
||||
If disabled, packets will be discarded without further
|
||||
processing.
|
||||
|
||||
0 - disabled (default)
|
||||
not 0 - enabled
|
||||
|
||||
@@ -282,7 +282,7 @@ following is true:
|
||||
|
||||
- The current CPU's queue head counter >= the recorded tail counter
|
||||
value in rps_dev_flow[i]
|
||||
- The current CPU is unset (equal to RPS_NO_CPU)
|
||||
- The current CPU is unset (>= nr_cpu_ids)
|
||||
- The current CPU is offline
|
||||
|
||||
After this check, the packet is sent to the (possibly updated) current
|
||||
|
||||
@@ -82,6 +82,8 @@
|
||||
#include <net/bond_3ad.h>
|
||||
#include <net/bond_alb.h>
|
||||
|
||||
#include "bonding_priv.h"
|
||||
|
||||
/*---------------------------- Module parameters ----------------------------*/
|
||||
|
||||
/* monitor all links that often (in milliseconds). <=0 disables monitoring */
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <net/netns/generic.h>
|
||||
#include <net/bonding.h>
|
||||
|
||||
#include "bonding_priv.h"
|
||||
|
||||
static void *bond_info_seq_start(struct seq_file *seq, loff_t *pos)
|
||||
__acquires(RCU)
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Bond several ethernet interfaces into a Cisco, running 'Etherchannel'.
|
||||
*
|
||||
* Portions are (c) Copyright 1995 Simon "Guru Aleph-Null" Janes
|
||||
* NCM: Network and Communications Management, Inc.
|
||||
*
|
||||
* BUT, I'm the one who modified it for ethernet, so:
|
||||
* (c) Copyright 1999, Thomas Davis, tadavis@lbl.gov
|
||||
*
|
||||
* This software may be used and distributed according to the terms
|
||||
* of the GNU Public License, incorporated herein by reference.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _BONDING_PRIV_H
|
||||
#define _BONDING_PRIV_H
|
||||
|
||||
#define DRV_VERSION "3.7.1"
|
||||
#define DRV_RELDATE "April 27, 2011"
|
||||
#define DRV_NAME "bonding"
|
||||
#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver"
|
||||
|
||||
#define bond_version DRV_DESCRIPTION ": v" DRV_VERSION " (" DRV_RELDATE ")\n"
|
||||
|
||||
#endif
|
||||
@@ -112,7 +112,7 @@ config PCH_CAN
|
||||
|
||||
config CAN_GRCAN
|
||||
tristate "Aeroflex Gaisler GRCAN and GRHCAN CAN devices"
|
||||
depends on OF
|
||||
depends on OF && HAS_DMA
|
||||
---help---
|
||||
Say Y here if you want to use Aeroflex Gaisler GRCAN or GRHCAN.
|
||||
Note that the driver supports little endian, even though little
|
||||
|
||||
@@ -1102,7 +1102,7 @@ static void kvaser_usb_rx_can_err(const struct kvaser_usb_net_priv *priv,
|
||||
|
||||
if (msg->u.rx_can_header.flag & (MSG_FLAG_ERROR_FRAME |
|
||||
MSG_FLAG_NERR)) {
|
||||
netdev_err(priv->netdev, "Unknow error (flags: 0x%02x)\n",
|
||||
netdev_err(priv->netdev, "Unknown error (flags: 0x%02x)\n",
|
||||
msg->u.rx_can_header.flag);
|
||||
|
||||
stats->rx_errors++;
|
||||
|
||||
@@ -523,7 +523,7 @@ static int etherh_addr(char *addr, struct expansion_card *ec)
|
||||
char *s;
|
||||
|
||||
if (!ecard_readchunk(&cd, ec, 0xf5, 0)) {
|
||||
printk(KERN_ERR "%s: unable to read podule description string\n",
|
||||
printk(KERN_ERR "%s: unable to read module description string\n",
|
||||
dev_name(&ec->dev));
|
||||
goto no_addr;
|
||||
}
|
||||
|
||||
@@ -58,15 +58,12 @@ struct msgdma_extended_desc {
|
||||
/* Tx buffer control flags
|
||||
*/
|
||||
#define MSGDMA_DESC_CTL_TX_FIRST (MSGDMA_DESC_CTL_GEN_SOP | \
|
||||
MSGDMA_DESC_CTL_TR_ERR_IRQ | \
|
||||
MSGDMA_DESC_CTL_GO)
|
||||
|
||||
#define MSGDMA_DESC_CTL_TX_MIDDLE (MSGDMA_DESC_CTL_TR_ERR_IRQ | \
|
||||
MSGDMA_DESC_CTL_GO)
|
||||
#define MSGDMA_DESC_CTL_TX_MIDDLE (MSGDMA_DESC_CTL_GO)
|
||||
|
||||
#define MSGDMA_DESC_CTL_TX_LAST (MSGDMA_DESC_CTL_GEN_EOP | \
|
||||
MSGDMA_DESC_CTL_TR_COMP_IRQ | \
|
||||
MSGDMA_DESC_CTL_TR_ERR_IRQ | \
|
||||
MSGDMA_DESC_CTL_GO)
|
||||
|
||||
#define MSGDMA_DESC_CTL_TX_SINGLE (MSGDMA_DESC_CTL_GEN_SOP | \
|
||||
|
||||
@@ -777,6 +777,8 @@ static int init_phy(struct net_device *dev)
|
||||
struct altera_tse_private *priv = netdev_priv(dev);
|
||||
struct phy_device *phydev;
|
||||
struct device_node *phynode;
|
||||
bool fixed_link = false;
|
||||
int rc = 0;
|
||||
|
||||
/* Avoid init phy in case of no phy present */
|
||||
if (!priv->phy_iface)
|
||||
@@ -789,13 +791,32 @@ static int init_phy(struct net_device *dev)
|
||||
phynode = of_parse_phandle(priv->device->of_node, "phy-handle", 0);
|
||||
|
||||
if (!phynode) {
|
||||
netdev_dbg(dev, "no phy-handle found\n");
|
||||
if (!priv->mdio) {
|
||||
netdev_err(dev,
|
||||
"No phy-handle nor local mdio specified\n");
|
||||
return -ENODEV;
|
||||
/* check if a fixed-link is defined in device-tree */
|
||||
if (of_phy_is_fixed_link(priv->device->of_node)) {
|
||||
rc = of_phy_register_fixed_link(priv->device->of_node);
|
||||
if (rc < 0) {
|
||||
netdev_err(dev, "cannot register fixed PHY\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* In the case of a fixed PHY, the DT node associated
|
||||
* to the PHY is the Ethernet MAC DT node.
|
||||
*/
|
||||
phynode = of_node_get(priv->device->of_node);
|
||||
fixed_link = true;
|
||||
|
||||
netdev_dbg(dev, "fixed-link detected\n");
|
||||
phydev = of_phy_connect(dev, phynode,
|
||||
&altera_tse_adjust_link,
|
||||
0, priv->phy_iface);
|
||||
} else {
|
||||
netdev_dbg(dev, "no phy-handle found\n");
|
||||
if (!priv->mdio) {
|
||||
netdev_err(dev, "No phy-handle nor local mdio specified\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
phydev = connect_local_phy(dev);
|
||||
}
|
||||
phydev = connect_local_phy(dev);
|
||||
} else {
|
||||
netdev_dbg(dev, "phy-handle found\n");
|
||||
phydev = of_phy_connect(dev, phynode,
|
||||
@@ -819,10 +840,10 @@ static int init_phy(struct net_device *dev)
|
||||
/* Broken HW is sometimes missing the pull-up resistor on the
|
||||
* MDIO line, which results in reads to non-existent devices returning
|
||||
* 0 rather than 0xffff. Catch this here and treat 0 as a non-existent
|
||||
* device as well.
|
||||
* device as well. If a fixed-link is used the phy_id is always 0.
|
||||
* Note: phydev->phy_id is the result of reading the UID PHY registers.
|
||||
*/
|
||||
if (phydev->phy_id == 0) {
|
||||
if ((phydev->phy_id == 0) && !fixed_link) {
|
||||
netdev_err(dev, "Bad PHY UID 0x%08x\n", phydev->phy_id);
|
||||
phy_disconnect(phydev);
|
||||
return -ENODEV;
|
||||
|
||||
@@ -179,7 +179,7 @@ config SUNLANCE
|
||||
|
||||
config AMD_XGBE
|
||||
tristate "AMD 10GbE Ethernet driver"
|
||||
depends on (OF_NET || ACPI) && HAS_IOMEM
|
||||
depends on (OF_NET || ACPI) && HAS_IOMEM && HAS_DMA
|
||||
select PHYLIB
|
||||
select AMD_XGBE_PHY
|
||||
select BITREVERSE
|
||||
|
||||
@@ -25,8 +25,7 @@ config ARC_EMAC_CORE
|
||||
config ARC_EMAC
|
||||
tristate "ARC EMAC support"
|
||||
select ARC_EMAC_CORE
|
||||
depends on OF_IRQ
|
||||
depends on OF_NET
|
||||
depends on OF_IRQ && OF_NET && HAS_DMA
|
||||
---help---
|
||||
On some legacy ARC (Synopsys) FPGA boards such as ARCAngel4/ML50x
|
||||
non-standard on-chip ethernet device ARC EMAC 10/100 is used.
|
||||
@@ -35,7 +34,7 @@ config ARC_EMAC
|
||||
config EMAC_ROCKCHIP
|
||||
tristate "Rockchip EMAC support"
|
||||
select ARC_EMAC_CORE
|
||||
depends on OF_IRQ && OF_NET && REGULATOR
|
||||
depends on OF_IRQ && OF_NET && REGULATOR && HAS_DMA
|
||||
---help---
|
||||
Support for Rockchip RK3066/RK3188 EMAC ethernet controllers.
|
||||
This selects Rockchip SoC glue layer support for the
|
||||
|
||||
@@ -1260,7 +1260,7 @@ static int bgmac_poll(struct napi_struct *napi, int weight)
|
||||
|
||||
/* Poll again if more events arrived in the meantime */
|
||||
if (bgmac_read(bgmac, BGMAC_INT_STATUS) & (BGMAC_IS_TX0 | BGMAC_IS_RX))
|
||||
return handled;
|
||||
return weight;
|
||||
|
||||
if (handled < weight) {
|
||||
napi_complete(napi);
|
||||
|
||||
@@ -2485,8 +2485,10 @@ static void bnx2x_bz_fp(struct bnx2x *bp, int index)
|
||||
else if (bp->flags & GRO_ENABLE_FLAG)
|
||||
fp->mode = TPA_MODE_GRO;
|
||||
|
||||
/* We don't want TPA on an FCoE L2 ring */
|
||||
if (IS_FCOE_FP(fp))
|
||||
/* We don't want TPA if it's disabled in bp
|
||||
* or if this is an FCoE L2 ring.
|
||||
*/
|
||||
if (bp->disable_tpa || IS_FCOE_FP(fp))
|
||||
fp->disable_tpa = 1;
|
||||
}
|
||||
|
||||
@@ -4809,6 +4811,23 @@ netdev_features_t bnx2x_fix_features(struct net_device *dev,
|
||||
{
|
||||
struct bnx2x *bp = netdev_priv(dev);
|
||||
|
||||
if (pci_num_vf(bp->pdev)) {
|
||||
netdev_features_t changed = dev->features ^ features;
|
||||
|
||||
/* Revert the requested changes in features if they
|
||||
* would require internal reload of PF in bnx2x_set_features().
|
||||
*/
|
||||
if (!(features & NETIF_F_RXCSUM) && !bp->disable_tpa) {
|
||||
features &= ~NETIF_F_RXCSUM;
|
||||
features |= dev->features & NETIF_F_RXCSUM;
|
||||
}
|
||||
|
||||
if (changed & NETIF_F_LOOPBACK) {
|
||||
features &= ~NETIF_F_LOOPBACK;
|
||||
features |= dev->features & NETIF_F_LOOPBACK;
|
||||
}
|
||||
}
|
||||
|
||||
/* TPA requires Rx CSUM offloading */
|
||||
if (!(features & NETIF_F_RXCSUM)) {
|
||||
features &= ~NETIF_F_LRO;
|
||||
@@ -4839,15 +4858,18 @@ int bnx2x_set_features(struct net_device *dev, netdev_features_t features)
|
||||
else
|
||||
flags &= ~GRO_ENABLE_FLAG;
|
||||
|
||||
if (features & NETIF_F_LOOPBACK) {
|
||||
if (bp->link_params.loopback_mode != LOOPBACK_BMAC) {
|
||||
bp->link_params.loopback_mode = LOOPBACK_BMAC;
|
||||
bnx2x_reload = true;
|
||||
}
|
||||
} else {
|
||||
if (bp->link_params.loopback_mode != LOOPBACK_NONE) {
|
||||
bp->link_params.loopback_mode = LOOPBACK_NONE;
|
||||
bnx2x_reload = true;
|
||||
/* VFs or non SRIOV PFs should be able to change loopback feature */
|
||||
if (!pci_num_vf(bp->pdev)) {
|
||||
if (features & NETIF_F_LOOPBACK) {
|
||||
if (bp->link_params.loopback_mode != LOOPBACK_BMAC) {
|
||||
bp->link_params.loopback_mode = LOOPBACK_BMAC;
|
||||
bnx2x_reload = true;
|
||||
}
|
||||
} else {
|
||||
if (bp->link_params.loopback_mode != LOOPBACK_NONE) {
|
||||
bp->link_params.loopback_mode = LOOPBACK_NONE;
|
||||
bnx2x_reload = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4931,6 +4953,11 @@ int bnx2x_resume(struct pci_dev *pdev)
|
||||
}
|
||||
bp = netdev_priv(dev);
|
||||
|
||||
if (pci_num_vf(bp->pdev)) {
|
||||
DP(BNX2X_MSG_IOV, "VFs are enabled, can not change MTU\n");
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
|
||||
BNX2X_ERR("Handling parity error recovery. Try again later\n");
|
||||
return -EAGAIN;
|
||||
|
||||
@@ -1843,6 +1843,12 @@ static int bnx2x_set_ringparam(struct net_device *dev,
|
||||
"set ring params command parameters: rx_pending = %d, tx_pending = %d\n",
|
||||
ering->rx_pending, ering->tx_pending);
|
||||
|
||||
if (pci_num_vf(bp->pdev)) {
|
||||
DP(BNX2X_MSG_IOV,
|
||||
"VFs are enabled, can not change ring parameters\n");
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
|
||||
DP(BNX2X_MSG_ETHTOOL,
|
||||
"Handling parity error recovery. Try again later\n");
|
||||
@@ -2899,6 +2905,12 @@ static void bnx2x_self_test(struct net_device *dev,
|
||||
u8 is_serdes, link_up;
|
||||
int rc, cnt = 0;
|
||||
|
||||
if (pci_num_vf(bp->pdev)) {
|
||||
DP(BNX2X_MSG_IOV,
|
||||
"VFs are enabled, can not perform self test\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
|
||||
netdev_err(bp->dev,
|
||||
"Handling parity error recovery. Try again later\n");
|
||||
@@ -3468,6 +3480,11 @@ static int bnx2x_set_channels(struct net_device *dev,
|
||||
channels->rx_count, channels->tx_count, channels->other_count,
|
||||
channels->combined_count);
|
||||
|
||||
if (pci_num_vf(bp->pdev)) {
|
||||
DP(BNX2X_MSG_IOV, "VFs are enabled, can not set channels\n");
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
/* We don't support separate rx / tx channels.
|
||||
* We don't allow setting 'other' channels.
|
||||
*/
|
||||
|
||||
@@ -18129,7 +18129,9 @@ static pci_ers_result_t tg3_io_error_detected(struct pci_dev *pdev,
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
tp->pcierr_recovery = true;
|
||||
/* We needn't recover from permanent error */
|
||||
if (state == pci_channel_io_frozen)
|
||||
tp->pcierr_recovery = true;
|
||||
|
||||
/* We probably don't have netdev yet */
|
||||
if (!netdev || !netif_running(netdev))
|
||||
|
||||
@@ -1473,9 +1473,9 @@ static void macb_init_rings(struct macb *bp)
|
||||
for (i = 0; i < TX_RING_SIZE; i++) {
|
||||
bp->queues[0].tx_ring[i].addr = 0;
|
||||
bp->queues[0].tx_ring[i].ctrl = MACB_BIT(TX_USED);
|
||||
bp->queues[0].tx_head = 0;
|
||||
bp->queues[0].tx_tail = 0;
|
||||
}
|
||||
bp->queues[0].tx_head = 0;
|
||||
bp->queues[0].tx_tail = 0;
|
||||
bp->queues[0].tx_ring[TX_RING_SIZE - 1].ctrl |= MACB_BIT(TX_WRAP);
|
||||
|
||||
bp->rx_tail = 0;
|
||||
|
||||
@@ -3347,7 +3347,7 @@ static int ehea_register_memory_hooks(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (atomic_inc_and_test(&ehea_memory_hooks_registered))
|
||||
if (atomic_inc_return(&ehea_memory_hooks_registered) > 1)
|
||||
return 0;
|
||||
|
||||
ret = ehea_create_busmap();
|
||||
@@ -3381,12 +3381,14 @@ out3:
|
||||
out2:
|
||||
unregister_reboot_notifier(&ehea_reboot_nb);
|
||||
out:
|
||||
atomic_dec(&ehea_memory_hooks_registered);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ehea_unregister_memory_hooks(void)
|
||||
{
|
||||
if (atomic_read(&ehea_memory_hooks_registered))
|
||||
/* Only remove the hooks if we've registered them */
|
||||
if (atomic_read(&ehea_memory_hooks_registered) == 0)
|
||||
return;
|
||||
|
||||
unregister_reboot_notifier(&ehea_reboot_nb);
|
||||
|
||||
@@ -1238,7 +1238,7 @@ static int ibmveth_change_mtu(struct net_device *dev, int new_mtu)
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++)
|
||||
if (new_mtu_oh < adapter->rx_buff_pool[i].buff_size)
|
||||
if (new_mtu_oh <= adapter->rx_buff_pool[i].buff_size)
|
||||
break;
|
||||
|
||||
if (i == IBMVETH_NUM_BUFF_POOLS)
|
||||
@@ -1257,7 +1257,7 @@ static int ibmveth_change_mtu(struct net_device *dev, int new_mtu)
|
||||
for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) {
|
||||
adapter->rx_buff_pool[i].active = 1;
|
||||
|
||||
if (new_mtu_oh < adapter->rx_buff_pool[i].buff_size) {
|
||||
if (new_mtu_oh <= adapter->rx_buff_pool[i].buff_size) {
|
||||
dev->mtu = new_mtu;
|
||||
vio_cmo_set_dev_desired(viodev,
|
||||
ibmveth_get_desired_dma
|
||||
|
||||
@@ -1508,7 +1508,8 @@ static int pxa168_eth_probe(struct platform_device *pdev)
|
||||
np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0);
|
||||
if (!np) {
|
||||
dev_err(&pdev->dev, "missing phy-handle\n");
|
||||
return -EINVAL;
|
||||
err = -EINVAL;
|
||||
goto err_netdev;
|
||||
}
|
||||
of_property_read_u32(np, "reg", &pep->phy_addr);
|
||||
pep->phy_intf = of_get_phy_mode(pdev->dev.of_node);
|
||||
@@ -1526,7 +1527,7 @@ static int pxa168_eth_probe(struct platform_device *pdev)
|
||||
pep->smi_bus = mdiobus_alloc();
|
||||
if (pep->smi_bus == NULL) {
|
||||
err = -ENOMEM;
|
||||
goto err_base;
|
||||
goto err_netdev;
|
||||
}
|
||||
pep->smi_bus->priv = pep;
|
||||
pep->smi_bus->name = "pxa168_eth smi";
|
||||
@@ -1551,13 +1552,10 @@ err_mdiobus:
|
||||
mdiobus_unregister(pep->smi_bus);
|
||||
err_free_mdio:
|
||||
mdiobus_free(pep->smi_bus);
|
||||
err_base:
|
||||
iounmap(pep->base);
|
||||
err_netdev:
|
||||
free_netdev(dev);
|
||||
err_clk:
|
||||
clk_disable(clk);
|
||||
clk_put(clk);
|
||||
clk_disable_unprepare(clk);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1574,13 +1572,9 @@ static int pxa168_eth_remove(struct platform_device *pdev)
|
||||
if (pep->phy)
|
||||
phy_disconnect(pep->phy);
|
||||
if (pep->clk) {
|
||||
clk_disable(pep->clk);
|
||||
clk_put(pep->clk);
|
||||
pep->clk = NULL;
|
||||
clk_disable_unprepare(pep->clk);
|
||||
}
|
||||
|
||||
iounmap(pep->base);
|
||||
pep->base = NULL;
|
||||
mdiobus_unregister(pep->smi_bus);
|
||||
mdiobus_free(pep->smi_bus);
|
||||
unregister_netdev(dev);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user