Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7fe13c57 authored by David S. Miller's avatar David S. Miller
Browse files

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

parents 8aa0f64a 10c435f1
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -3643,6 +3643,13 @@ F: Documentation/blockdev/nbd.txt
F:	drivers/block/nbd.c
F:	drivers/block/nbd.c
F:	include/linux/nbd.h
F:	include/linux/nbd.h


NETWORK DROP MONITOR
M:	Neil Horman <nhorman@tuxdriver.com>
L:	netdev@vger.kernel.org
S:	Maintained
W:	https://fedorahosted.org/dropwatch/
F:	net/core/drop_monitor.c

NETWORKING [GENERAL]
NETWORKING [GENERAL]
M:	"David S. Miller" <davem@davemloft.net>
M:	"David S. Miller" <davem@davemloft.net>
L:	netdev@vger.kernel.org
L:	netdev@vger.kernel.org
+4 −4
Original line number Original line Diff line number Diff line
@@ -2,6 +2,10 @@
# Makefile for the Linux network (ethercard) device drivers.
# Makefile for the Linux network (ethercard) device drivers.
#
#


obj-$(CONFIG_MII) += mii.o
obj-$(CONFIG_MDIO) += mdio.o
obj-$(CONFIG_PHYLIB) += phy/

obj-$(CONFIG_TI_DAVINCI_EMAC) += davinci_emac.o
obj-$(CONFIG_TI_DAVINCI_EMAC) += davinci_emac.o


obj-$(CONFIG_E1000) += e1000/
obj-$(CONFIG_E1000) += e1000/
@@ -100,10 +104,6 @@ obj-$(CONFIG_SH_ETH) += sh_eth.o
# end link order section
# end link order section
#
#


obj-$(CONFIG_MII) += mii.o
obj-$(CONFIG_MDIO) += mdio.o
obj-$(CONFIG_PHYLIB) += phy/

obj-$(CONFIG_SUNDANCE) += sundance.o
obj-$(CONFIG_SUNDANCE) += sundance.o
obj-$(CONFIG_HAMACHI) += hamachi.o
obj-$(CONFIG_HAMACHI) += hamachi.o
obj-$(CONFIG_NET) += Space.o loopback.o
obj-$(CONFIG_NET) += Space.o loopback.o
+1 −3
Original line number Original line Diff line number Diff line
@@ -721,7 +721,7 @@ static inline void update_rx_stats(struct net_device *dev, u32 status)
		ps->rx_errors++;
		ps->rx_errors++;
		if (status & RX_MISSED_FRAME)
		if (status & RX_MISSED_FRAME)
			ps->rx_missed_errors++;
			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++;
			ps->rx_length_errors++;
		if (status & RX_CRC_ERROR)
		if (status & RX_CRC_ERROR)
			ps->rx_crc_errors++;
			ps->rx_crc_errors++;
@@ -794,8 +794,6 @@ static int au1000_rx(struct net_device *dev)
					printk("rx len error\n");
					printk("rx len error\n");
				if (status & RX_U_CNTRL_FRAME)
				if (status & RX_U_CNTRL_FRAME)
					printk("rx u control frame\n");
					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);
		prxd->buff_stat = (u32)(pDB->dma_addr | RX_DMA_ENABLE);
+54 −27
Original line number Original line Diff line number Diff line
@@ -19,6 +19,10 @@
#include <linux/platform_device.h>
#include <linux/platform_device.h>
#include <net/ethoc.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 */
/* register offsets */
#define	MODER		0x00
#define	MODER		0x00
#define	INT_SOURCE	0x04
#define	INT_SOURCE	0x04
@@ -167,6 +171,7 @@
 * struct ethoc - driver-private device structure
 * struct ethoc - driver-private device structure
 * @iobase:	pointer to I/O memory region
 * @iobase:	pointer to I/O memory region
 * @membase:	pointer to buffer memory region
 * @membase:	pointer to buffer memory region
 * @dma_alloc:	dma allocated buffer size
 * @num_tx:	number of send buffers
 * @num_tx:	number of send buffers
 * @cur_tx:	last send buffer written
 * @cur_tx:	last send buffer written
 * @dty_tx:	last buffer actually sent
 * @dty_tx:	last buffer actually sent
