Commit 8be7cdcc authored by David S. Miller's avatar David S. Miller

Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

Conflicts:
	drivers/net/ucc_geth.c
parents ecd41373 61fa9dcf
/*
* Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59
* Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* The full GNU General Public License is included in this distribution in the
* file called COPYING.
*/
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/device.h> #include <linux/device.h>
......
...@@ -1051,7 +1051,7 @@ config NI65 ...@@ -1051,7 +1051,7 @@ config NI65
config DNET config DNET
tristate "Dave ethernet support (DNET)" tristate "Dave ethernet support (DNET)"
depends on NET_ETHERNET depends on NET_ETHERNET && HAS_IOMEM
select PHYLIB select PHYLIB
help help
The Dave ethernet interface (DNET) is found on Qong Board FPGA. The Dave ethernet interface (DNET) is found on Qong Board FPGA.
......
...@@ -194,6 +194,7 @@ struct be_adapter { ...@@ -194,6 +194,7 @@ struct be_adapter {
struct be_eq_obj rx_eq; struct be_eq_obj rx_eq;
struct be_rx_obj rx_obj; struct be_rx_obj rx_obj;
u32 big_page_size; /* Compounded page size shared by rx wrbs */ u32 big_page_size; /* Compounded page size shared by rx wrbs */
bool rx_post_starved; /* Zero rx frags have been posted to BE */
struct vlan_group *vlan_grp; struct vlan_group *vlan_grp;
u16 num_vlans; u16 num_vlans;
......
...@@ -273,26 +273,6 @@ static void be_rx_eqd_update(struct be_adapter *adapter) ...@@ -273,26 +273,6 @@ static void be_rx_eqd_update(struct be_adapter *adapter)
rx_eq->cur_eqd = eqd; rx_eq->cur_eqd = eqd;
} }
static void be_worker(struct work_struct *work)
{
struct be_adapter *adapter =
container_of(work, struct be_adapter, work.work);
int status;
/* Check link */
be_link_status_update(adapter);
/* Get Stats */
status = be_cmd_get_stats(&adapter->ctrl, &adapter->stats.cmd);
if (!status)
netdev_stats_update(adapter);
/* Set EQ delay */
be_rx_eqd_update(adapter);
schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000));
}
static struct net_device_stats *be_get_stats(struct net_device *dev) static struct net_device_stats *be_get_stats(struct net_device *dev)
{ {
struct be_adapter *adapter = netdev_priv(dev); struct be_adapter *adapter = netdev_priv(dev);
...@@ -493,7 +473,7 @@ static int be_change_mtu(struct net_device *netdev, int new_mtu) ...@@ -493,7 +473,7 @@ static int be_change_mtu(struct net_device *netdev, int new_mtu)
* program them in BE. If more than BE_NUM_VLANS_SUPPORTED are configured, * program them in BE. If more than BE_NUM_VLANS_SUPPORTED are configured,
* set the BE in promiscuous VLAN mode. * set the BE in promiscuous VLAN mode.
*/ */
static void be_vids_config(struct net_device *netdev) static void be_vid_config(struct net_device *netdev)
{ {
struct be_adapter *adapter = netdev_priv(netdev); struct be_adapter *adapter = netdev_priv(netdev);
u16 vtag[BE_NUM_VLANS_SUPPORTED]; u16 vtag[BE_NUM_VLANS_SUPPORTED];
...@@ -536,7 +516,7 @@ static void be_vlan_add_vid(struct net_device *netdev, u16 vid) ...@@ -536,7 +516,7 @@ static void be_vlan_add_vid(struct net_device *netdev, u16 vid)
adapter->num_vlans++; adapter->num_vlans++;
adapter->vlan_tag[vid] = 1; adapter->vlan_tag[vid] = 1;
be_vids_config(netdev); be_vid_config(netdev);
} }
static void be_vlan_rem_vid(struct net_device *netdev, u16 vid) static 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,7 +527,7 @@ static void be_vlan_rem_vid(struct net_device *netdev, u16 vid)
adapter->vlan_tag[vid] = 0; adapter->vlan_tag[vid] = 0;
vlan_group_set_device(adapter->vlan_grp, vid, NULL); vlan_group_set_device(adapter->vlan_grp, vid, NULL);
be_vids_config(netdev); be_vid_config(netdev);
} }
static void be_set_multicast_filter(struct net_device *netdev) static void be_set_multicast_filter(struct net_device *netdev)
...@@ -900,8 +880,11 @@ static void be_post_rx_frags(struct be_adapter *adapter) ...@@ -900,8 +880,11 @@ static void be_post_rx_frags(struct be_adapter *adapter)
page_info->last_page_user = true; page_info->last_page_user = true;
if (posted) { if (posted) {
be_rxq_notify(&adapter->ctrl, rxq->id, posted);
atomic_add(posted, &rxq->used); atomic_add(posted, &rxq->used);
be_rxq_notify(&adapter->ctrl, rxq->id, posted);
} else if (atomic_read(&rxq->used) == 0) {
/* Let be_worker replenish when memory is available */
adapter->rx_post_starved = true;
} }
return; return;
...@@ -1305,6 +1288,31 @@ int be_poll_tx(struct napi_struct *napi, int budget) ...@@ -1305,6 +1288,31 @@ int be_poll_tx(struct napi_struct *napi, int budget)
return 1; return 1;
} }
static void be_worker(struct work_struct *work)
{
struct be_adapter *adapter =
container_of(work, struct be_adapter, work.work);
int status;
/* Check link */
be_link_status_update(adapter);
/* Get Stats */
status = be_cmd_get_stats(&adapter->ctrl, &adapter->stats.cmd);
if (!status)
netdev_stats_update(adapter);
/* Set EQ delay */
be_rx_eqd_update(adapter);
if (adapter->rx_post_starved) {
adapter->rx_post_starved = false;
be_post_rx_frags(adapter);
}
schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000));
}
static void be_msix_enable(struct be_adapter *adapter) static void be_msix_enable(struct be_adapter *adapter)
{ {
int i, status; int i, status;
...@@ -1422,6 +1430,8 @@ static int be_open(struct net_device *netdev) ...@@ -1422,6 +1430,8 @@ static int be_open(struct net_device *netdev)
if (status != 0) if (status != 0)
goto do_none; goto do_none;
be_vid_config(netdev);
status = be_cmd_set_flow_control(ctrl, true, true); status = be_cmd_set_flow_control(ctrl, true, true);
if (status != 0) if (status != 0)
goto if_destroy; goto if_destroy;
...@@ -1856,8 +1866,6 @@ static int be_resume(struct pci_dev *pdev) ...@@ -1856,8 +1866,6 @@ static int be_resume(struct pci_dev *pdev)
pci_set_power_state(pdev, 0); pci_set_power_state(pdev, 0);
pci_restore_state(pdev); pci_restore_state(pdev);
be_vids_config(netdev);
if (netif_running(netdev)) { if (netif_running(netdev)) {
rtnl_lock(); rtnl_lock();
be_open(netdev); be_open(netdev);
......
...@@ -930,13 +930,15 @@ static irqreturn_t dm9000_interrupt(int irq, void *dev_id) ...@@ -930,13 +930,15 @@ static irqreturn_t dm9000_interrupt(int irq, void *dev_id)
struct net_device *dev = dev_id; struct net_device *dev = dev_id;
board_info_t *db = netdev_priv(dev); board_info_t *db = netdev_priv(dev);
int int_status; int int_status;
unsigned long flags;
u8 reg_save; u8 reg_save;
dm9000_dbg(db, 3, "entering %s\n", __func__); dm9000_dbg(db, 3, "entering %s\n", __func__);
/* A real interrupt coming */ /* A real interrupt coming */
spin_lock(&db->lock); /* holders of db->lock must always block IRQs */
spin_lock_irqsave(&db->lock, flags);
/* Save previous register address */ /* Save previous register address */
reg_save = readb(db->io_addr); reg_save = readb(db->io_addr);
...@@ -972,7 +974,7 @@ static irqreturn_t dm9000_interrupt(int irq, void *dev_id) ...@@ -972,7 +974,7 @@ static irqreturn_t dm9000_interrupt(int irq, void *dev_id)
/* Restore previous register address */ /* Restore previous register address */
writeb(reg_save, db->io_addr); writeb(reg_save, db->io_addr);
spin_unlock(&db->lock); spin_unlock_irqrestore(&db->lock, flags);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
...@@ -279,11 +279,11 @@ static int dnet_mii_probe(struct net_device *dev) ...@@ -279,11 +279,11 @@ static int dnet_mii_probe(struct net_device *dev)
/* attach the mac to the phy */ /* attach the mac to the phy */
if (bp->capabilities & DNET_HAS_RMII) { if (bp->capabilities & DNET_HAS_RMII) {
phydev = phy_connect(dev, phydev->dev.bus_id, phydev = phy_connect(dev, dev_name(&phydev->dev),
&dnet_handle_link_change, 0, &dnet_handle_link_change, 0,
PHY_INTERFACE_MODE_RMII); PHY_INTERFACE_MODE_RMII);
} else { } else {
phydev = phy_connect(dev, phydev->dev.bus_id, phydev = phy_connect(dev, dev_name(&phydev->dev),
&dnet_handle_link_change, 0, &dnet_handle_link_change, 0,
PHY_INTERFACE_MODE_MII); PHY_INTERFACE_MODE_MII);
} }
...@@ -926,7 +926,7 @@ static int __devinit dnet_probe(struct platform_device *pdev) ...@@ -926,7 +926,7 @@ static int __devinit dnet_probe(struct platform_device *pdev)
phydev = bp->phy_dev; phydev = bp->phy_dev;
dev_info(&pdev->dev, "attached PHY driver [%s] " dev_info(&pdev->dev, "attached PHY driver [%s] "
"(mii_bus:phy_addr=%s, irq=%d)\n", "(mii_bus:phy_addr=%s, irq=%d)\n",
phydev->drv->name, phydev->dev.bus_id, phydev->irq); phydev->drv->name, dev_name(&phydev->dev), phydev->irq);
return 0; return 0;
......
...@@ -2998,8 +2998,11 @@ static const struct net_device_ops gem_netdev_ops = { ...@@ -2998,8 +2998,11 @@ static const struct net_device_ops gem_netdev_ops = {
.ndo_do_ioctl = gem_ioctl, .ndo_do_ioctl = gem_ioctl,
.ndo_tx_timeout = gem_tx_timeout, .ndo_tx_timeout = gem_tx_timeout,
.ndo_change_mtu = gem_change_mtu, .ndo_change_mtu = gem_change_mtu,
.ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_mac_address = gem_set_mac_address,
#ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = gem_poll_controller,
#endif
}; };
static int __devinit gem_init_one(struct pci_dev *pdev, static int __devinit gem_init_one(struct pci_dev *pdev,
...@@ -3161,10 +3164,6 @@ static int __devinit gem_init_one(struct pci_dev *pdev, ...@@ -3161,10 +3164,6 @@ static int __devinit gem_init_one(struct pci_dev *pdev,
dev->watchdog_timeo = 5 * HZ; dev->watchdog_timeo = 5 * HZ;
dev->irq = pdev->irq; dev->irq = pdev->irq;
dev->dma = 0; dev->dma = 0;
dev->set_mac_address = gem_set_mac_address;
#ifdef CONFIG_NET_POLL_CONTROLLER
dev->poll_controller = gem_poll_controller;
#endif
/* Set that now, in case PM kicks in now */ /* Set that now, in case PM kicks in now */
pci_set_drvdata(pdev, dev); pci_set_drvdata(pdev, dev);
......
...@@ -1536,32 +1536,15 @@ static void adjust_link(struct net_device *dev) ...@@ -1536,32 +1536,15 @@ static void adjust_link(struct net_device *dev)
static int init_phy(struct net_device *dev) static int init_phy(struct net_device *dev)
{ {
struct ucc_geth_private *priv = netdev_priv(dev); struct ucc_geth_private *priv = netdev_priv(dev);
struct device_node *np = priv->node; struct ucc_geth_info *ug_info = priv->ug_info;
struct device_node *phy, *mdio;
const phandle *ph;
char bus_name[MII_BUS_ID_SIZE];
const unsigned int *id;
struct phy_device *phydev; struct phy_device *phydev;
char phy_id[BUS_ID_SIZE];
priv->oldlink = 0; priv->oldlink = 0;
priv->oldspeed = 0; priv->oldspeed = 0;
priv->oldduplex = -1; priv->oldduplex = -1;
ph = of_get_property(np, "phy-handle", NULL); phydev = phy_connect(dev, ug_info->phy_bus_id, &adjust_link, 0,
phy = of_find_node_by_phandle(*ph); priv->phy_interface);
mdio = of_get_parent(phy);
id = of_get_property(phy, "reg", NULL);
of_node_put(phy);
of_node_put(mdio);
fsl_pq_mdio_bus_name(bus_name, mdio);
snprintf(phy_id, sizeof(phy_id), "%s:%02x",
bus_name, *id);
phydev = phy_connect(dev, phy_id, &adjust_link, 0, priv->phy_interface);
if (IS_ERR(phydev)) { if (IS_ERR(phydev)) {
printk("%s: Could not attach to PHY\n", dev->name); 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,10 +3612,12 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma
ug_info->uf_info.irq = irq_of_parse_and_map(np, 0); ug_info->uf_info.irq = irq_of_parse_and_map(np, 0);
fixed_link = of_get_property(np, "fixed-link", NULL); fixed_link = of_get_property(np, "fixed-link", NULL);
if (fixed_link) { if (fixed_link) {
snprintf(ug_info->mdio_bus, MII_BUS_ID_SIZE, "0"); snprintf(ug_info->phy_bus_id, sizeof(ug_info->phy_bus_id),
ug_info->phy_address = fixed_link[0]; PHY_ID_FMT, "0", fixed_link[0]);
phy = NULL; phy = NULL;
} else { } else {
char bus_name[MII_BUS_ID_SIZE];
ph = of_get_property(np, "phy-handle", NULL); ph = of_get_property(np, "phy-handle", NULL);
phy = of_find_node_by_phandle(*ph); phy = of_find_node_by_phandle(*ph);
...@@ -3643,7 +3628,6 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma ...@@ -3643,7 +3628,6 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma
prop = of_get_property(phy, "reg", NULL); prop = of_get_property(phy, "reg", NULL);
if (prop == NULL) if (prop == NULL)
return -1; return -1;
ug_info->phy_address = *prop;
/* Set the bus id */ /* Set the bus id */
mdio = of_get_parent(phy); 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,8 +3641,14 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma
if (err) if (err)
return -1; return -1;
<<<<<<< HEAD:drivers/net/ucc_geth.c
snprintf(ug_info->mdio_bus, MII_BUS_ID_SIZE, "%x", snprintf(ug_info->mdio_bus, MII_BUS_ID_SIZE, "%x",
res.start&0xfffff); res.start&0xfffff);
=======
uec_mdio_bus_name(bus_name, mdio);
snprintf(ug_info->phy_bus_id, sizeof(ug_info->phy_bus_id),
"%s:%02x", bus_name, *prop);
>>>>>>> 61fa9dcf9329cb92c220f7b656410fbe5e72f933:drivers/net/ucc_geth.c
} }
/* get the phy interface type, or default to MII */ /* get the phy interface type, or default to MII */
......
...@@ -1101,8 +1101,7 @@ struct ucc_geth_info { ...@@ -1101,8 +1101,7 @@ struct ucc_geth_info {
u32 eventRegMask; u32 eventRegMask;
u16 pausePeriod; u16 pausePeriod;
u16 extensionField; u16 extensionField;
u8 phy_address; char phy_bus_id[BUS_ID_SIZE];
char mdio_bus[MII_BUS_ID_SIZE];
u8 weightfactor[NUM_TX_QUEUES]; u8 weightfactor[NUM_TX_QUEUES];
u8 interruptcoalescingmaxvalue[NUM_RX_QUEUES]; u8 interruptcoalescingmaxvalue[NUM_RX_QUEUES];
u8 l2qt[UCC_GETH_VLAN_PRIORITY_MAX]; u8 l2qt[UCC_GETH_VLAN_PRIORITY_MAX];
......
/*
* Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59
* Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* The full GNU General Public License is included in this distribution in the
* file called COPYING.
*/
#ifndef DCA_H #ifndef DCA_H
#define DCA_H #define DCA_H
/* DCA Provider API */ /* DCA Provider API */
......
...@@ -1950,6 +1950,11 @@ static int nl80211_get_mesh_params(struct sk_buff *skb, ...@@ -1950,6 +1950,11 @@ static int nl80211_get_mesh_params(struct sk_buff *skb,
if (err) if (err)
return err; return err;
if (!drv->ops->get_mesh_params) {
err = -EOPNOTSUPP;
goto out;
}
/* Get the mesh params */ /* Get the mesh params */
rtnl_lock(); rtnl_lock();
err = drv->ops->get_mesh_params(&drv->wiphy, dev, &cur_params); 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,6 +2064,11 @@ static int nl80211_set_mesh_params(struct sk_buff *skb, struct genl_info *info)
if (err) if (err)
return err; return err;
if (!drv->ops->set_mesh_params) {
err = -EOPNOTSUPP;
goto out;
}
/* This makes sure that there aren't more than 32 mesh config /* This makes sure that there aren't more than 32 mesh config
* parameters (otherwise our bitfield scheme would not work.) */ * parameters (otherwise our bitfield scheme would not work.) */
BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32); 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,6 +2113,7 @@ static int nl80211_set_mesh_params(struct sk_buff *skb, struct genl_info *info)
err = drv->ops->set_mesh_params(&drv->wiphy, dev, &cfg, mask); err = drv->ops->set_mesh_params(&drv->wiphy, dev, &cfg, mask);
rtnl_unlock(); rtnl_unlock();
out:
/* cleanup */ /* cleanup */
cfg80211_put_dev(drv); cfg80211_put_dev(drv);
dev_put(dev); dev_put(dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment