aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2009-03-23 16:35:04 -0400
committerDavid S. Miller <davem@davemloft.net>2009-03-23 16:35:04 -0400
commit8be7cdccacfbfc707e7370cad9bb168defed636f (patch)
tree8416607b62ec352176c81afd6f4e7b571ceb957f
parentecd4137320b59759bbe57eef89040ee3e5e66039 (diff)
parent61fa9dcf9329cb92c220f7b656410fbe5e72f933 (diff)
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: drivers/net/ucc_geth.c
-rw-r--r--drivers/dca/dca-sysfs.c21
-rw-r--r--drivers/net/Kconfig2
-rw-r--r--drivers/net/benet/be.h1
-rw-r--r--drivers/net/benet/be_main.c60
-rw-r--r--drivers/net/dm9000.c6
-rw-r--r--drivers/net/dnet.c6
-rw-r--r--drivers/net/sungem.c9
-rw-r--r--drivers/net/ucc_geth.c36
-rw-r--r--drivers/net/ucc_geth.h3
-rw-r--r--include/linux/dca.h20
-rw-r--r--net/wireless/nl80211.c11
11 files changed, 113 insertions, 62 deletions
diff --git a/drivers/dca/dca-sysfs.c b/drivers/dca/dca-sysfs.c
index bb538b9690e0..ee916c9857ee 100644
--- a/drivers/dca/dca-sysfs.c
+++ b/drivers/dca/dca-sysfs.c
@@ -1,3 +1,24 @@
1/*
2 * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the Free
6 * Software Foundation; either version 2 of the License, or (at your option)
7 * any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc., 59
16 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 *
18 * The full GNU General Public License is included in this distribution in the
19 * file called COPYING.
20 */
21
1#include <linux/kernel.h> 22#include <linux/kernel.h>
2#include <linux/spinlock.h> 23#include <linux/spinlock.h>
3#include <linux/device.h> 24#include <linux/device.h>
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 533cc411ee48..e5ffc1c606c1 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -1051,7 +1051,7 @@ config NI65
1051 1051
1052config DNET 1052config DNET
1053 tristate "Dave ethernet support (DNET)" 1053 tristate "Dave ethernet support (DNET)"
1054 depends on NET_ETHERNET 1054 depends on NET_ETHERNET && HAS_IOMEM
1055 select PHYLIB 1055 select PHYLIB
1056 help 1056 help
1057 The Dave ethernet interface (DNET) is found on Qong Board FPGA. 1057 The Dave ethernet interface (DNET) is found on Qong Board FPGA.
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h
index 63d593d53153..f327be57ca96 100644
--- a/drivers/net/benet/be.h
+++ b/drivers/net/benet/be.h
@@ -194,6 +194,7 @@ struct be_adapter {
194 struct be_eq_obj rx_eq; 194 struct be_eq_obj rx_eq;
195 struct be_rx_obj rx_obj; 195 struct be_rx_obj rx_obj;
196 u32 big_page_size; /* Compounded page size shared by rx wrbs */ 196 u32 big_page_size; /* Compounded page size shared by rx wrbs */
197 bool rx_post_starved; /* Zero rx frags have been posted to BE */
197 198
198 struct vlan_group *vlan_grp; 199 struct vlan_group *vlan_grp;
199 u16 num_vlans; 200 u16 num_vlans;
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c
index 897a63de5bdb..0ecaffb70e58 100644
--- a/drivers/net/benet/be_main.c
+++ b/drivers/net/benet/be_main.c
@@ -273,26 +273,6 @@ static void be_rx_eqd_update(struct be_adapter *adapter)
273 rx_eq->cur_eqd = eqd; 273 rx_eq->cur_eqd = eqd;
274} 274}
275 275
276static void be_worker(struct work_struct *work)
277{
278 struct be_adapter *adapter =
279 container_of(work, struct be_adapter, work.work);
280 int status;
281
282 /* Check link */
283 be_link_status_update(adapter);
284
285 /* Get Stats */
286 status = be_cmd_get_stats(&adapter->ctrl, &adapter->stats.cmd);
287 if (!status)
288 netdev_stats_update(adapter);
289
290 /* Set EQ delay */
291 be_rx_eqd_update(adapter);
292
293 schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000));
294}
295
296static struct net_device_stats *be_get_stats(struct net_device *dev) 276static struct net_device_stats *be_get_stats(struct net_device *dev)
297{ 277{
298 struct be_adapter *adapter = netdev_priv(dev); 278 struct be_adapter *adapter = netdev_priv(dev);
@@ -493,7 +473,7 @@ static int be_change_mtu(struct net_device *netdev, int new_mtu)
493 * program them in BE. If more than BE_NUM_VLANS_SUPPORTED are configured, 473 * program them in BE. If more than BE_NUM_VLANS_SUPPORTED are configured,
494 * set the BE in promiscuous VLAN mode. 474 * set the BE in promiscuous VLAN mode.
495 */ 475 */
496static void be_vids_config(struct net_device *netdev) 476static void be_vid_config(struct net_device *netdev)
497{ 477{
498 struct be_adapter *adapter = netdev_priv(netdev); 478 struct be_adapter *adapter = netdev_priv(netdev);
499 u16 vtag[BE_NUM_VLANS_SUPPORTED]; 479 u16 vtag[BE_NUM_VLANS_SUPPORTED];
@@ -536,7 +516,7 @@ static void be_vlan_add_vid(struct net_device *netdev, u16 vid)
536 adapter->num_vlans++; 516 adapter->num_vlans++;
537 adapter->vlan_tag[vid] = 1; 517 adapter->vlan_tag[vid] = 1;
538 518
539 be_vids_config(netdev); 519 be_vid_config(netdev);
540} 520}
541 521
542static void be_vlan_rem_vid(struct net_device *netdev, u16 vid) 522static void be_vlan_rem_vid(struct net_device *netdev, u16 vid)
@@ -547,7 +527,7 @@ static void be_vlan_rem_vid(struct net_device *netdev, u16 vid)
547 adapter->vlan_tag[vid] = 0; 527 adapter->vlan_tag[vid] = 0;
548 528
549 vlan_group_set_device(adapter->vlan_grp, vid, NULL); 529 vlan_group_set_device(adapter->vlan_grp, vid, NULL);
550 be_vids_config(netdev); 530 be_vid_config(netdev);
551} 531}
552 532
553static void be_set_multicast_filter(struct net_device *netdev) 533static void be_set_multicast_filter(struct net_device *netdev)
@@ -900,8 +880,11 @@ static void be_post_rx_frags(struct be_adapter *adapter)
900 page_info->last_page_user = true; 880 page_info->last_page_user = true;
901 881
902 if (posted) { 882 if (posted) {
903 be_rxq_notify(&adapter->ctrl, rxq->id, posted);
904 atomic_add(posted, &rxq->used); 883 atomic_add(posted, &rxq->used);
884 be_rxq_notify(&adapter->ctrl, rxq->id, posted);
885 } else if (atomic_read(&rxq->used) == 0) {
886 /* Let be_worker replenish when memory is available */
887 adapter->rx_post_starved = true;
905 } 888 }
906 889
907 return; 890 return;
@@ -1305,6 +1288,31 @@ int be_poll_tx(struct napi_struct *napi, int budget)
1305 return 1; 1288 return 1;
1306} 1289}
1307 1290
1291static void be_worker(struct work_struct *work)
1292{
1293 struct be_adapter *adapter =
1294 container_of(work, struct be_adapter, work.work);
1295 int status;
1296
1297 /* Check link */
1298 be_link_status_update(adapter);
1299
1300 /* Get Stats */
1301 status = be_cmd_get_stats(&adapter->ctrl, &adapter->stats.cmd);
1302 if (!status)
1303 netdev_stats_update(adapter);
1304
1305 /* Set EQ delay */
1306 be_rx_eqd_update(adapter);
1307
1308 if (adapter->rx_post_starved) {
1309 adapter->rx_post_starved = false;
1310 be_post_rx_frags(adapter);
1311 }
1312
1313 schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000));
1314}
1315
1308static void be_msix_enable(struct be_adapter *adapter) 1316static void be_msix_enable(struct be_adapter *adapter)
1309{ 1317{
1310 int i, status; 1318 int i, status;
@@ -1422,6 +1430,8 @@ static int be_open(struct net_device *netdev)
1422 if (status != 0) 1430 if (status != 0)
1423 goto do_none; 1431 goto do_none;
1424 1432
1433 be_vid_config(netdev);
1434
1425 status = be_cmd_set_flow_control(ctrl, true, true); 1435 status = be_cmd_set_flow_control(ctrl, true, true);
1426 if (status != 0) 1436 if (status != 0)
1427 goto if_destroy; 1437 goto if_destroy;
@@ -1856,8 +1866,6 @@ static int be_resume(struct pci_dev *pdev)
1856 pci_set_power_state(pdev, 0); 1866 pci_set_power_state(pdev, 0);
1857 pci_restore_state(pdev); 1867 pci_restore_state(pdev);
1858 1868
1859 be_vids_config(netdev);
1860
1861 if (netif_running(netdev)) { 1869 if (netif_running(netdev)) {
1862 rtnl_lock(); 1870 rtnl_lock();
1863 be_open(netdev); 1871 be_open(netdev);
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c
index bcf92917bbf3..254ec62b5f58 100644
--- a/drivers/net/dm9000.c
+++ b/drivers/net/dm9000.c
@@ -930,13 +930,15 @@ static irqreturn_t dm9000_interrupt(int irq, void *dev_id)
930 struct net_device *dev = dev_id; 930 struct net_device *dev = dev_id;
931 board_info_t *db = netdev_priv(dev); 931 board_info_t *db = netdev_priv(dev);
932 int int_status; 932 int int_status;
933 unsigned long flags;
933 u8 reg_save; 934 u8 reg_save;
934 935
935 dm9000_dbg(db, 3, "entering %s\n", __func__); 936 dm9000_dbg(db, 3, "entering %s\n", __func__);
936 937
937 /* A real interrupt coming */ 938 /* A real interrupt coming */
938 939
939 spin_lock(&db->lock); 940 /* holders of db->lock must always block IRQs */
941 spin_lock_irqsave(&db->lock, flags);
940 942
941 /* Save previous register address */ 943 /* Save previous register address */
942 reg_save = readb(db->io_addr); 944 reg_save = readb(db->io_addr);
@@ -972,7 +974,7 @@ static irqreturn_t dm9000_interrupt(int irq, void *dev_id)
972 /* Restore previous register address */ 974 /* Restore previous register address */
973 writeb(reg_save, db->io_addr); 975 writeb(reg_save, db->io_addr);
974 976
975 spin_unlock(&db->lock); 977 spin_unlock_irqrestore(&db->lock, flags);
976 978
977 return IRQ_HANDLED; 979 return IRQ_HANDLED;
978} 980}
diff --git a/drivers/net/dnet.c b/drivers/net/dnet.c
index 8a98d407692b..c05c2d69fbf6 100644
--- a/drivers/net/dnet.c
+++ b/drivers/net/dnet.c
@@ -279,11 +279,11 @@ static int dnet_mii_probe(struct net_device *dev)
279 279
280 /* attach the mac to the phy */ 280 /* attach the mac to the phy */
281 if (bp->capabilities & DNET_HAS_RMII) { 281 if (bp->capabilities & DNET_HAS_RMII) {
282 phydev = phy_connect(dev, phydev->dev.bus_id, 282 phydev = phy_connect(dev, dev_name(&phydev->dev),
283 &dnet_handle_link_change, 0, 283 &dnet_handle_link_change, 0,
284 PHY_INTERFACE_MODE_RMII); 284 PHY_INTERFACE_MODE_RMII);
285 } else { 285 } else {
286 phydev = phy_connect(dev, phydev->dev.bus_id, 286 phydev = phy_connect(dev, dev_name(&phydev->dev),
287 &dnet_handle_link_change, 0, 287 &dnet_handle_link_change, 0,
288 PHY_INTERFACE_MODE_MII); 288 PHY_INTERFACE_MODE_MII);
289 } 289 }
@@ -926,7 +926,7 @@ static int __devinit dnet_probe(struct platform_device *pdev)
926 phydev = bp->phy_dev; 926 phydev = bp->phy_dev;
927 dev_info(&pdev->dev, "attached PHY driver [%s] " 927 dev_info(&pdev->dev, "attached PHY driver [%s] "
928 "(mii_bus:phy_addr=%s, irq=%d)\n", 928 "(mii_bus:phy_addr=%s, irq=%d)\n",
929 phydev->drv->name, phydev->dev.bus_id, phydev->irq); 929 phydev->drv->name, dev_name(&phydev->dev), phydev->irq);
930 930
931 return 0; 931 return 0;
932 932
diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c
index 64dfa7f5f374..c024352c92fd 100644
--- a/drivers/net/sungem.c
+++ b/drivers/net/sungem.c
@@ -2998,8 +2998,11 @@ static const struct net_device_ops gem_netdev_ops = {
2998 .ndo_do_ioctl = gem_ioctl, 2998 .ndo_do_ioctl = gem_ioctl,
2999 .ndo_tx_timeout = gem_tx_timeout, 2999 .ndo_tx_timeout = gem_tx_timeout,
3000 .ndo_change_mtu = gem_change_mtu, 3000 .ndo_change_mtu = gem_change_mtu,
3001 .ndo_set_mac_address = eth_mac_addr,
3002 .ndo_validate_addr = eth_validate_addr, 3001 .ndo_validate_addr = eth_validate_addr,
3002 .ndo_set_mac_address = gem_set_mac_address,
3003#ifdef CONFIG_NET_POLL_CONTROLLER
3004 .ndo_poll_controller = gem_poll_controller,
3005#endif
3003}; 3006};
3004 3007
3005static int __devinit gem_init_one(struct pci_dev *pdev, 3008static int __devinit gem_init_one(struct pci_dev *pdev,
@@ -3161,10 +3164,6 @@ static int __devinit gem_init_one(struct pci_dev *pdev,
3161 dev->watchdog_timeo = 5 * HZ; 3164 dev->watchdog_timeo = 5 * HZ;
3162 dev->irq = pdev->irq; 3165 dev->irq = pdev->irq;
3163 dev->dma = 0; 3166 dev->dma = 0;
3164 dev->set_mac_address = gem_set_mac_address;
3165#ifdef CONFIG_NET_POLL_CONTROLLER
3166 dev->poll_controller = gem_poll_controller;
3167#endif
3168 3167
3169 /* Set that now, in case PM kicks in now */ 3168 /* Set that now, in case PM kicks in now */
3170 pci_set_drvdata(pdev, dev); 3169 pci_set_drvdata(pdev, dev);
diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c
index 1c095c63f98f..8f0ac442c907 100644
--- a/drivers/net/ucc_geth.c
+++ b/drivers/net/ucc_geth.c
@@ -1536,32 +1536,15 @@ static void adjust_link(struct net_device *dev)
1536static int init_phy(struct net_device *dev) 1536static int init_phy(struct net_device *dev)
1537{ 1537{
1538 struct ucc_geth_private *priv = netdev_priv(dev); 1538 struct ucc_geth_private *priv = netdev_priv(dev);
1539 struct device_node *np = priv->node; 1539 struct ucc_geth_info *ug_info = priv->ug_info;
1540 struct device_node *phy, *mdio;
1541 const phandle *ph;
1542 char bus_name[MII_BUS_ID_SIZE];
1543 const unsigned int *id;
1544 struct phy_device *phydev; 1540 struct phy_device *phydev;
1545 char phy_id[BUS_ID_SIZE];
1546 1541
1547 priv->oldlink = 0; 1542 priv->oldlink = 0;
1548 priv->oldspeed = 0; 1543 priv->oldspeed = 0;
1549 priv->oldduplex = -1; 1544 priv->oldduplex = -1;
1550 1545
1551 ph = of_get_property(np, "phy-handle", NULL); 1546 phydev = phy_connect(dev, ug_info->phy_bus_id, &adjust_link, 0,
1552 phy = of_find_node_by_phandle(*ph); 1547 priv->phy_interface);
1553 mdio = of_get_parent(phy);
1554
1555 id = of_get_property(phy, "reg", NULL);
1556
1557 of_node_put(phy);
1558 of_node_put(mdio);
1559
1560 fsl_pq_mdio_bus_name(bus_name, mdio);
1561 snprintf(phy_id, sizeof(phy_id), "%s:%02x",
1562 bus_name, *id);
1563
1564 phydev = phy_connect(dev, phy_id, &adjust_link, 0, priv->phy_interface);
1565 1548
1566 if (IS_ERR(phydev)) { 1549 if (IS_ERR(phydev)) {
1567 printk("%s: Could not attach to PHY\n", dev->name); 1550 printk("%s: Could not attach to PHY\n", dev->name);
@@ -3629,10 +3612,12 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma
3629 ug_info->uf_info.irq = irq_of_parse_and_map(np, 0); 3612 ug_info->uf_info.irq = irq_of_parse_and_map(np, 0);
3630 fixed_link = of_get_property(np, "fixed-link", NULL); 3613 fixed_link = of_get_property(np, "fixed-link", NULL);
3631 if (fixed_link) { 3614 if (fixed_link) {
3632 snprintf(ug_info->mdio_bus, MII_BUS_ID_SIZE, "0"); 3615 snprintf(ug_info->phy_bus_id, sizeof(ug_info->phy_bus_id),
3633 ug_info->phy_address = fixed_link[0]; 3616 PHY_ID_FMT, "0", fixed_link[0]);
3634 phy = NULL; 3617 phy = NULL;
3635 } else { 3618 } else {
3619 char bus_name[MII_BUS_ID_SIZE];
3620
3636 ph = of_get_property(np, "phy-handle", NULL); 3621 ph = of_get_property(np, "phy-handle", NULL);
3637 phy = of_find_node_by_phandle(*ph); 3622 phy = of_find_node_by_phandle(*ph);
3638 3623
@@ -3643,7 +3628,6 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma
3643 prop = of_get_property(phy, "reg", NULL); 3628 prop = of_get_property(phy, "reg", NULL);
3644 if (prop == NULL) 3629 if (prop == NULL)
3645 return -1; 3630 return -1;
3646 ug_info->phy_address = *prop;
3647 3631
3648 /* Set the bus id */ 3632 /* Set the bus id */
3649 mdio = of_get_parent(phy); 3633 mdio = of_get_parent(phy);
@@ -3657,8 +3641,14 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma
3657 if (err) 3641 if (err)
3658 return -1; 3642 return -1;
3659 3643
3644<<<<<<< HEAD:drivers/net/ucc_geth.c
3660 snprintf(ug_info->mdio_bus, MII_BUS_ID_SIZE, "%x", 3645 snprintf(ug_info->mdio_bus, MII_BUS_ID_SIZE, "%x",
3661 res.start&0xfffff); 3646 res.start&0xfffff);
3647=======
3648 uec_mdio_bus_name(bus_name, mdio);
3649 snprintf(ug_info->phy_bus_id, sizeof(ug_info->phy_bus_id),
3650 "%s:%02x", bus_name, *prop);
3651>>>>>>> 61fa9dcf9329cb92c220f7b656410fbe5e72f933:drivers/net/ucc_geth.c
3662 } 3652 }
3663 3653
3664 /* get the phy interface type, or default to MII */ 3654 /* get the phy interface type, or default to MII */
diff --git a/drivers/net/ucc_geth.h b/drivers/net/ucc_geth.h
index 66d18971fa0c..e3a25e64a652 100644
--- a/drivers/net/ucc_geth.h
+++ b/drivers/net/ucc_geth.h
@@ -1101,8 +1101,7 @@ struct ucc_geth_info {
1101 u32 eventRegMask; 1101 u32 eventRegMask;
1102 u16 pausePeriod; 1102 u16 pausePeriod;
1103 u16 extensionField; 1103 u16 extensionField;
1104 u8 phy_address; 1104 char phy_bus_id[BUS_ID_SIZE];
1105 char mdio_bus[MII_BUS_ID_SIZE];
1106 u8 weightfactor[NUM_TX_QUEUES]; 1105 u8 weightfactor[NUM_TX_QUEUES];
1107 u8 interruptcoalescingmaxvalue[NUM_RX_QUEUES]; 1106 u8 interruptcoalescingmaxvalue[NUM_RX_QUEUES];
1108 u8 l2qt[UCC_GETH_VLAN_PRIORITY_MAX]; 1107 u8 l2qt[UCC_GETH_VLAN_PRIORITY_MAX];
diff --git a/include/linux/dca.h b/include/linux/dca.h
index b00a753eda53..9c20c7e87d0a 100644
--- a/include/linux/dca.h
+++ b/include/linux/dca.h
@@ -1,3 +1,23 @@
1/*
2 * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the Free
6 * Software Foundation; either version 2 of the License, or (at your option)
7 * any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc., 59
16 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 *
18 * The full GNU General Public License is included in this distribution in the
19 * file called COPYING.
20 */
1#ifndef DCA_H 21#ifndef DCA_H
2#define DCA_H 22#define DCA_H
3/* DCA Provider API */ 23/* DCA Provider API */
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 8ac3d26014a8..ab9d8f14e151 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -1950,6 +1950,11 @@ static int nl80211_get_mesh_params(struct sk_buff *skb,
1950 if (err) 1950 if (err)
1951 return err; 1951 return err;
1952 1952
1953 if (!drv->ops->get_mesh_params) {
1954 err = -EOPNOTSUPP;
1955 goto out;
1956 }
1957
1953 /* Get the mesh params */ 1958 /* Get the mesh params */
1954 rtnl_lock(); 1959 rtnl_lock();
1955 err = drv->ops->get_mesh_params(&drv->wiphy, dev, &cur_params); 1960 err = drv->ops->get_mesh_params(&drv->wiphy, dev, &cur_params);
@@ -2059,6 +2064,11 @@ static int nl80211_set_mesh_params(struct sk_buff *skb, struct genl_info *info)
2059 if (err) 2064 if (err)
2060 return err; 2065 return err;
2061 2066
2067 if (!drv->ops->set_mesh_params) {
2068 err = -EOPNOTSUPP;
2069 goto out;
2070 }
2071
2062 /* This makes sure that there aren't more than 32 mesh config 2072 /* This makes sure that there aren't more than 32 mesh config
2063 * parameters (otherwise our bitfield scheme would not work.) */ 2073 * parameters (otherwise our bitfield scheme would not work.) */
2064 BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32); 2074 BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32);
@@ -2103,6 +2113,7 @@ static int nl80211_set_mesh_params(struct sk_buff *skb, struct genl_info *info)
2103 err = drv->ops->set_mesh_params(&drv->wiphy, dev, &cfg, mask); 2113 err = drv->ops->set_mesh_params(&drv->wiphy, dev, &cfg, mask);
2104 rtnl_unlock(); 2114 rtnl_unlock();
2105 2115
2116 out:
2106 /* cleanup */ 2117 /* cleanup */
2107 cfg80211_put_dev(drv); 2118 cfg80211_put_dev(drv);
2108 dev_put(dev); 2119 dev_put(dev);