Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (45 commits) cnic: Fix ISCSI_KEVENT_IF_DOWN message handling. net: irda: init spinlock after memcpy ixgbe: fix for 82599 errata marking UDP checksum errors r8169: WakeOnLan fix for the 8168 netxen: reset ring consumer during cleanup net/bridge: use kobject_put to release kobject in br_add_if error path smc91x.h: add config for Nomadik evaluation kit NET: ROSE: Don't use static buffer. eepro: Read buffer overflow tokenring: Read buffer overflow at1700: Read buffer overflow fealnx: Write outside array bounds ixgbe: remove unnecessary call to device_init_wakeup ixgbe: Don't priority tag control frames in DCB mode ixgbe: Enable FCoE offload when DCB is enabled for 82599 net: Rework mdio-ofgpio driver to use of_mdio infrastructure register at91_ether using platform_driver_probe skge: Enable WoL by default if supported net: KS8851 needs to depend on MII be2net: Bug fix in the non-lro path. Size of received packet was not updated in statistics properly. ...
This commit is contained in:
commit
f1462147f1
|
@ -1732,6 +1732,7 @@ config KS8842
|
|||
config KS8851
|
||||
tristate "Micrel KS8851 SPI"
|
||||
depends on SPI
|
||||
select MII
|
||||
help
|
||||
SPI driver for Micrel KS8851 SPI attached network chip.
|
||||
|
||||
|
|
|
@ -1228,7 +1228,6 @@ static int at91ether_resume(struct platform_device *pdev)
|
|||
#endif
|
||||
|
||||
static struct platform_driver at91ether_driver = {
|
||||
.probe = at91ether_probe,
|
||||
.remove = __devexit_p(at91ether_remove),
|
||||
.suspend = at91ether_suspend,
|
||||
.resume = at91ether_resume,
|
||||
|
@ -1240,7 +1239,7 @@ static struct platform_driver at91ether_driver = {
|
|||
|
||||
static int __init at91ether_init(void)
|
||||
{
|
||||
return platform_driver_register(&at91ether_driver);
|
||||
return platform_driver_probe(&at91ether_driver, at91ether_probe);
|
||||
}
|
||||
|
||||
static void __exit at91ether_exit(void)
|
||||
|
|
|
@ -318,7 +318,7 @@ static int __init at1700_probe1(struct net_device *dev, int ioaddr)
|
|||
pos3 = mca_read_stored_pos( slot, 3 );
|
||||
pos4 = mca_read_stored_pos( slot, 4 );
|
||||
|
||||
for (l_i = 0; l_i < 0x09; l_i++)
|
||||
for (l_i = 0; l_i < 8; l_i++)
|
||||
if (( pos3 & 0x07) == at1700_ioaddr_pattern[l_i])
|
||||
break;
|
||||
ioaddr = at1700_mca_probe_list[l_i];
|
||||
|
|
|
@ -667,7 +667,7 @@ static void skb_fill_rx_data(struct be_adapter *adapter,
|
|||
struct be_queue_info *rxq = &adapter->rx_obj.q;
|
||||
struct be_rx_page_info *page_info;
|
||||
u16 rxq_idx, i, num_rcvd, j;
|
||||
u32 pktsize, hdr_len, curr_frag_len;
|
||||
u32 pktsize, hdr_len, curr_frag_len, size;
|
||||
u8 *start;
|
||||
|
||||
rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp);
|
||||
|
@ -708,12 +708,13 @@ static void skb_fill_rx_data(struct be_adapter *adapter,
|
|||
}
|
||||
|
||||
/* More frags present for this completion */
|
||||
pktsize -= curr_frag_len; /* account for above copied frag */
|
||||
size = pktsize;
|
||||
for (i = 1, j = 0; i < num_rcvd; i++) {
|
||||
size -= curr_frag_len;
|
||||
index_inc(&rxq_idx, rxq->len);
|
||||
page_info = get_rx_page_info(adapter, rxq_idx);
|
||||
|
||||
curr_frag_len = min(pktsize, rx_frag_size);
|
||||
curr_frag_len = min(size, rx_frag_size);
|
||||
|
||||
/* Coalesce all frags from the same physical page in one slot */
|
||||
if (page_info->page_offset == 0) {
|
||||
|
@ -731,7 +732,6 @@ static void skb_fill_rx_data(struct be_adapter *adapter,
|
|||
skb_shinfo(skb)->frags[j].size += curr_frag_len;
|
||||
skb->len += curr_frag_len;
|
||||
skb->data_len += curr_frag_len;
|
||||
pktsize -= curr_frag_len;
|
||||
|
||||
memset(page_info, 0, sizeof(*page_info));
|
||||
}
|
||||
|
|
|
@ -227,7 +227,7 @@ static int cnic_send_nlmsg(struct cnic_local *cp, u32 type,
|
|||
}
|
||||
|
||||
rcu_read_lock();
|
||||
ulp_ops = rcu_dereference(cp->ulp_ops[CNIC_ULP_ISCSI]);
|
||||
ulp_ops = rcu_dereference(cnic_ulp_tbl[CNIC_ULP_ISCSI]);
|
||||
if (ulp_ops)
|
||||
ulp_ops->iscsi_nl_send_msg(cp->dev, msg_type, buf, len);
|
||||
rcu_read_unlock();
|
||||
|
@ -319,6 +319,20 @@ static int cnic_abort_prep(struct cnic_sock *csk)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void cnic_uio_stop(void)
|
||||
{
|
||||
struct cnic_dev *dev;
|
||||
|
||||
read_lock(&cnic_dev_lock);
|
||||
list_for_each_entry(dev, &cnic_dev_list, list) {
|
||||
struct cnic_local *cp = dev->cnic_priv;
|
||||
|
||||
if (cp->cnic_uinfo)
|
||||
cnic_send_nlmsg(cp, ISCSI_KEVENT_IF_DOWN, NULL);
|
||||
}
|
||||
read_unlock(&cnic_dev_lock);
|
||||
}
|
||||
|
||||
int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops)
|
||||
{
|
||||
struct cnic_dev *dev;
|
||||
|
@ -390,6 +404,9 @@ int cnic_unregister_driver(int ulp_type)
|
|||
}
|
||||
read_unlock(&cnic_dev_lock);
|
||||
|
||||
if (ulp_type == CNIC_ULP_ISCSI)
|
||||
cnic_uio_stop();
|
||||
|
||||
rcu_assign_pointer(cnic_ulp_tbl[ulp_type], NULL);
|
||||
|
||||
mutex_unlock(&cnic_lock);
|
||||
|
@ -632,7 +649,6 @@ static void cnic_free_resc(struct cnic_dev *dev)
|
|||
int i = 0;
|
||||
|
||||
if (cp->cnic_uinfo) {
|
||||
cnic_send_nlmsg(cp, ISCSI_KEVENT_IF_DOWN, NULL);
|
||||
while (cp->uio_dev != -1 && i < 15) {
|
||||
msleep(100);
|
||||
i++;
|
||||
|
@ -1057,6 +1073,9 @@ static void cnic_ulp_stop(struct cnic_dev *dev)
|
|||
struct cnic_local *cp = dev->cnic_priv;
|
||||
int if_type;
|
||||
|
||||
if (cp->cnic_uinfo)
|
||||
cnic_send_nlmsg(cp, ISCSI_KEVENT_IF_DOWN, NULL);
|
||||
|
||||
rcu_read_lock();
|
||||
for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) {
|
||||
struct cnic_ulp_ops *ulp_ops;
|
||||
|
|
|
@ -1784,7 +1784,7 @@ int __init init_module(void)
|
|||
printk(KERN_INFO "eepro_init_module: Auto-detecting boards (May God protect us...)\n");
|
||||
}
|
||||
|
||||
for (i = 0; io[i] != -1 && i < MAX_EEPRO; i++) {
|
||||
for (i = 0; i < MAX_EEPRO && io[i] != -1; i++) {
|
||||
dev = alloc_etherdev(sizeof(struct eepro_local));
|
||||
if (!dev)
|
||||
break;
|
||||
|
|
|
@ -584,7 +584,8 @@ static int __devinit fealnx_init_one(struct pci_dev *pdev,
|
|||
if (np->flags == HAS_MII_XCVR) {
|
||||
int phy, phy_idx = 0;
|
||||
|
||||
for (phy = 1; phy < 32 && phy_idx < 4; phy++) {
|
||||
for (phy = 1; phy < 32 && phy_idx < ARRAY_SIZE(np->phys);
|
||||
phy++) {
|
||||
int mii_status = mdio_read(dev, phy, 1);
|
||||
|
||||
if (mii_status != 0xffff && mii_status != 0x0000) {
|
||||
|
|
|
@ -754,17 +754,16 @@ static int fs_init_phy(struct net_device *dev)
|
|||
fep->oldlink = 0;
|
||||
fep->oldspeed = 0;
|
||||
fep->oldduplex = -1;
|
||||
if(fep->fpi->phy_node)
|
||||
phydev = of_phy_connect(dev, fep->fpi->phy_node,
|
||||
&fs_adjust_link, 0,
|
||||
PHY_INTERFACE_MODE_MII);
|
||||
else {
|
||||
printk("No phy bus ID specified in BSP code\n");
|
||||
return -EINVAL;
|
||||
|
||||
phydev = of_phy_connect(dev, fep->fpi->phy_node, &fs_adjust_link, 0,
|
||||
PHY_INTERFACE_MODE_MII);
|
||||
if (!phydev) {
|
||||
phydev = of_phy_connect_fixed_link(dev, &fs_adjust_link,
|
||||
PHY_INTERFACE_MODE_MII);
|
||||
}
|
||||
if (IS_ERR(phydev)) {
|
||||
printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
|
||||
return PTR_ERR(phydev);
|
||||
if (!phydev) {
|
||||
dev_err(&dev->dev, "Could not attach to PHY\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
fep->phydev = phydev;
|
||||
|
@ -1005,6 +1004,7 @@ static int __devinit fs_enet_probe(struct of_device *ofdev,
|
|||
goto out_free_fpi;
|
||||
}
|
||||
|
||||
SET_NETDEV_DEV(ndev, &ofdev->dev);
|
||||
dev_set_drvdata(&ofdev->dev, ndev);
|
||||
|
||||
fep = netdev_priv(ndev);
|
||||
|
|
|
@ -264,15 +264,6 @@ static int gfar_of_init(struct net_device *dev)
|
|||
priv->device_flags |= FSL_GIANFAR_DEV_HAS_MAGIC_PACKET;
|
||||
|
||||
priv->phy_node = of_parse_phandle(np, "phy-handle", 0);
|
||||
if (!priv->phy_node) {
|
||||
u32 *fixed_link;
|
||||
|
||||
fixed_link = (u32 *)of_get_property(np, "fixed-link", NULL);
|
||||
if (!fixed_link) {
|
||||
err = -ENODEV;
|
||||
goto err_out;
|
||||
}
|
||||
}
|
||||
|
||||
/* Find the TBI PHY. If it's not there, we don't support SGMII */
|
||||
priv->tbi_node = of_parse_phandle(np, "tbi-handle", 0);
|
||||
|
@ -659,13 +650,14 @@ static int init_phy(struct net_device *dev)
|
|||
|
||||
interface = gfar_get_interface(dev);
|
||||
|
||||
if (priv->phy_node) {
|
||||
priv->phydev = of_phy_connect(dev, priv->phy_node, &adjust_link,
|
||||
0, interface);
|
||||
if (!priv->phydev) {
|
||||
dev_err(&dev->dev, "error: Could not attach to PHY\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
priv->phydev = of_phy_connect(dev, priv->phy_node, &adjust_link, 0,
|
||||
interface);
|
||||
if (!priv->phydev)
|
||||
priv->phydev = of_phy_connect_fixed_link(dev, &adjust_link,
|
||||
interface);
|
||||
if (!priv->phydev) {
|
||||
dev_err(&dev->dev, "could not attach to PHY\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (interface == PHY_INTERFACE_MODE_SGMII)
|
||||
|
|
|
@ -327,6 +327,7 @@ struct ixgbe_adapter {
|
|||
#define IXGBE_FLAG_IN_SFP_MOD_TASK (u32)(1 << 25)
|
||||
#define IXGBE_FLAG_FDIR_HASH_CAPABLE (u32)(1 << 26)
|
||||
#define IXGBE_FLAG_FDIR_PERFECT_CAPABLE (u32)(1 << 27)
|
||||
#define IXGBE_FLAG_FCOE_CAPABLE (u32)(1 << 28)
|
||||
#define IXGBE_FLAG_FCOE_ENABLED (u32)(1 << 29)
|
||||
|
||||
u32 flags2;
|
||||
|
|
|
@ -139,6 +139,18 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
|
|||
adapter->flags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE;
|
||||
}
|
||||
adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
|
||||
#ifdef IXGBE_FCOE
|
||||
/* Turn on FCoE offload */
|
||||
if ((adapter->flags & IXGBE_FLAG_FCOE_CAPABLE) &&
|
||||
(!(adapter->flags & IXGBE_FLAG_FCOE_ENABLED))) {
|
||||
adapter->flags |= IXGBE_FLAG_FCOE_ENABLED;
|
||||
adapter->ring_feature[RING_F_FCOE].indices =
|
||||
IXGBE_FCRETA_SIZE;
|
||||
netdev->features |= NETIF_F_FCOE_CRC;
|
||||
netdev->features |= NETIF_F_FSO;
|
||||
netdev->fcoe_ddp_xid = IXGBE_FCOE_DDP_MAX - 1;
|
||||
}
|
||||
#endif /* IXGBE_FCOE */
|
||||
ixgbe_init_interrupt_scheme(adapter);
|
||||
if (netif_running(netdev))
|
||||
netdev->netdev_ops->ndo_open(netdev);
|
||||
|
@ -156,6 +168,18 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
|
|||
adapter->flags |= IXGBE_FLAG_RSS_ENABLED;
|
||||
if (adapter->hw.mac.type == ixgbe_mac_82599EB)
|
||||
adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE;
|
||||
|
||||
#ifdef IXGBE_FCOE
|
||||
/* Turn off FCoE offload */
|
||||
if (adapter->flags & (IXGBE_FLAG_FCOE_CAPABLE |
|
||||
IXGBE_FLAG_FCOE_ENABLED)) {
|
||||
adapter->flags &= ~IXGBE_FLAG_FCOE_ENABLED;
|
||||
adapter->ring_feature[RING_F_FCOE].indices = 0;
|
||||
netdev->features &= ~NETIF_F_FCOE_CRC;
|
||||
netdev->features &= ~NETIF_F_FSO;
|
||||
netdev->fcoe_ddp_xid = 0;
|
||||
}
|
||||
#endif /* IXGBE_FCOE */
|
||||
ixgbe_init_interrupt_scheme(adapter);
|
||||
if (netif_running(netdev))
|
||||
netdev->netdev_ops->ndo_open(netdev);
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include <linux/in.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/tcp.h>
|
||||
#include <linux/pkt_sched.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <net/checksum.h>
|
||||
#include <net/ip6_checksum.h>
|
||||
|
@ -510,8 +511,11 @@ static void ixgbe_receive_skb(struct ixgbe_q_vector *q_vector,
|
|||
* @skb: skb currently being received and modified
|
||||
**/
|
||||
static inline void ixgbe_rx_checksum(struct ixgbe_adapter *adapter,
|
||||
u32 status_err, struct sk_buff *skb)
|
||||
union ixgbe_adv_rx_desc *rx_desc,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
u32 status_err = le32_to_cpu(rx_desc->wb.upper.status_error);
|
||||
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
|
||||
/* Rx csum disabled */
|
||||
|
@ -529,6 +533,16 @@ static inline void ixgbe_rx_checksum(struct ixgbe_adapter *adapter,
|
|||
return;
|
||||
|
||||
if (status_err & IXGBE_RXDADV_ERR_TCPE) {
|
||||
u16 pkt_info = rx_desc->wb.lower.lo_dword.hs_rss.pkt_info;
|
||||
|
||||
/*
|
||||
* 82599 errata, UDP frames with a 0 checksum can be marked as
|
||||
* checksum errors.
|
||||
*/
|
||||
if ((pkt_info & IXGBE_RXDADV_PKTTYPE_UDP) &&
|
||||
(adapter->hw.mac.type == ixgbe_mac_82599EB))
|
||||
return;
|
||||
|
||||
adapter->hw_csum_rx_error++;
|
||||
return;
|
||||
}
|
||||
|
@ -802,7 +816,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|||
goto next_desc;
|
||||
}
|
||||
|
||||
ixgbe_rx_checksum(adapter, staterr, skb);
|
||||
ixgbe_rx_checksum(adapter, rx_desc, skb);
|
||||
|
||||
/* probably a little skewed due to removing CRC */
|
||||
total_rx_bytes += skb->len;
|
||||
|
@ -3806,8 +3820,9 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)
|
|||
adapter->atr_sample_rate = 20;
|
||||
adapter->fdir_pballoc = 0;
|
||||
#ifdef IXGBE_FCOE
|
||||
adapter->flags |= IXGBE_FLAG_FCOE_ENABLED;
|
||||
adapter->ring_feature[RING_F_FCOE].indices = IXGBE_FCRETA_SIZE;
|
||||
adapter->flags |= IXGBE_FLAG_FCOE_CAPABLE;
|
||||
adapter->flags &= ~IXGBE_FLAG_FCOE_ENABLED;
|
||||
adapter->ring_feature[RING_F_FCOE].indices = 0;
|
||||
#endif /* IXGBE_FCOE */
|
||||
}
|
||||
|
||||
|
@ -5125,9 +5140,6 @@ static int ixgbe_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|||
int count = 0;
|
||||
unsigned int f;
|
||||
|
||||
r_idx = skb->queue_mapping;
|
||||
tx_ring = &adapter->tx_ring[r_idx];
|
||||
|
||||
if (adapter->vlgrp && vlan_tx_tag_present(skb)) {
|
||||
tx_flags |= vlan_tx_tag_get(skb);
|
||||
if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
|
||||
|
@ -5137,11 +5149,19 @@ static int ixgbe_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|||
tx_flags <<= IXGBE_TX_FLAGS_VLAN_SHIFT;
|
||||
tx_flags |= IXGBE_TX_FLAGS_VLAN;
|
||||
} else if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
|
||||
tx_flags |= (skb->queue_mapping << 13);
|
||||
tx_flags <<= IXGBE_TX_FLAGS_VLAN_SHIFT;
|
||||
tx_flags |= IXGBE_TX_FLAGS_VLAN;
|
||||
if (skb->priority != TC_PRIO_CONTROL) {
|
||||
tx_flags |= (skb->queue_mapping << 13);
|
||||
tx_flags <<= IXGBE_TX_FLAGS_VLAN_SHIFT;
|
||||
tx_flags |= IXGBE_TX_FLAGS_VLAN;
|
||||
} else {
|
||||
skb->queue_mapping =
|
||||
adapter->ring_feature[RING_F_DCB].indices-1;
|
||||
}
|
||||
}
|
||||
|
||||
r_idx = skb->queue_mapping;
|
||||
tx_ring = &adapter->tx_ring[r_idx];
|
||||
|
||||
if ((adapter->flags & IXGBE_FLAG_FCOE_ENABLED) &&
|
||||
(skb->protocol == htons(ETH_P_FCOE)))
|
||||
tx_flags |= IXGBE_TX_FLAGS_FCOE;
|
||||
|
@ -5580,16 +5600,11 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
|
|||
#endif
|
||||
|
||||
#ifdef IXGBE_FCOE
|
||||
if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) {
|
||||
if (adapter->flags & IXGBE_FLAG_FCOE_CAPABLE) {
|
||||
if (hw->mac.ops.get_device_caps) {
|
||||
hw->mac.ops.get_device_caps(hw, &device_caps);
|
||||
if (!(device_caps & IXGBE_DEVICE_CAPS_FCOE_OFFLOADS)) {
|
||||
netdev->features |= NETIF_F_FCOE_CRC;
|
||||
netdev->features |= NETIF_F_FSO;
|
||||
netdev->fcoe_ddp_xid = IXGBE_FCOE_DDP_MAX - 1;
|
||||
} else {
|
||||
adapter->flags &= ~IXGBE_FLAG_FCOE_ENABLED;
|
||||
}
|
||||
if (device_caps & IXGBE_DEVICE_CAPS_FCOE_OFFLOADS)
|
||||
adapter->flags &= ~IXGBE_FLAG_FCOE_CAPABLE;
|
||||
}
|
||||
}
|
||||
#endif /* IXGBE_FCOE */
|
||||
|
@ -5638,7 +5653,6 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
|
|||
adapter->wol = 0;
|
||||
break;
|
||||
}
|
||||
device_init_wakeup(&adapter->pdev->dev, true);
|
||||
device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
|
||||
|
||||
/* pick up the PCI bus settings for reporting later */
|
||||
|
|
|
@ -184,6 +184,13 @@ void netxen_free_sw_resources(struct netxen_adapter *adapter)
|
|||
kfree(recv_ctx->rds_rings);
|
||||
|
||||
skip_rds:
|
||||
if (recv_ctx->sds_rings == NULL)
|
||||
goto skip_sds;
|
||||
|
||||
for(ring = 0; ring < adapter->max_sds_rings; ring++)
|
||||
recv_ctx->sds_rings[ring].consumer = 0;
|
||||
|
||||
skip_sds:
|
||||
if (adapter->tx_ring == NULL)
|
||||
return;
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
|
||||
#ifdef CONFIG_OF_GPIO
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/of_mdio.h>
|
||||
#include <linux/of_platform.h>
|
||||
#endif
|
||||
|
||||
|
@ -81,13 +82,12 @@ static struct mdiobb_ops mdio_gpio_ops = {
|
|||
.get_mdio_data = mdio_get,
|
||||
};
|
||||
|
||||
static int __devinit mdio_gpio_bus_init(struct device *dev,
|
||||
static struct mii_bus * __devinit mdio_gpio_bus_init(struct device *dev,
|
||||
struct mdio_gpio_platform_data *pdata,
|
||||
int bus_id)
|
||||
{
|
||||
struct mii_bus *new_bus;
|
||||
struct mdio_gpio_info *bitbang;
|
||||
int ret = -ENOMEM;
|
||||
int i;
|
||||
|
||||
bitbang = kzalloc(sizeof(*bitbang), GFP_KERNEL);
|
||||
|
@ -104,8 +104,6 @@ static int __devinit mdio_gpio_bus_init(struct device *dev,
|
|||
|
||||
new_bus->name = "GPIO Bitbanged MDIO",
|
||||
|
||||
ret = -ENODEV;
|
||||
|
||||
new_bus->phy_mask = pdata->phy_mask;
|
||||
new_bus->irq = pdata->irqs;
|
||||
new_bus->parent = dev;
|
||||
|
@ -129,15 +127,8 @@ static int __devinit mdio_gpio_bus_init(struct device *dev,
|
|||
|
||||
dev_set_drvdata(dev, new_bus);
|
||||
|
||||
ret = mdiobus_register(new_bus);
|
||||
if (ret)
|
||||
goto out_free_all;
|
||||
return new_bus;
|
||||
|
||||
return 0;
|
||||
|
||||
out_free_all:
|
||||
dev_set_drvdata(dev, NULL);
|
||||
gpio_free(bitbang->mdio);
|
||||
out_free_mdc:
|
||||
gpio_free(bitbang->mdc);
|
||||
out_free_bus:
|
||||
|
@ -145,30 +136,47 @@ out_free_bus:
|
|||
out_free_bitbang:
|
||||
kfree(bitbang);
|
||||
out:
|
||||
return ret;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void __devinit mdio_gpio_bus_deinit(struct device *dev)
|
||||
{
|
||||
struct mii_bus *bus = dev_get_drvdata(dev);
|
||||
struct mdio_gpio_info *bitbang = bus->priv;
|
||||
|
||||
dev_set_drvdata(dev, NULL);
|
||||
gpio_free(bitbang->mdio);
|
||||
gpio_free(bitbang->mdc);
|
||||
free_mdio_bitbang(bus);
|
||||
kfree(bitbang);
|
||||
}
|
||||
|
||||
static void __devexit mdio_gpio_bus_destroy(struct device *dev)
|
||||
{
|
||||
struct mii_bus *bus = dev_get_drvdata(dev);
|
||||
struct mdio_gpio_info *bitbang = bus->priv;
|
||||
|
||||
mdiobus_unregister(bus);
|
||||
free_mdio_bitbang(bus);
|
||||
dev_set_drvdata(dev, NULL);
|
||||
gpio_free(bitbang->mdc);
|
||||
gpio_free(bitbang->mdio);
|
||||
kfree(bitbang);
|
||||
mdio_gpio_bus_deinit(dev);
|
||||
}
|
||||
|
||||
static int __devinit mdio_gpio_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct mdio_gpio_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct mii_bus *new_bus;
|
||||
int ret;
|
||||
|
||||
if (!pdata)
|
||||
return -ENODEV;
|
||||
|
||||
return mdio_gpio_bus_init(&pdev->dev, pdata, pdev->id);
|
||||
new_bus = mdio_gpio_bus_init(&pdev->dev, pdata, pdev->id);
|
||||
if (!new_bus)
|
||||
return -ENODEV;
|
||||
|
||||
ret = mdiobus_register(new_bus);
|
||||
if (ret)
|
||||
mdio_gpio_bus_deinit(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devexit mdio_gpio_remove(struct platform_device *pdev)
|
||||
|
@ -179,29 +187,12 @@ static int __devexit mdio_gpio_remove(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_OF_GPIO
|
||||
static void __devinit add_phy(struct mdio_gpio_platform_data *pdata,
|
||||
struct device_node *np)
|
||||
{
|
||||
const u32 *data;
|
||||
int len, id, irq;
|
||||
|
||||
data = of_get_property(np, "reg", &len);
|
||||
if (!data || len != 4)
|
||||
return;
|
||||
|
||||
id = *data;
|
||||
pdata->phy_mask &= ~(1 << id);
|
||||
|
||||
irq = of_irq_to_resource(np, 0, NULL);
|
||||
if (irq)
|
||||
pdata->irqs[id] = irq;
|
||||
}
|
||||
|
||||
static int __devinit mdio_ofgpio_probe(struct of_device *ofdev,
|
||||
const struct of_device_id *match)
|
||||
{
|
||||
struct device_node *np = NULL;
|
||||
struct mdio_gpio_platform_data *pdata;
|
||||
struct mii_bus *new_bus;
|
||||
int ret;
|
||||
|
||||
pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
|
||||
|
@ -215,14 +206,18 @@ static int __devinit mdio_ofgpio_probe(struct of_device *ofdev,
|
|||
|
||||
ret = of_get_gpio(ofdev->node, 1);
|
||||
if (ret < 0)
|
||||
goto out_free;
|
||||
goto out_free;
|
||||
pdata->mdio = ret;
|
||||
|
||||
while ((np = of_get_next_child(ofdev->node, np)))
|
||||
if (!strcmp(np->type, "ethernet-phy"))
|
||||
add_phy(pdata, np);
|
||||
new_bus = mdio_gpio_bus_init(&ofdev->dev, pdata, pdata->mdc);
|
||||
if (!new_bus)
|
||||
return -ENODEV;
|
||||
|
||||
return mdio_gpio_bus_init(&ofdev->dev, pdata, pdata->mdc);
|
||||
ret = of_mdiobus_register(new_bus, ofdev->node);
|
||||
if (ret)
|
||||
mdio_gpio_bus_deinit(&ofdev->dev);
|
||||
|
||||
return ret;
|
||||
|
||||
out_free:
|
||||
kfree(pdata);
|
||||
|
|
|
@ -2060,8 +2060,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
}
|
||||
}
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
/* ioremap MMIO region */
|
||||
ioaddr = ioremap(pci_resource_start(pdev, region), R8169_REGS_SIZE);
|
||||
if (!ioaddr) {
|
||||
|
@ -2089,6 +2087,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
|
||||
RTL_W16(IntrStatus, 0xffff);
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
/* Identify chip attached to board */
|
||||
rtl8169_get_mac_version(tp, ioaddr);
|
||||
|
||||
|
@ -3874,6 +3874,15 @@ static void rtl_shutdown(struct pci_dev *pdev)
|
|||
spin_unlock_irq(&tp->lock);
|
||||
|
||||
if (system_state == SYSTEM_POWER_OFF) {
|
||||
/* WoL fails with some 8168 when the receiver is disabled. */
|
||||
if (tp->features & RTL_FEATURE_WOL) {
|
||||
pci_clear_master(pdev);
|
||||
|
||||
RTL_W8(ChipCmd, CmdRxEnb);
|
||||
/* PCI commit */
|
||||
RTL_R8(ChipCmd);
|
||||
}
|
||||
|
||||
pci_wake_from_d3(pdev, true);
|
||||
pci_set_power_state(pdev, PCI_D3hot);
|
||||
}
|
||||
|
|
|
@ -3854,8 +3854,10 @@ static struct net_device *skge_devinit(struct skge_hw *hw, int port,
|
|||
skge->speed = -1;
|
||||
skge->advertising = skge_supported_modes(hw);
|
||||
|
||||
if (device_may_wakeup(&hw->pdev->dev))
|
||||
if (device_can_wakeup(&hw->pdev->dev)) {
|
||||
skge->wol = wol_supported(hw) & WAKE_MAGIC;
|
||||
device_set_wakeup_enable(&hw->pdev->dev, skge->wol);
|
||||
}
|
||||
|
||||
hw->dev[port] = dev;
|
||||
|
||||
|
|
|
@ -186,7 +186,8 @@ static inline void SMC_outw(u16 val, void __iomem *ioaddr, int reg)
|
|||
#define SMC_outsb(a, r, p, l) writesb((a) + (r), p, (l))
|
||||
#define SMC_IRQ_FLAGS (-1) /* from resource */
|
||||
|
||||
#elif defined(CONFIG_MACH_LOGICPD_PXA270)
|
||||
#elif defined(CONFIG_MACH_LOGICPD_PXA270) \
|
||||
|| defined(CONFIG_MACH_NOMADIK_8815NHK)
|
||||
|
||||
#define SMC_CAN_USE_8BIT 0
|
||||
#define SMC_CAN_USE_16BIT 1
|
||||
|
|
|
@ -1912,7 +1912,7 @@ static int __init ibmtr_init(void)
|
|||
|
||||
find_turbo_adapters(io);
|
||||
|
||||
for (i = 0; io[i] && (i < IBMTR_MAX_ADAPTERS); i++) {
|
||||
for (i = 0; i < IBMTR_MAX_ADAPTERS && io[i]; i++) {
|
||||
struct net_device *dev;
|
||||
irq[i] = 0;
|
||||
mem[i] = 0;
|
||||
|
|
|
@ -1590,13 +1590,13 @@ static int init_phy(struct net_device *dev)
|
|||
priv->oldspeed = 0;
|
||||
priv->oldduplex = -1;
|
||||
|
||||
if (!ug_info->phy_node)
|
||||
return 0;
|
||||
|
||||
phydev = of_phy_connect(dev, ug_info->phy_node, &adjust_link, 0,
|
||||
priv->phy_interface);
|
||||
if (!phydev)
|
||||
phydev = of_phy_connect_fixed_link(dev, &adjust_link,
|
||||
priv->phy_interface);
|
||||
if (!phydev) {
|
||||
printk("%s: Could not attach to PHY\n", dev->name);
|
||||
dev_err(&dev->dev, "Could not attach to PHY\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
@ -3608,9 +3608,7 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma
|
|||
struct ucc_geth_private *ugeth = NULL;
|
||||
struct ucc_geth_info *ug_info;
|
||||
struct resource res;
|
||||
struct device_node *phy;
|
||||
int err, ucc_num, max_speed = 0;
|
||||
const u32 *fixed_link;
|
||||
const unsigned int *prop;
|
||||
const char *sprop;
|
||||
const void *mac_addr;
|
||||
|
@ -3708,15 +3706,8 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma
|
|||
|
||||
ug_info->uf_info.regs = res.start;
|
||||
ug_info->uf_info.irq = irq_of_parse_and_map(np, 0);
|
||||
fixed_link = of_get_property(np, "fixed-link", NULL);
|
||||
if (fixed_link) {
|
||||
phy = NULL;
|
||||
} else {
|
||||
phy = of_parse_phandle(np, "phy-handle", 0);
|
||||
if (phy == NULL)
|
||||
return -ENODEV;
|
||||
}
|
||||
ug_info->phy_node = phy;
|
||||
|
||||
ug_info->phy_node = of_parse_phandle(np, "phy-handle", 0);
|
||||
|
||||
/* Find the TBI PHY node. If it's not there, we don't support SGMII */
|
||||
ug_info->tbi_node = of_parse_phandle(np, "tbi-handle", 0);
|
||||
|
@ -3725,7 +3716,7 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma
|
|||
prop = of_get_property(np, "phy-connection-type", NULL);
|
||||
if (!prop) {
|
||||
/* handle interface property present in old trees */
|
||||
prop = of_get_property(phy, "interface", NULL);
|
||||
prop = of_get_property(ug_info->phy_node, "interface", NULL);
|
||||
if (prop != NULL) {
|
||||
phy_interface = enet_to_phy_interface[*prop];
|
||||
max_speed = enet_to_speed[*prop];
|
||||
|
|
|
@ -2970,6 +2970,9 @@ ath5k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
|||
if (modparam_nohwcrypt)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (sc->opmode == NL80211_IFTYPE_AP)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
switch (key->alg) {
|
||||
case ALG_WEP:
|
||||
case ALG_TKIP:
|
||||
|
|
|
@ -478,6 +478,18 @@ void ath9k_ani_reset(struct ath_hw *ah)
|
|||
"Reset ANI state opmode %u\n", ah->opmode);
|
||||
ah->stats.ast_ani_reset++;
|
||||
|
||||
if (ah->opmode == NL80211_IFTYPE_AP) {
|
||||
/*
|
||||
* ath9k_hw_ani_control() will only process items set on
|
||||
* ah->ani_function
|
||||
*/
|
||||
if (IS_CHAN_2GHZ(chan))
|
||||
ah->ani_function = (ATH9K_ANI_SPUR_IMMUNITY_LEVEL |
|
||||
ATH9K_ANI_FIRSTEP_LEVEL);
|
||||
else
|
||||
ah->ani_function = 0;
|
||||
}
|
||||
|
||||
ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, 0);
|
||||
ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, 0);
|
||||
ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, 0);
|
||||
|
|
|
@ -474,6 +474,21 @@ ath_regd_init_wiphy(struct ath_regulatory *reg,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some users have reported their EEPROM programmed with
|
||||
* 0x8000 set, this is not a supported regulatory domain
|
||||
* but since we have more than one user with it we need
|
||||
* a solution for them. We default to 0x64, which is the
|
||||
* default Atheros world regulatory domain.
|
||||
*/
|
||||
static void ath_regd_sanitize(struct ath_regulatory *reg)
|
||||
{
|
||||
if (reg->current_rd != COUNTRY_ERD_FLAG)
|
||||
return;
|
||||
printk(KERN_DEBUG "ath: EEPROM regdomain sanitized\n");
|
||||
reg->current_rd = 0x64;
|
||||
}
|
||||
|
||||
int
|
||||
ath_regd_init(struct ath_regulatory *reg,
|
||||
struct wiphy *wiphy,
|
||||
|
@ -486,6 +501,8 @@ ath_regd_init(struct ath_regulatory *reg,
|
|||
if (!reg)
|
||||
return -EINVAL;
|
||||
|
||||
ath_regd_sanitize(reg);
|
||||
|
||||
printk(KERN_DEBUG "ath: EEPROM regdomain: 0x%0x\n", reg->current_rd);
|
||||
|
||||
if (!ath_regd_is_eeprom_valid(reg)) {
|
||||
|
|
|
@ -2675,12 +2675,10 @@ static ssize_t show_power_level(struct device *d,
|
|||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct iwl_priv *priv = dev_get_drvdata(d);
|
||||
int mode = priv->power_data.user_power_setting;
|
||||
int level = priv->power_data.power_mode;
|
||||
char *p = buf;
|
||||
|
||||
p += sprintf(p, "INDEX:%d\t", level);
|
||||
p += sprintf(p, "USER:%d\n", mode);
|
||||
p += sprintf(p, "%d\n", level);
|
||||
return p - buf + 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -872,7 +872,8 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
|
|||
iwl_print_hex_dump(priv, IWL_DL_TX, (u8 *)tx_cmd->hdr, hdr_len);
|
||||
|
||||
/* Set up entry for this TFD in Tx byte-count array */
|
||||
priv->cfg->ops->lib->txq_update_byte_cnt_tbl(priv, txq,
|
||||
if (info->flags & IEEE80211_TX_CTL_AMPDU)
|
||||
priv->cfg->ops->lib->txq_update_byte_cnt_tbl(priv, txq,
|
||||
le16_to_cpu(tx_cmd->len));
|
||||
|
||||
pci_dma_sync_single_for_device(priv->pci_dev, txcmd_phys,
|
||||
|
|
|
@ -3643,12 +3643,10 @@ static ssize_t show_power_level(struct device *d,
|
|||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct iwl_priv *priv = dev_get_drvdata(d);
|
||||
int mode = priv->power_data.user_power_setting;
|
||||
int level = priv->power_data.power_mode;
|
||||
char *p = buf;
|
||||
|
||||
p += sprintf(p, "INDEX:%d\t", level);
|
||||
p += sprintf(p, "USER:%d\n", mode);
|
||||
p += sprintf(p, "%d\n", level);
|
||||
return p - buf + 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -151,8 +151,8 @@ void iwm_if_free(struct iwm_priv *iwm)
|
|||
return;
|
||||
|
||||
free_netdev(iwm_to_ndev(iwm));
|
||||
iwm_wdev_free(iwm);
|
||||
iwm_priv_deinit(iwm);
|
||||
iwm_wdev_free(iwm);
|
||||
}
|
||||
|
||||
int iwm_if_add(struct iwm_priv *iwm)
|
||||
|
|
|
@ -135,8 +135,14 @@ int lbs_update_hw_spec(struct lbs_private *priv)
|
|||
/* Clamp region code to 8-bit since FW spec indicates that it should
|
||||
* only ever be 8-bit, even though the field size is 16-bit. Some firmware
|
||||
* returns non-zero high 8 bits here.
|
||||
*
|
||||
* Firmware version 4.0.102 used in CF8381 has region code shifted. We
|
||||
* need to check for this problem and handle it properly.
|
||||
*/
|
||||
priv->regioncode = le16_to_cpu(cmd.regioncode) & 0xFF;
|
||||
if (MRVL_FW_MAJOR_REV(priv->fwrelease) == MRVL_FW_V4)
|
||||
priv->regioncode = (le16_to_cpu(cmd.regioncode) >> 8) & 0xFF;
|
||||
else
|
||||
priv->regioncode = le16_to_cpu(cmd.regioncode) & 0xFF;
|
||||
|
||||
for (i = 0; i < MRVDRV_MAX_REGION_CODE; i++) {
|
||||
/* use the region code to search for the index */
|
||||
|
|
|
@ -234,6 +234,8 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in
|
|||
/** Mesh enable bit in FW capability */
|
||||
#define MESH_CAPINFO_ENABLE_MASK (1<<16)
|
||||
|
||||
/** FW definition from Marvell v4 */
|
||||
#define MRVL_FW_V4 (0x04)
|
||||
/** FW definition from Marvell v5 */
|
||||
#define MRVL_FW_V5 (0x05)
|
||||
/** FW definition from Marvell v10 */
|
||||
|
|
|
@ -709,7 +709,7 @@ static const struct ieee80211_ops mac80211_hwsim_ops =
|
|||
static void mac80211_hwsim_free(void)
|
||||
{
|
||||
struct list_head tmplist, *i, *tmp;
|
||||
struct mac80211_hwsim_data *data;
|
||||
struct mac80211_hwsim_data *data, *tmpdata;
|
||||
|
||||
INIT_LIST_HEAD(&tmplist);
|
||||
|
||||
|
@ -718,7 +718,7 @@ static void mac80211_hwsim_free(void)
|
|||
list_move(i, &tmplist);
|
||||
spin_unlock_bh(&hwsim_radio_lock);
|
||||
|
||||
list_for_each_entry(data, &tmplist, list) {
|
||||
list_for_each_entry_safe(data, tmpdata, &tmplist, list) {
|
||||
debugfs_remove(data->debugfs_group);
|
||||
debugfs_remove(data->debugfs_ps);
|
||||
debugfs_remove(data->debugfs);
|
||||
|
@ -1167,8 +1167,8 @@ static void __exit exit_mac80211_hwsim(void)
|
|||
{
|
||||
printk(KERN_DEBUG "mac80211_hwsim: unregister radios\n");
|
||||
|
||||
unregister_netdev(hwsim_mon);
|
||||
mac80211_hwsim_free();
|
||||
unregister_netdev(hwsim_mon);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -635,7 +635,7 @@ static int __devinit p54spi_probe(struct spi_device *spi)
|
|||
|
||||
hw = p54_init_common(sizeof(*priv));
|
||||
if (!hw) {
|
||||
dev_err(&priv->spi->dev, "could not alloc ieee80211_hw");
|
||||
dev_err(&spi->dev, "could not alloc ieee80211_hw");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
|
|
@ -1550,7 +1550,9 @@ static int rt2500usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
|||
rt2500usb_register_read(rt2x00dev, MAC_CSR0, ®);
|
||||
rt2x00_set_chip(rt2x00dev, RT2570, value, reg);
|
||||
|
||||
if (!rt2x00_check_rev(&rt2x00dev->chip, 0x000ffff0, 0)) {
|
||||
if (!rt2x00_check_rev(&rt2x00dev->chip, 0x000ffff0, 0) ||
|
||||
rt2x00_check_rev(&rt2x00dev->chip, 0x0000000f, 0)) {
|
||||
|
||||
ERROR(rt2x00dev, "Invalid RT chipset detected.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
|
|
@ -208,11 +208,12 @@ void rtl8187_leds_exit(struct ieee80211_hw *dev)
|
|||
{
|
||||
struct rtl8187_priv *priv = dev->priv;
|
||||
|
||||
rtl8187_unregister_led(&priv->led_tx);
|
||||
/* turn the LED off before exiting */
|
||||
queue_delayed_work(dev->workqueue, &priv->led_off, 0);
|
||||
cancel_delayed_work_sync(&priv->led_off);
|
||||
cancel_delayed_work_sync(&priv->led_on);
|
||||
rtl8187_unregister_led(&priv->led_rx);
|
||||
rtl8187_unregister_led(&priv->led_tx);
|
||||
}
|
||||
#endif /* def CONFIG_RTL8187_LED */
|
||||
|
||||
|
|
|
@ -9,6 +9,10 @@
|
|||
* out of the OpenFirmware device tree and using it to populate an mii_bus.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/phy.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_mdio.h>
|
||||
|
@ -137,3 +141,41 @@ struct phy_device *of_phy_connect(struct net_device *dev,
|
|||
return phy_connect_direct(dev, phy, hndlr, flags, iface) ? NULL : phy;
|
||||
}
|
||||
EXPORT_SYMBOL(of_phy_connect);
|
||||
|
||||
/**
|
||||
* of_phy_connect_fixed_link - Parse fixed-link property and return a dummy phy
|
||||
* @dev: pointer to net_device claiming the phy
|
||||
* @hndlr: Link state callback for the network device
|
||||
* @iface: PHY data interface type
|
||||
*
|
||||
* This function is a temporary stop-gap and will be removed soon. It is
|
||||
* only to support the fs_enet, ucc_geth and gianfar Ethernet drivers. Do
|
||||
* not call this function from new drivers.
|
||||
*/
|
||||
struct phy_device *of_phy_connect_fixed_link(struct net_device *dev,
|
||||
void (*hndlr)(struct net_device *),
|
||||
phy_interface_t iface)
|
||||
{
|
||||
struct device_node *net_np;
|
||||
char bus_id[MII_BUS_ID_SIZE + 3];
|
||||
struct phy_device *phy;
|
||||
const u32 *phy_id;
|
||||
int sz;
|
||||
|
||||
if (!dev->dev.parent)
|
||||
return NULL;
|
||||
|
||||
net_np = dev_archdata_get_node(&dev->dev.parent->archdata);
|
||||
if (!net_np)
|
||||
return NULL;
|
||||
|
||||
phy_id = of_get_property(net_np, "fixed-link", &sz);
|
||||
if (!phy_id || sz < sizeof(*phy_id))
|
||||
return NULL;
|
||||
|
||||
sprintf(bus_id, PHY_ID_FMT, "0", phy_id[0]);
|
||||
|
||||
phy = phy_connect(dev, bus_id, hndlr, 0, iface);
|
||||
return IS_ERR(phy) ? NULL : phy;
|
||||
}
|
||||
EXPORT_SYMBOL(of_phy_connect_fixed_link);
|
||||
|
|
|
@ -973,7 +973,7 @@ static int acer_rfkill_set(void *data, bool blocked)
|
|||
{
|
||||
acpi_status status;
|
||||
u32 cap = (unsigned long)data;
|
||||
status = set_u32(!!blocked, cap);
|
||||
status = set_u32(!blocked, cap);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
return 0;
|
||||
|
|
|
@ -18,5 +18,8 @@ extern struct phy_device *of_phy_connect(struct net_device *dev,
|
|||
struct device_node *phy_np,
|
||||
void (*hndlr)(struct net_device *),
|
||||
u32 flags, phy_interface_t iface);
|
||||
extern struct phy_device *of_phy_connect_fixed_link(struct net_device *dev,
|
||||
void (*hndlr)(struct net_device *),
|
||||
phy_interface_t iface);
|
||||
|
||||
#endif /* __LINUX_OF_MDIO_H */
|
||||
|
|
|
@ -224,7 +224,7 @@ void rfkill_destroy(struct rfkill *rfkill);
|
|||
* should be blocked) so that drivers need not keep track of the soft
|
||||
* block state -- which they might not be able to.
|
||||
*/
|
||||
bool __must_check rfkill_set_hw_state(struct rfkill *rfkill, bool blocked);
|
||||
bool rfkill_set_hw_state(struct rfkill *rfkill, bool blocked);
|
||||
|
||||
/**
|
||||
* rfkill_set_sw_state - Set the internal rfkill software block state
|
||||
|
|
|
@ -156,7 +156,7 @@ extern int sysctl_rose_maximum_vcs;
|
|||
extern int sysctl_rose_window_size;
|
||||
extern int rosecmp(rose_address *, rose_address *);
|
||||
extern int rosecmpm(rose_address *, rose_address *, unsigned short);
|
||||
extern const char *rose2asc(const rose_address *);
|
||||
extern char *rose2asc(char *buf, const rose_address *);
|
||||
extern struct sock *rose_find_socket(unsigned int, struct rose_neigh *);
|
||||
extern void rose_kill_by_neigh(struct rose_neigh *);
|
||||
extern unsigned int rose_new_lci(struct rose_neigh *);
|
||||
|
|
|
@ -424,7 +424,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
|
|||
err2:
|
||||
br_fdb_delete_by_port(br, p, 1);
|
||||
err1:
|
||||
kobject_del(&p->kobj);
|
||||
kobject_put(&p->kobj);
|
||||
err0:
|
||||
dev_set_promiscuity(dev, -1);
|
||||
put_back:
|
||||
|
|
|
@ -1453,6 +1453,7 @@ struct tsap_cb *irttp_dup(struct tsap_cb *orig, void *instance)
|
|||
}
|
||||
/* Dup */
|
||||
memcpy(new, orig, sizeof(struct tsap_cb));
|
||||
spin_lock_init(&new->lock);
|
||||
|
||||
/* We don't need the old instance any more */
|
||||
spin_unlock_irqrestore(&irttp->tsaps->hb_spinlock, flags);
|
||||
|
|
|
@ -83,6 +83,7 @@ endmenu
|
|||
config MAC80211_MESH
|
||||
bool "Enable mac80211 mesh networking (pre-802.11s) support"
|
||||
depends on MAC80211 && EXPERIMENTAL
|
||||
depends on BROKEN
|
||||
---help---
|
||||
This options enables support of Draft 802.11s mesh networking.
|
||||
The implementation is based on Draft 1.08 of the Mesh Networking
|
||||
|
|
|
@ -175,6 +175,8 @@ int mesh_path_add(u8 *dst, struct ieee80211_sub_if_data *sdata)
|
|||
int err = 0;
|
||||
u32 hash_idx;
|
||||
|
||||
might_sleep();
|
||||
|
||||
if (memcmp(dst, sdata->dev->dev_addr, ETH_ALEN) == 0)
|
||||
/* never add ourselves as neighbours */
|
||||
return -ENOTSUPP;
|
||||
|
@ -265,6 +267,7 @@ int mpp_path_add(u8 *dst, u8 *mpp, struct ieee80211_sub_if_data *sdata)
|
|||
int err = 0;
|
||||
u32 hash_idx;
|
||||
|
||||
might_sleep();
|
||||
|
||||
if (memcmp(dst, sdata->dev->dev_addr, ETH_ALEN) == 0)
|
||||
/* never add ourselves as neighbours */
|
||||
|
@ -491,8 +494,10 @@ void mesh_path_tx_pending(struct mesh_path *mpath)
|
|||
* @skb: frame to discard
|
||||
* @sdata: network subif the frame was to be sent through
|
||||
*
|
||||
* If the frame was beign forwarded from another MP, a PERR frame will be sent
|
||||
* to the precursor.
|
||||
* If the frame was being forwarded from another MP, a PERR frame will be sent
|
||||
* to the precursor. The precursor's address (i.e. the previous hop) was saved
|
||||
* in addr1 of the frame-to-be-forwarded, and would only be overwritten once
|
||||
* the destination is successfully resolved.
|
||||
*
|
||||
* Locking: the function must me called within a rcu_read_lock region
|
||||
*/
|
||||
|
@ -507,7 +512,7 @@ void mesh_path_discard_frame(struct sk_buff *skb,
|
|||
u8 *ra, *da;
|
||||
|
||||
da = hdr->addr3;
|
||||
ra = hdr->addr2;
|
||||
ra = hdr->addr1;
|
||||
mpath = mesh_path_lookup(da, sdata);
|
||||
if (mpath)
|
||||
dsn = ++mpath->dsn;
|
||||
|
|
|
@ -1455,7 +1455,7 @@ int ieee80211_master_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
monitor_iface = UNKNOWN_ADDRESS;
|
||||
|
||||
len_rthdr = ieee80211_get_radiotap_len(skb->data);
|
||||
hdr = (struct ieee80211_hdr *)skb->data + len_rthdr;
|
||||
hdr = (struct ieee80211_hdr *)(skb->data + len_rthdr);
|
||||
hdrlen = ieee80211_hdrlen(hdr->frame_control);
|
||||
|
||||
/* check the header is complete in the frame */
|
||||
|
|
|
@ -549,6 +549,10 @@ void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw)
|
|||
swprev = !!(rfkill->state & RFKILL_BLOCK_SW);
|
||||
hwprev = !!(rfkill->state & RFKILL_BLOCK_HW);
|
||||
__rfkill_set_sw_state(rfkill, sw);
|
||||
if (hw)
|
||||
rfkill->state |= RFKILL_BLOCK_HW;
|
||||
else
|
||||
rfkill->state &= ~RFKILL_BLOCK_HW;
|
||||
|
||||
spin_unlock_irqrestore(&rfkill->lock, flags);
|
||||
|
||||
|
@ -648,15 +652,26 @@ static ssize_t rfkill_state_store(struct device *dev,
|
|||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
/*
|
||||
* The intention was that userspace can only take control over
|
||||
* a given device when/if rfkill-input doesn't control it due
|
||||
* to user_claim. Since user_claim is currently unsupported,
|
||||
* we never support changing the state from userspace -- this
|
||||
* can be implemented again later.
|
||||
*/
|
||||
struct rfkill *rfkill = to_rfkill(dev);
|
||||
unsigned long state;
|
||||
int err;
|
||||
|
||||
return -EPERM;
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
err = strict_strtoul(buf, 0, &state);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (state != RFKILL_USER_STATE_SOFT_BLOCKED &&
|
||||
state != RFKILL_USER_STATE_UNBLOCKED)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&rfkill_global_mutex);
|
||||
rfkill_set_block(rfkill, state == RFKILL_USER_STATE_SOFT_BLOCKED);
|
||||
mutex_unlock(&rfkill_global_mutex);
|
||||
|
||||
return err ?: count;
|
||||
}
|
||||
|
||||
static ssize_t rfkill_claim_show(struct device *dev,
|
||||
|
|
|
@ -92,23 +92,21 @@ static void rose_set_lockdep_key(struct net_device *dev)
|
|||
/*
|
||||
* Convert a ROSE address into text.
|
||||
*/
|
||||
const char *rose2asc(const rose_address *addr)
|
||||
char *rose2asc(char *buf, const rose_address *addr)
|
||||
{
|
||||
static char buffer[11];
|
||||
|
||||
if (addr->rose_addr[0] == 0x00 && addr->rose_addr[1] == 0x00 &&
|
||||
addr->rose_addr[2] == 0x00 && addr->rose_addr[3] == 0x00 &&
|
||||
addr->rose_addr[4] == 0x00) {
|
||||
strcpy(buffer, "*");
|
||||
strcpy(buf, "*");
|
||||
} else {
|
||||
sprintf(buffer, "%02X%02X%02X%02X%02X", addr->rose_addr[0] & 0xFF,
|
||||
sprintf(buf, "%02X%02X%02X%02X%02X", addr->rose_addr[0] & 0xFF,
|
||||
addr->rose_addr[1] & 0xFF,
|
||||
addr->rose_addr[2] & 0xFF,
|
||||
addr->rose_addr[3] & 0xFF,
|
||||
addr->rose_addr[4] & 0xFF);
|
||||
}
|
||||
|
||||
return buffer;
|
||||
return buf;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1437,7 +1435,7 @@ static void rose_info_stop(struct seq_file *seq, void *v)
|
|||
|
||||
static int rose_info_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
char buf[11];
|
||||
char buf[11], rsbuf[11];
|
||||
|
||||
if (v == SEQ_START_TOKEN)
|
||||
seq_puts(seq,
|
||||
|
@ -1455,8 +1453,8 @@ static int rose_info_show(struct seq_file *seq, void *v)
|
|||
devname = dev->name;
|
||||
|
||||
seq_printf(seq, "%-10s %-9s ",
|
||||
rose2asc(&rose->dest_addr),
|
||||
ax2asc(buf, &rose->dest_call));
|
||||
rose2asc(rsbuf, &rose->dest_addr),
|
||||
ax2asc(buf, &rose->dest_call));
|
||||
|
||||
if (ax25cmp(&rose->source_call, &null_ax25_address) == 0)
|
||||
callsign = "??????-?";
|
||||
|
@ -1465,7 +1463,7 @@ static int rose_info_show(struct seq_file *seq, void *v)
|
|||
|
||||
seq_printf(seq,
|
||||
"%-10s %-9s %-5s %3.3X %05d %d %d %d %d %3lu %3lu %3lu %3lu %3lu %3lu/%03lu %5d %5d %ld\n",
|
||||
rose2asc(&rose->source_addr),
|
||||
rose2asc(rsbuf, &rose->source_addr),
|
||||
callsign,
|
||||
devname,
|
||||
rose->lci & 0x0FFF,
|
||||
|
|
|
@ -1104,6 +1104,7 @@ static void rose_node_stop(struct seq_file *seq, void *v)
|
|||
|
||||
static int rose_node_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
char rsbuf[11];
|
||||
int i;
|
||||
|
||||
if (v == SEQ_START_TOKEN)
|
||||
|
@ -1112,13 +1113,13 @@ static int rose_node_show(struct seq_file *seq, void *v)
|
|||
const struct rose_node *rose_node = v;
|
||||
/* if (rose_node->loopback) {
|
||||
seq_printf(seq, "%-10s %04d 1 loopback\n",
|
||||
rose2asc(&rose_node->address),
|
||||
rose_node->mask);
|
||||
rose2asc(rsbuf, &rose_node->address),
|
||||
rose_node->mask);
|
||||
} else { */
|
||||
seq_printf(seq, "%-10s %04d %d",
|
||||
rose2asc(&rose_node->address),
|
||||
rose_node->mask,
|
||||
rose_node->count);
|
||||
rose2asc(rsbuf, &rose_node->address),
|
||||
rose_node->mask,
|
||||
rose_node->count);
|
||||
|
||||
for (i = 0; i < rose_node->count; i++)
|
||||
seq_printf(seq, " %05d",
|
||||
|
@ -1267,7 +1268,7 @@ static void rose_route_stop(struct seq_file *seq, void *v)
|
|||
|
||||
static int rose_route_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
char buf[11];
|
||||
char buf[11], rsbuf[11];
|
||||
|
||||
if (v == SEQ_START_TOKEN)
|
||||
seq_puts(seq,
|
||||
|
@ -1279,7 +1280,7 @@ static int rose_route_show(struct seq_file *seq, void *v)
|
|||
seq_printf(seq,
|
||||
"%3.3X %-10s %-9s %05d ",
|
||||
rose_route->lci1,
|
||||
rose2asc(&rose_route->src_addr),
|
||||
rose2asc(rsbuf, &rose_route->src_addr),
|
||||
ax2asc(buf, &rose_route->src_call),
|
||||
rose_route->neigh1->number);
|
||||
else
|
||||
|
@ -1289,10 +1290,10 @@ static int rose_route_show(struct seq_file *seq, void *v)
|
|||
if (rose_route->neigh2)
|
||||
seq_printf(seq,
|
||||
"%3.3X %-10s %-9s %05d\n",
|
||||
rose_route->lci2,
|
||||
rose2asc(&rose_route->dest_addr),
|
||||
ax2asc(buf, &rose_route->dest_call),
|
||||
rose_route->neigh2->number);
|
||||
rose_route->lci2,
|
||||
rose2asc(rsbuf, &rose_route->dest_addr),
|
||||
ax2asc(buf, &rose_route->dest_call),
|
||||
rose_route->neigh2->number);
|
||||
else
|
||||
seq_puts(seq,
|
||||
"000 * * 00000\n");
|
||||
|
|
|
@ -997,7 +997,7 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
|||
|
||||
if (IS_ERR(hdr)) {
|
||||
err = PTR_ERR(hdr);
|
||||
goto out;
|
||||
goto free_msg;
|
||||
}
|
||||
|
||||
cookie.msg = msg;
|
||||
|
@ -1011,7 +1011,7 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
|||
&cookie, get_key_callback);
|
||||
|
||||
if (err)
|
||||
goto out;
|
||||
goto free_msg;
|
||||
|
||||
if (cookie.error)
|
||||
goto nla_put_failure;
|
||||
|
@ -1022,6 +1022,7 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
|||
|
||||
nla_put_failure:
|
||||
err = -ENOBUFS;
|
||||
free_msg:
|
||||
nlmsg_free(msg);
|
||||
out:
|
||||
cfg80211_put_dev(drv);
|
||||
|
|
|
@ -35,8 +35,6 @@ void cfg80211_scan_done(struct cfg80211_scan_request *request, bool aborted)
|
|||
else
|
||||
nl80211_send_scan_done(wiphy_to_dev(request->wiphy), dev);
|
||||
|
||||
wiphy_to_dev(request->wiphy)->scan_req = NULL;
|
||||
|
||||
#ifdef CONFIG_WIRELESS_EXT
|
||||
if (!aborted) {
|
||||
memset(&wrqu, 0, sizeof(wrqu));
|
||||
|
@ -48,6 +46,7 @@ void cfg80211_scan_done(struct cfg80211_scan_request *request, bool aborted)
|
|||
dev_put(dev);
|
||||
|
||||
out:
|
||||
wiphy_to_dev(request->wiphy)->scan_req = NULL;
|
||||
kfree(request);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_scan_done);
|
||||
|
|
Loading…
Reference in New Issue