mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
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: (40 commits) ethoc: limit the number of buffers to 128 ethoc: use system memory as buffer ethoc: align received packet to make IP header at word boundary ethoc: fix buffer address mapping ethoc: fix typo to compute number of tx descriptors au1000_eth: Duplicate test of RX_OVERLEN bit in update_rx_stats() netxen: Fix Unlikely(x) > y pasemi_mac: ethtool get settings fix add maintainer for network drop monitor kernel service tg3: Fix phylib locking strategy rndis_host: support ETHTOOL_GPERMADDR ipv4: arp_notify address list bug gigaset: add kerneldoc comments gigaset: correct debugging output selection gigaset: improve error recovery gigaset: fix device ERROR response handling gigaset: announce if built with debugging gigaset: handle isoc frame errors more gracefully gigaset: linearize skb gigaset: fix reject/hangup handling ...
This commit is contained in:
commit
5587481e92
45 changed files with 545 additions and 253 deletions
|
|
@ -721,7 +721,7 @@ static inline void update_rx_stats(struct net_device *dev, u32 status)
|
|||
ps->rx_errors++;
|
||||
if (status & RX_MISSED_FRAME)
|
||||
ps->rx_missed_errors++;
|
||||
if (status & (RX_OVERLEN | RX_OVERLEN | RX_LEN_ERROR))
|
||||
if (status & (RX_OVERLEN | RX_RUNT | RX_LEN_ERROR))
|
||||
ps->rx_length_errors++;
|
||||
if (status & RX_CRC_ERROR)
|
||||
ps->rx_crc_errors++;
|
||||
|
|
@ -794,8 +794,6 @@ static int au1000_rx(struct net_device *dev)
|
|||
printk("rx len error\n");
|
||||
if (status & RX_U_CNTRL_FRAME)
|
||||
printk("rx u control frame\n");
|
||||
if (status & RX_MISSED_FRAME)
|
||||
printk("rx miss\n");
|
||||
}
|
||||
}
|
||||
prxd->buff_stat = (u32)(pDB->dma_addr | RX_DMA_ENABLE);
|
||||
|
|
|
|||
|
|
@ -1129,7 +1129,6 @@ int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd,
|
|||
spin_lock_bh(&adapter->mcc_lock);
|
||||
|
||||
wrb = wrb_from_mccq(adapter);
|
||||
req = embedded_payload(wrb);
|
||||
sge = nonembedded_sgl(wrb);
|
||||
|
||||
be_wrb_hdr_prepare(wrb, cmd->size, false, 1);
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ enum {
|
|||
MCC_STATUS_QUEUE_FLUSHING = 0x4,
|
||||
/* The command is completing with a DMA error */
|
||||
MCC_STATUS_DMA_FAILED = 0x5,
|
||||
MCC_STATUS_NOT_SUPPORTED = 0x66
|
||||
MCC_STATUS_NOT_SUPPORTED = 66
|
||||
};
|
||||
|
||||
#define CQE_STATUS_COMPL_MASK 0xFFFF
|
||||
|
|
|
|||
|
|
@ -358,7 +358,7 @@ const struct ethtool_ops be_ethtool_ops = {
|
|||
.get_rx_csum = be_get_rx_csum,
|
||||
.set_rx_csum = be_set_rx_csum,
|
||||
.get_tx_csum = ethtool_op_get_tx_csum,
|
||||
.set_tx_csum = ethtool_op_set_tx_csum,
|
||||
.set_tx_csum = ethtool_op_set_tx_hw_csum,
|
||||
.get_sg = ethtool_op_get_sg,
|
||||
.set_sg = ethtool_op_set_sg,
|
||||
.get_tso = ethtool_op_get_tso,
|
||||
|
|
|
|||
|
|
@ -197,7 +197,7 @@ void netdev_stats_update(struct be_adapter *adapter)
|
|||
/* no space available in linux */
|
||||
dev_stats->tx_dropped = 0;
|
||||
|
||||
dev_stats->multicast = port_stats->tx_multicastframes;
|
||||
dev_stats->multicast = port_stats->rx_multicast_frames;
|
||||
dev_stats->collisions = 0;
|
||||
|
||||
/* detailed tx_errors */
|
||||
|
|
@ -1899,8 +1899,8 @@ static void be_netdev_init(struct net_device *netdev)
|
|||
struct be_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
netdev->features |= NETIF_F_SG | NETIF_F_HW_VLAN_RX | NETIF_F_TSO |
|
||||
NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | NETIF_F_IP_CSUM |
|
||||
NETIF_F_IPV6_CSUM | NETIF_F_GRO;
|
||||
NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | NETIF_F_HW_CSUM |
|
||||
NETIF_F_GRO;
|
||||
|
||||
netdev->flags |= IFF_MULTICAST;
|
||||
|
||||
|
|
|
|||
|
|
@ -1803,7 +1803,7 @@ struct e1000_info e1000_82574_info = {
|
|||
| FLAG_HAS_AMT
|
||||
| FLAG_HAS_CTRLEXT_ON_LOAD,
|
||||
.pba = 20,
|
||||
.max_hw_frame_size = ETH_FRAME_LEN + ETH_FCS_LEN,
|
||||
.max_hw_frame_size = DEFAULT_JUMBO,
|
||||
.get_variants = e1000_get_variants_82571,
|
||||
.mac_ops = &e82571_mac_ops,
|
||||
.phy_ops = &e82_phy_ops_bm,
|
||||
|
|
@ -1820,7 +1820,7 @@ struct e1000_info e1000_82583_info = {
|
|||
| FLAG_HAS_AMT
|
||||
| FLAG_HAS_CTRLEXT_ON_LOAD,
|
||||
.pba = 20,
|
||||
.max_hw_frame_size = DEFAULT_JUMBO,
|
||||
.max_hw_frame_size = ETH_FRAME_LEN + ETH_FCS_LEN,
|
||||
.get_variants = e1000_get_variants_82571,
|
||||
.mac_ops = &e82571_mac_ops,
|
||||
.phy_ops = &e82_phy_ops_bm,
|
||||
|
|
|
|||
|
|
@ -19,6 +19,10 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <net/ethoc.h>
|
||||
|
||||
static int buffer_size = 0x8000; /* 32 KBytes */
|
||||
module_param(buffer_size, int, 0);
|
||||
MODULE_PARM_DESC(buffer_size, "DMA buffer allocation size");
|
||||
|
||||
/* register offsets */
|
||||
#define MODER 0x00
|
||||
#define INT_SOURCE 0x04
|
||||
|
|
@ -167,6 +171,7 @@
|
|||
* struct ethoc - driver-private device structure
|
||||
* @iobase: pointer to I/O memory region
|
||||
* @membase: pointer to buffer memory region
|
||||
* @dma_alloc: dma allocated buffer size
|
||||
* @num_tx: number of send buffers
|
||||
* @cur_tx: last send buffer written
|
||||
* @dty_tx: last buffer actually sent
|
||||
|
|
@ -185,6 +190,7 @@
|
|||
struct ethoc {
|
||||
void __iomem *iobase;
|
||||
void __iomem *membase;
|
||||
int dma_alloc;
|
||||
|
||||
unsigned int num_tx;
|
||||
unsigned int cur_tx;
|
||||
|
|
@ -284,7 +290,7 @@ static int ethoc_init_ring(struct ethoc *dev)
|
|||
dev->cur_rx = 0;
|
||||
|
||||
/* setup transmission buffers */
|
||||
bd.addr = 0;
|
||||
bd.addr = virt_to_phys(dev->membase);
|
||||
bd.stat = TX_BD_IRQ | TX_BD_CRC;
|
||||
|
||||
for (i = 0; i < dev->num_tx; i++) {
|
||||
|
|
@ -295,7 +301,6 @@ static int ethoc_init_ring(struct ethoc *dev)
|
|||
bd.addr += ETHOC_BUFSIZ;
|
||||
}
|
||||
|
||||
bd.addr = dev->num_tx * ETHOC_BUFSIZ;
|
||||
bd.stat = RX_BD_EMPTY | RX_BD_IRQ;
|
||||
|
||||
for (i = 0; i < dev->num_rx; i++) {
|
||||
|
|
@ -400,8 +405,12 @@ static int ethoc_rx(struct net_device *dev, int limit)
|
|||
if (ethoc_update_rx_stats(priv, &bd) == 0) {
|
||||
int size = bd.stat >> 16;
|
||||
struct sk_buff *skb = netdev_alloc_skb(dev, size);
|
||||
|
||||
size -= 4; /* strip the CRC */
|
||||
skb_reserve(skb, 2); /* align TCP/IP header */
|
||||
|
||||
if (likely(skb)) {
|
||||
void *src = priv->membase + bd.addr;
|
||||
void *src = phys_to_virt(bd.addr);
|
||||
memcpy_fromio(skb_put(skb, size), src, size);
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
priv->stats.rx_packets++;
|
||||
|
|
@ -653,9 +662,9 @@ static int ethoc_open(struct net_device *dev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* calculate the number of TX/RX buffers */
|
||||
num_bd = (dev->mem_end - dev->mem_start + 1) / ETHOC_BUFSIZ;
|
||||
priv->num_tx = min(min_tx, num_bd / 4);
|
||||
/* calculate the number of TX/RX buffers, maximum 128 supported */
|
||||
num_bd = min(128, (dev->mem_end - dev->mem_start + 1) / ETHOC_BUFSIZ);
|
||||
priv->num_tx = max(min_tx, num_bd / 4);
|
||||
priv->num_rx = num_bd - priv->num_tx;
|
||||
ethoc_write(priv, TX_BD_NUM, priv->num_tx);
|
||||
|
||||
|
|
@ -823,7 +832,7 @@ static netdev_tx_t ethoc_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
else
|
||||
bd.stat &= ~TX_BD_PAD;
|
||||
|
||||
dest = priv->membase + bd.addr;
|
||||
dest = phys_to_virt(bd.addr);
|
||||
memcpy_toio(dest, skb->data, skb->len);
|
||||
|
||||
bd.stat &= ~(TX_BD_STATS | TX_BD_LEN_MASK);
|
||||
|
|
@ -903,22 +912,19 @@ static int ethoc_probe(struct platform_device *pdev)
|
|||
|
||||
/* obtain buffer memory space */
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
if (!res) {
|
||||
dev_err(&pdev->dev, "cannot obtain memory space\n");
|
||||
ret = -ENXIO;
|
||||
goto free;
|
||||
}
|
||||
|
||||
mem = devm_request_mem_region(&pdev->dev, res->start,
|
||||
if (res) {
|
||||
mem = devm_request_mem_region(&pdev->dev, res->start,
|
||||
res->end - res->start + 1, res->name);
|
||||
if (!mem) {
|
||||
dev_err(&pdev->dev, "cannot request memory space\n");
|
||||
ret = -ENXIO;
|
||||
goto free;
|
||||
if (!mem) {
|
||||
dev_err(&pdev->dev, "cannot request memory space\n");
|
||||
ret = -ENXIO;
|
||||
goto free;
|
||||
}
|
||||
|
||||
netdev->mem_start = mem->start;
|
||||
netdev->mem_end = mem->end;
|
||||
}
|
||||
|
||||
netdev->mem_start = mem->start;
|
||||
netdev->mem_end = mem->end;
|
||||
|
||||
/* obtain device IRQ number */
|
||||
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
|
|
@ -933,6 +939,7 @@ static int ethoc_probe(struct platform_device *pdev)
|
|||
/* setup driver-private data */
|
||||
priv = netdev_priv(netdev);
|
||||
priv->netdev = netdev;
|
||||
priv->dma_alloc = 0;
|
||||
|
||||
priv->iobase = devm_ioremap_nocache(&pdev->dev, netdev->base_addr,
|
||||
mmio->end - mmio->start + 1);
|
||||
|
|
@ -942,12 +949,27 @@ static int ethoc_probe(struct platform_device *pdev)
|
|||
goto error;
|
||||
}
|
||||
|
||||
priv->membase = devm_ioremap_nocache(&pdev->dev, netdev->mem_start,
|
||||
mem->end - mem->start + 1);
|
||||
if (!priv->membase) {
|
||||
dev_err(&pdev->dev, "cannot remap memory space\n");
|
||||
ret = -ENXIO;
|
||||
goto error;
|
||||
if (netdev->mem_end) {
|
||||
priv->membase = devm_ioremap_nocache(&pdev->dev,
|
||||
netdev->mem_start, mem->end - mem->start + 1);
|
||||
if (!priv->membase) {
|
||||
dev_err(&pdev->dev, "cannot remap memory space\n");
|
||||
ret = -ENXIO;
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
/* Allocate buffer memory */
|
||||
priv->membase = dma_alloc_coherent(NULL,
|
||||
buffer_size, (void *)&netdev->mem_start,
|
||||
GFP_KERNEL);
|
||||
if (!priv->membase) {
|
||||
dev_err(&pdev->dev, "cannot allocate %dB buffer\n",
|
||||
buffer_size);
|
||||
ret = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
netdev->mem_end = netdev->mem_start + buffer_size;
|
||||
priv->dma_alloc = buffer_size;
|
||||
}
|
||||
|
||||
/* Allow the platform setup code to pass in a MAC address. */
|
||||
|
|
@ -1034,6 +1056,9 @@ free_mdio:
|
|||
kfree(priv->mdio->irq);
|
||||
mdiobus_free(priv->mdio);
|
||||
free:
|
||||
if (priv->dma_alloc)
|
||||
dma_free_coherent(NULL, priv->dma_alloc, priv->membase,
|
||||
netdev->mem_start);
|
||||
free_netdev(netdev);
|
||||
out:
|
||||
return ret;
|
||||
|
|
@ -1059,7 +1084,9 @@ static int ethoc_remove(struct platform_device *pdev)
|
|||
kfree(priv->mdio->irq);
|
||||
mdiobus_free(priv->mdio);
|
||||
}
|
||||
|
||||
if (priv->dma_alloc)
|
||||
dma_free_coherent(NULL, priv->dma_alloc, priv->membase,
|
||||
netdev->mem_start);
|
||||
unregister_netdev(netdev);
|
||||
free_netdev(netdev);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -330,6 +330,8 @@ static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw)
|
|||
|
||||
switch (hw->device_id) {
|
||||
case IXGBE_DEV_ID_82599_KX4:
|
||||
case IXGBE_DEV_ID_82599_KX4_MEZZ:
|
||||
case IXGBE_DEV_ID_82599_COMBO_BACKPLANE:
|
||||
case IXGBE_DEV_ID_82599_XAUI_LOM:
|
||||
/* Default device ID is mezzanine card KX/KX4 */
|
||||
media_type = ixgbe_media_type_backplane;
|
||||
|
|
|
|||
|
|
@ -97,8 +97,12 @@ static struct pci_device_id ixgbe_pci_tbl[] = {
|
|||
board_82599 },
|
||||
{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP),
|
||||
board_82599 },
|
||||
{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_KX4_MEZZ),
|
||||
board_82599 },
|
||||
{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_CX4),
|
||||
board_82599 },
|
||||
{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_COMBO_BACKPLANE),
|
||||
board_82599 },
|
||||
|
||||
/* required last entry */
|
||||
{0, }
|
||||
|
|
|
|||
|
|
@ -49,9 +49,11 @@
|
|||
#define IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM 0x10E1
|
||||
#define IXGBE_DEV_ID_82598EB_XF_LR 0x10F4
|
||||
#define IXGBE_DEV_ID_82599_KX4 0x10F7
|
||||
#define IXGBE_DEV_ID_82599_KX4_MEZZ 0x1514
|
||||
#define IXGBE_DEV_ID_82599_CX4 0x10F9
|
||||
#define IXGBE_DEV_ID_82599_SFP 0x10FB
|
||||
#define IXGBE_DEV_ID_82599_XAUI_LOM 0x10FC
|
||||
#define IXGBE_DEV_ID_82599_COMBO_BACKPLANE 0x10F8
|
||||
|
||||
/* General Registers */
|
||||
#define IXGBE_CTRL 0x00000
|
||||
|
|
|
|||
|
|
@ -1714,7 +1714,7 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|||
/* 4 fragments per cmd des */
|
||||
no_of_desc = (frag_count + 3) >> 2;
|
||||
|
||||
if (unlikely(no_of_desc + 2) > netxen_tx_avail(tx_ring)) {
|
||||
if (unlikely(no_of_desc + 2 > netxen_tx_avail(tx_ring))) {
|
||||
netif_stop_queue(netdev);
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -71,6 +71,9 @@ pasemi_mac_ethtool_get_settings(struct net_device *netdev,
|
|||
struct pasemi_mac *mac = netdev_priv(netdev);
|
||||
struct phy_device *phydev = mac->phydev;
|
||||
|
||||
if (!phydev)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return phy_ethtool_gset(phydev, cmd);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1754,14 +1754,14 @@ static struct pcmcia_device_id pcnet_ids[] = {
|
|||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"),
|
||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"),
|
||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"),
|
||||
PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "DP83903.cis"),
|
||||
PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "DP83903.cis"),
|
||||
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "DP83903.cis"),
|
||||
PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"),
|
||||
PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"),
|
||||
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "cis/DP83903.cis"),
|
||||
PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "cis/LA-PCM.cis"),
|
||||
PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "PE520.cis"),
|
||||
PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "NE2K.cis"),
|
||||
PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "cis/NE2K.cis"),
|
||||
PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"),
|
||||
PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "tamarack.cis"),
|
||||
PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "cis/tamarack.cis"),
|
||||
PCMCIA_DEVICE_PROD_ID12("Ethernet", "CF Size PC Card", 0x00b2e941, 0x43ac239b),
|
||||
PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0",
|
||||
0xb4be14e3, 0x43ac239b, 0x0877b627),
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
|
||||
/*
|
||||
* General definitions...
|
||||
|
|
@ -135,9 +136,9 @@ enum {
|
|||
RST_FO_TFO = (1 << 0),
|
||||
RST_FO_RR_MASK = 0x00060000,
|
||||
RST_FO_RR_CQ_CAM = 0x00000000,
|
||||
RST_FO_RR_DROP = 0x00000001,
|
||||
RST_FO_RR_DQ = 0x00000002,
|
||||
RST_FO_RR_RCV_FUNC_CQ = 0x00000003,
|
||||
RST_FO_RR_DROP = 0x00000002,
|
||||
RST_FO_RR_DQ = 0x00000004,
|
||||
RST_FO_RR_RCV_FUNC_CQ = 0x00000006,
|
||||
RST_FO_FRB = (1 << 12),
|
||||
RST_FO_MOP = (1 << 13),
|
||||
RST_FO_REG = (1 << 14),
|
||||
|
|
@ -1477,7 +1478,6 @@ struct ql_adapter {
|
|||
u32 mailbox_in;
|
||||
u32 mailbox_out;
|
||||
struct mbox_params idc_mbc;
|
||||
struct mutex mpi_mutex;
|
||||
|
||||
int tx_ring_size;
|
||||
int rx_ring_size;
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev)
|
|||
if (!netif_running(qdev->ndev))
|
||||
return status;
|
||||
|
||||
spin_lock(&qdev->hw_lock);
|
||||
/* Skip the default queue, and update the outbound handler
|
||||
* queues if they changed.
|
||||
*/
|
||||
|
|
@ -92,7 +91,6 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev)
|
|||
}
|
||||
}
|
||||
exit:
|
||||
spin_unlock(&qdev->hw_lock);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@
|
|||
#include <linux/etherdevice.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/mm.h>
|
||||
|
|
@ -1926,12 +1925,10 @@ static void ql_vlan_rx_add_vid(struct net_device *ndev, u16 vid)
|
|||
status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
|
||||
if (status)
|
||||
return;
|
||||
spin_lock(&qdev->hw_lock);
|
||||
if (ql_set_mac_addr_reg
|
||||
(qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) {
|
||||
QPRINTK(qdev, IFUP, ERR, "Failed to init vlan address.\n");
|
||||
}
|
||||
spin_unlock(&qdev->hw_lock);
|
||||
ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
|
||||
}
|
||||
|
||||
|
|
@ -1945,12 +1942,10 @@ static void ql_vlan_rx_kill_vid(struct net_device *ndev, u16 vid)
|
|||
if (status)
|
||||
return;
|
||||
|
||||
spin_lock(&qdev->hw_lock);
|
||||
if (ql_set_mac_addr_reg
|
||||
(qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) {
|
||||
QPRINTK(qdev, IFUP, ERR, "Failed to clear vlan address.\n");
|
||||
}
|
||||
spin_unlock(&qdev->hw_lock);
|
||||
ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
|
||||
|
||||
}
|
||||
|
|
@ -2001,15 +1996,17 @@ static irqreturn_t qlge_isr(int irq, void *dev_id)
|
|||
/*
|
||||
* Check MPI processor activity.
|
||||
*/
|
||||
if (var & STS_PI) {
|
||||
if ((var & STS_PI) &&
|
||||
(ql_read32(qdev, INTR_MASK) & INTR_MASK_PI)) {
|
||||
/*
|
||||
* We've got an async event or mailbox completion.
|
||||
* Handle it and clear the source of the interrupt.
|
||||
*/
|
||||
QPRINTK(qdev, INTR, ERR, "Got MPI processor interrupt.\n");
|
||||
ql_disable_completion_interrupt(qdev, intr_context->intr);
|
||||
queue_delayed_work_on(smp_processor_id(), qdev->workqueue,
|
||||
&qdev->mpi_work, 0);
|
||||
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
|
||||
queue_delayed_work_on(smp_processor_id(),
|
||||
qdev->workqueue, &qdev->mpi_work, 0);
|
||||
work_done++;
|
||||
}
|
||||
|
||||
|
|
@ -3585,7 +3582,6 @@ static void qlge_set_multicast_list(struct net_device *ndev)
|
|||
status = ql_sem_spinlock(qdev, SEM_RT_IDX_MASK);
|
||||
if (status)
|
||||
return;
|
||||
spin_lock(&qdev->hw_lock);
|
||||
/*
|
||||
* Set or clear promiscuous mode if a
|
||||
* transition is taking place.
|
||||
|
|
@ -3662,7 +3658,6 @@ static void qlge_set_multicast_list(struct net_device *ndev)
|
|||
}
|
||||
}
|
||||
exit:
|
||||
spin_unlock(&qdev->hw_lock);
|
||||
ql_sem_unlock(qdev, SEM_RT_IDX_MASK);
|
||||
}
|
||||
|
||||
|
|
@ -3682,10 +3677,8 @@ static int qlge_set_mac_address(struct net_device *ndev, void *p)
|
|||
status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
|
||||
if (status)
|
||||
return status;
|
||||
spin_lock(&qdev->hw_lock);
|
||||
status = ql_set_mac_addr_reg(qdev, (u8 *) ndev->dev_addr,
|
||||
MAC_ADDR_TYPE_CAM_MAC, qdev->func * MAX_CQ);
|
||||
spin_unlock(&qdev->hw_lock);
|
||||
if (status)
|
||||
QPRINTK(qdev, HW, ERR, "Failed to load MAC address.\n");
|
||||
ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
|
||||
|
|
@ -3928,7 +3921,6 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
|
|||
INIT_DELAYED_WORK(&qdev->mpi_work, ql_mpi_work);
|
||||
INIT_DELAYED_WORK(&qdev->mpi_port_cfg_work, ql_mpi_port_cfg_work);
|
||||
INIT_DELAYED_WORK(&qdev->mpi_idc_work, ql_mpi_idc_work);
|
||||
mutex_init(&qdev->mpi_mutex);
|
||||
init_completion(&qdev->ide_completion);
|
||||
|
||||
if (!cards_found) {
|
||||
|
|
|
|||
|
|
@ -472,7 +472,6 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp)
|
|||
{
|
||||
int status, count;
|
||||
|
||||
mutex_lock(&qdev->mpi_mutex);
|
||||
|
||||
/* Begin polled mode for MPI */
|
||||
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
|
||||
|
|
@ -541,7 +540,6 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp)
|
|||
status = -EIO;
|
||||
}
|
||||
end:
|
||||
mutex_unlock(&qdev->mpi_mutex);
|
||||
/* End polled mode for MPI */
|
||||
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI);
|
||||
return status;
|
||||
|
|
@ -776,7 +774,9 @@ static int ql_idc_wait(struct ql_adapter *qdev)
|
|||
static int ql_set_port_cfg(struct ql_adapter *qdev)
|
||||
{
|
||||
int status;
|
||||
rtnl_lock();
|
||||
status = ql_mb_set_port_cfg(qdev);
|
||||
rtnl_unlock();
|
||||
if (status)
|
||||
return status;
|
||||
status = ql_idc_wait(qdev);
|
||||
|
|
@ -797,7 +797,9 @@ void ql_mpi_port_cfg_work(struct work_struct *work)
|
|||
container_of(work, struct ql_adapter, mpi_port_cfg_work.work);
|
||||
int status;
|
||||
|
||||
rtnl_lock();
|
||||
status = ql_mb_get_port_cfg(qdev);
|
||||
rtnl_unlock();
|
||||
if (status) {
|
||||
QPRINTK(qdev, DRV, ERR,
|
||||
"Bug: Failed to get port config data.\n");
|
||||
|
|
@ -855,7 +857,9 @@ void ql_mpi_idc_work(struct work_struct *work)
|
|||
* needs to be set.
|
||||
* */
|
||||
set_bit(QL_CAM_RT_SET, &qdev->flags);
|
||||
rtnl_lock();
|
||||
status = ql_mb_idc_ack(qdev);
|
||||
rtnl_unlock();
|
||||
if (status) {
|
||||
QPRINTK(qdev, DRV, ERR,
|
||||
"Bug: No pending IDC!\n");
|
||||
|
|
@ -871,7 +875,7 @@ void ql_mpi_work(struct work_struct *work)
|
|||
struct mbox_params *mbcp = &mbc;
|
||||
int err = 0;
|
||||
|
||||
mutex_lock(&qdev->mpi_mutex);
|
||||
rtnl_lock();
|
||||
|
||||
while (ql_read32(qdev, STS) & STS_PI) {
|
||||
memset(mbcp, 0, sizeof(struct mbox_params));
|
||||
|
|
@ -884,7 +888,7 @@ void ql_mpi_work(struct work_struct *work)
|
|||
break;
|
||||
}
|
||||
|
||||
mutex_unlock(&qdev->mpi_mutex);
|
||||
rtnl_unlock();
|
||||
ql_enable_completion_interrupt(qdev, 0);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -902,11 +902,12 @@ static int tg3_mdio_read(struct mii_bus *bp, int mii_id, int reg)
|
|||
struct tg3 *tp = bp->priv;
|
||||
u32 val;
|
||||
|
||||
if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_PAUSED)
|
||||
return -EAGAIN;
|
||||
spin_lock_bh(&tp->lock);
|
||||
|
||||
if (tg3_readphy(tp, reg, &val))
|
||||
return -EIO;
|
||||
val = -EIO;
|
||||
|
||||
spin_unlock_bh(&tp->lock);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
|
@ -914,14 +915,16 @@ static int tg3_mdio_read(struct mii_bus *bp, int mii_id, int reg)
|
|||
static int tg3_mdio_write(struct mii_bus *bp, int mii_id, int reg, u16 val)
|
||||
{
|
||||
struct tg3 *tp = bp->priv;
|
||||
u32 ret = 0;
|
||||
|
||||
if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_PAUSED)
|
||||
return -EAGAIN;
|
||||
spin_lock_bh(&tp->lock);
|
||||
|
||||
if (tg3_writephy(tp, reg, val))
|
||||
return -EIO;
|
||||
ret = -EIO;
|
||||
|
||||
return 0;
|
||||
spin_unlock_bh(&tp->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int tg3_mdio_reset(struct mii_bus *bp)
|
||||
|
|
@ -1011,12 +1014,6 @@ static void tg3_mdio_config_5785(struct tg3 *tp)
|
|||
|
||||
static void tg3_mdio_start(struct tg3 *tp)
|
||||
{
|
||||
if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) {
|
||||
mutex_lock(&tp->mdio_bus->mdio_lock);
|
||||
tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_PAUSED;
|
||||
mutex_unlock(&tp->mdio_bus->mdio_lock);
|
||||
}
|
||||
|
||||
tp->mi_mode &= ~MAC_MI_MODE_AUTO_POLL;
|
||||
tw32_f(MAC_MI_MODE, tp->mi_mode);
|
||||
udelay(80);
|
||||
|
|
@ -1041,15 +1038,6 @@ static void tg3_mdio_start(struct tg3 *tp)
|
|||
tg3_mdio_config_5785(tp);
|
||||
}
|
||||
|
||||
static void tg3_mdio_stop(struct tg3 *tp)
|
||||
{
|
||||
if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) {
|
||||
mutex_lock(&tp->mdio_bus->mdio_lock);
|
||||
tp->tg3_flags3 |= TG3_FLG3_MDIOBUS_PAUSED;
|
||||
mutex_unlock(&tp->mdio_bus->mdio_lock);
|
||||
}
|
||||
}
|
||||
|
||||
static int tg3_mdio_init(struct tg3 *tp)
|
||||
{
|
||||
int i;
|
||||
|
|
@ -1141,7 +1129,6 @@ static void tg3_mdio_fini(struct tg3 *tp)
|
|||
tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_INITED;
|
||||
mdiobus_unregister(tp->mdio_bus);
|
||||
mdiobus_free(tp->mdio_bus);
|
||||
tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_PAUSED;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1363,7 +1350,7 @@ static void tg3_adjust_link(struct net_device *dev)
|
|||
struct tg3 *tp = netdev_priv(dev);
|
||||
struct phy_device *phydev = tp->mdio_bus->phy_map[PHY_ADDR];
|
||||
|
||||
spin_lock(&tp->lock);
|
||||
spin_lock_bh(&tp->lock);
|
||||
|
||||
mac_mode = tp->mac_mode & ~(MAC_MODE_PORT_MODE_MASK |
|
||||
MAC_MODE_HALF_DUPLEX);
|
||||
|
|
@ -1431,7 +1418,7 @@ static void tg3_adjust_link(struct net_device *dev)
|
|||
tp->link_config.active_speed = phydev->speed;
|
||||
tp->link_config.active_duplex = phydev->duplex;
|
||||
|
||||
spin_unlock(&tp->lock);
|
||||
spin_unlock_bh(&tp->lock);
|
||||
|
||||
if (linkmesg)
|
||||
tg3_link_report(tp);
|
||||
|
|
@ -6392,8 +6379,6 @@ static int tg3_chip_reset(struct tg3 *tp)
|
|||
|
||||
tg3_nvram_lock(tp);
|
||||
|
||||
tg3_mdio_stop(tp);
|
||||
|
||||
tg3_ape_lock(tp, TG3_APE_LOCK_GRC);
|
||||
|
||||
/* No matching tg3_nvram_unlock() after this because
|
||||
|
|
@ -8698,6 +8683,8 @@ static int tg3_close(struct net_device *dev)
|
|||
|
||||
del_timer_sync(&tp->timer);
|
||||
|
||||
tg3_phy_stop(tp);
|
||||
|
||||
tg3_full_lock(tp, 1);
|
||||
#if 0
|
||||
tg3_dump_state(tp);
|
||||
|
|
|
|||
|
|
@ -2748,7 +2748,6 @@ struct tg3 {
|
|||
#define TG3_FLG3_5701_DMA_BUG 0x00000008
|
||||
#define TG3_FLG3_USE_PHYLIB 0x00000010
|
||||
#define TG3_FLG3_MDIOBUS_INITED 0x00000020
|
||||
#define TG3_FLG3_MDIOBUS_PAUSED 0x00000040
|
||||
#define TG3_FLG3_PHY_CONNECTED 0x00000080
|
||||
#define TG3_FLG3_RGMII_STD_IBND_DISABLE 0x00000100
|
||||
#define TG3_FLG3_RGMII_EXT_IBND_RX_EN 0x00000200
|
||||
|
|
|
|||
|
|
@ -418,6 +418,7 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags)
|
|||
goto halt_fail_and_release;
|
||||
}
|
||||
memcpy(net->dev_addr, bp, ETH_ALEN);
|
||||
memcpy(net->perm_addr, bp, ETH_ALEN);
|
||||
|
||||
/* set a nonzero filter to enable data transfers */
|
||||
memset(u.set, 0, sizeof *u.set);
|
||||
|
|
|
|||
Loading…
Reference in a new issue