@@ -185,6 +190,7 @@
struct ethoc {
struct ethoc {
	void __iomem *iobase;
	void __iomem *iobase;
	void __iomem *membase;
	void __iomem *membase;
	int dma_alloc;


	unsigned int num_tx;
	unsigned int num_tx;
	unsigned int cur_tx;
	unsigned int cur_tx;
@@ -284,7 +290,7 @@ static int ethoc_init_ring(struct ethoc *dev)
	dev->cur_rx = 0;
	dev->cur_rx = 0;


	/* setup transmission buffers */
	/* setup transmission buffers */
	bd.addr = 0;
	bd.addr = virt_to_phys(dev->membase);
	bd.stat = TX_BD_IRQ | TX_BD_CRC;
	bd.stat = TX_BD_IRQ | TX_BD_CRC;


	for (i = 0; i < dev->num_tx; i++) {
	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 += ETHOC_BUFSIZ;
	}
	}


	bd.addr = dev->num_tx * ETHOC_BUFSIZ;
	bd.stat = RX_BD_EMPTY | RX_BD_IRQ;
	bd.stat = RX_BD_EMPTY | RX_BD_IRQ;


	for (i = 0; i < dev->num_rx; i++) {
	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) {
		if (ethoc_update_rx_stats(priv, &bd) == 0) {
			int size = bd.stat >> 16;
			int size = bd.stat >> 16;
			struct sk_buff *skb = netdev_alloc_skb(dev, size);
			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)) {
			if (likely(skb)) {
				void *src = priv->membase + bd.addr;
				void *src = phys_to_virt(bd.addr);
				memcpy_fromio(skb_put(skb, size), src, size);
				memcpy_fromio(skb_put(skb, size), src, size);
				skb->protocol = eth_type_trans(skb, dev);
				skb->protocol = eth_type_trans(skb, dev);
				priv->stats.rx_packets++;
				priv->stats.rx_packets++;
@@ -653,9 +662,9 @@ static int ethoc_open(struct net_device *dev)
	if (ret)
	if (ret)
		return ret;
		return ret;


	/* calculate the number of TX/RX buffers */
	/* calculate the number of TX/RX buffers, maximum 128 supported */
	num_bd = (dev->mem_end - dev->mem_start + 1) / ETHOC_BUFSIZ;
	num_bd = min(128, (dev->mem_end - dev->mem_start + 1) / ETHOC_BUFSIZ);
	priv->num_tx = min(min_tx, num_bd / 4);
	priv->num_tx = max(min_tx, num_bd / 4);
	priv->num_rx = num_bd - priv->num_tx;
	priv->num_rx = num_bd - priv->num_tx;
	ethoc_write(priv, TX_BD_NUM, 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
	else
		bd.stat &= ~TX_BD_PAD;
		bd.stat &= ~TX_BD_PAD;


	dest = priv->membase + bd.addr;
	dest = phys_to_virt(bd.addr);
	memcpy_toio(dest, skb->data, skb->len);
	memcpy_toio(dest, skb->data, skb->len);


	bd.stat &= ~(TX_BD_STATS | TX_BD_LEN_MASK);
	bd.stat &= ~(TX_BD_STATS | TX_BD_LEN_MASK);
@@ -903,12 +912,7 @@ static int ethoc_probe(struct platform_device *pdev)


	/* obtain buffer memory space */
	/* obtain buffer memory space */
	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
	if (!res) {
	if (res) {
		dev_err(&pdev->dev, "cannot obtain memory space\n");
		ret = -ENXIO;
		goto free;
	}

		mem = devm_request_mem_region(&pdev->dev, res->start,
		mem = devm_request_mem_region(&pdev->dev, res->start,
			res->end - res->start + 1, res->name);
			res->end - res->start + 1, res->name);
		if (!mem) {
		if (!mem) {
@@ -919,6 +923,8 @@ static int ethoc_probe(struct platform_device *pdev)


		netdev->mem_start = mem->start;
		netdev->mem_start = mem->start;
		netdev->mem_end   = mem->end;
		netdev->mem_end   = mem->end;
	}



	/* obtain device IRQ number */
	/* obtain device IRQ number */
	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
@@ -933,6 +939,7 @@ static int ethoc_probe(struct platform_device *pdev)
	/* setup driver-private data */
	/* setup driver-private data */
	priv = netdev_priv(netdev);
	priv = netdev_priv(netdev);
	priv->netdev = netdev;
	priv->netdev = netdev;
	priv->dma_alloc = 0;


	priv->iobase = devm_ioremap_nocache(&pdev->dev, netdev->base_addr,
	priv->iobase = devm_ioremap_nocache(&pdev->dev, netdev->base_addr,
			mmio->end - mmio->start + 1);
			mmio->end - mmio->start + 1);
@@ -942,13 +949,28 @@ static int ethoc_probe(struct platform_device *pdev)
		goto error;
		goto error;
	}
	}


	priv->membase = devm_ioremap_nocache(&pdev->dev, netdev->mem_start,
	if (netdev->mem_end) {
			mem->end - mem->start + 1);
		priv->membase = devm_ioremap_nocache(&pdev->dev,
			netdev->mem_start, mem->end - mem->start + 1);
		if (!priv->membase) {
		if (!priv->membase) {
			dev_err(&pdev->dev, "cannot remap memory space\n");
			dev_err(&pdev->dev, "cannot remap memory space\n");
			ret = -ENXIO;
			ret = -ENXIO;
			goto error;
			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. */
	/* Allow the platform setup code to pass in a MAC address. */
	if (pdev->dev.platform_data) {
	if (pdev->dev.platform_data) {
@@ -1034,6 +1056,9 @@ static int ethoc_probe(struct platform_device *pdev)
	kfree(priv->mdio->irq);
	kfree(priv->mdio->irq);
	mdiobus_free(priv->mdio);
	mdiobus_free(priv->mdio);
free:
free:
	if (priv->dma_alloc)
		dma_free_coherent(NULL, priv->dma_alloc, priv->membase,
			netdev->mem_start);
	free_netdev(netdev);
	free_netdev(netdev);
out:
out:
	return ret;
	return ret;
@@ -1059,7 +1084,9 @@ static int ethoc_remove(struct platform_device *pdev)
			kfree(priv->mdio->irq);
			kfree(priv->mdio->irq);
			mdiobus_free(priv->mdio);
			mdiobus_free(priv->mdio);
		}
		}

		if (priv->dma_alloc)
			dma_free_coherent(NULL, priv->dma_alloc, priv->membase,
				netdev->mem_start);
		unregister_netdev(netdev);
		unregister_netdev(netdev);
		free_netdev(netdev);
		free_netdev(netdev);
	}
	}
+5 −2
Original line number Original line Diff line number Diff line
@@ -443,7 +443,7 @@ static u32 __emac_calc_base_mr1(struct emac_instance *dev, int tx_size, int rx_s
		ret |= EMAC_MR1_TFS_2K;
		ret |= EMAC_MR1_TFS_2K;
		break;
		break;
	default:
	default:
		printk(KERN_WARNING "%s: Unknown Rx FIFO size %d\n",
		printk(KERN_WARNING "%s: Unknown Tx FIFO size %d\n",
		       dev->ndev->name, tx_size);
		       dev->ndev->name, tx_size);
	}
	}


@@ -470,6 +470,9 @@ static u32 __emac4_calc_base_mr1(struct emac_instance *dev, int tx_size, int rx_
	DBG2(dev, "__emac4_calc_base_mr1" NL);
	DBG2(dev, "__emac4_calc_base_mr1" NL);


	switch(tx_size) {
	switch(tx_size) {
	case 16384:
		ret |= EMAC4_MR1_TFS_16K;
		break;
	case 4096:
	case 4096:
		ret |= EMAC4_MR1_TFS_4K;
		ret |= EMAC4_MR1_TFS_4K;
		break;
		break;
@@ -477,7 +480,7 @@ static u32 __emac4_calc_base_mr1(struct emac_instance *dev, int tx_size, int rx_
		ret |= EMAC4_MR1_TFS_2K;
		ret |= EMAC4_MR1_TFS_2K;
		break;
		break;
	default:
	default:
		printk(KERN_WARNING "%s: Unknown Rx FIFO size %d\n",
		printk(KERN_WARNING "%s: Unknown Tx FIFO size %d\n",
		       dev->ndev->name, tx_size);
		       dev->ndev->name, tx_size);
	}
	}


Loading