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

Commit 359aa09b authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (29 commits)
  zaurus: add usb id for motomagx phones
  usbnet: make usbnet_get_link() fall back to ethtool_op_get_link()
  veth: Fix carrier detect
  cdc_ether: add usb id for Ericsson F3507g
  r8169: read MAC address from EEPROM on init (2nd attempt)
  tcp: fix retrans_out leaks
  net headers: export dcbnl.h
  net headers: cleanup dcbnl.h
  netpoll: Add drop checks to all entry points
  gianfar: Do right check on num_txbdfree
  pkt_sched: sch_drr: Fix oops in drr_change_class.
  b44: Disable device on shutdown
  b44: Unconditionally enable interrupt routing on reset
  net: fix hp-plus build error
  libertas: fix misuse of netdev_priv() and dev->ml_priv
  ipv6: don't use tw net when accounting for recycled tw
  asix: new device ids
  tcp_scalable: Update malformed & dead url
  netfilter: xt_recent: fix proc-file addition/removal of IPv4 addresses
  netxen: handle pci bar 0 mapping failure
  ...
parents c742b4bf 52c0326b
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -1264,8 +1264,14 @@ static void b44_clear_stats(struct b44 *bp)
static void b44_chip_reset(struct b44 *bp, int reset_kind)
{
	struct ssb_device *sdev = bp->sdev;
	bool was_enabled;

	if (ssb_device_is_enabled(bp->sdev)) {
	was_enabled = ssb_device_is_enabled(bp->sdev);

	ssb_device_enable(bp->sdev, 0);
	ssb_pcicore_dev_irqvecs_enable(&sdev->bus->pcicore, sdev);

	if (was_enabled) {
		bw32(bp, B44_RCV_LAZY, 0);
		bw32(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE);
		b44_wait_bit(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE, 200, 1);
@@ -1277,10 +1283,8 @@ static void b44_chip_reset(struct b44 *bp, int reset_kind)
		}
		bw32(bp, B44_DMARX_CTRL, 0);
		bp->rx_prod = bp->rx_cons = 0;
	} else
		ssb_pcicore_dev_irqvecs_enable(&sdev->bus->pcicore, sdev);
	}

	ssb_device_enable(bp->sdev, 0);
	b44_clear_stats(bp);

	/*
@@ -2236,6 +2240,7 @@ static void __devexit b44_remove_one(struct ssb_device *sdev)
	struct net_device *dev = ssb_get_drvdata(sdev);

	unregister_netdev(dev);
	ssb_device_disable(sdev, 0);
	ssb_bus_may_powerdown(sdev->bus);
	free_netdev(dev);
	ssb_pcihost_set_power_state(sdev, PCI_D3hot);
+1 −1
Original line number Diff line number Diff line
@@ -1284,7 +1284,7 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
	spin_lock_irqsave(&priv->txlock, flags);

	/* check if there is space to queue this packet */
	if (nr_frags > priv->num_txbdfree) {
	if ((nr_frags+1) > priv->num_txbdfree) {
		/* no space, stop the queue */
		netif_stop_queue(dev);
		dev->stats.tx_fifo_errors++;
+1 −1
Original line number Diff line number Diff line
@@ -467,7 +467,7 @@ init_module(void)
			if (this_dev != 0) break; /* only autoprobe 1st one */
			printk(KERN_NOTICE "hp-plus.c: Presently autoprobing (not recommended) for a single card.\n");
		}
		dev = alloc_ei_netdev();
		dev = alloc_eip_netdev();
		if (!dev)
			break;
		dev->irq = irq[this_dev];
+12 −4
Original line number Diff line number Diff line
@@ -588,7 +588,12 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
		adapter->pci_mem_read = netxen_nic_pci_mem_read_2M;
		adapter->pci_mem_write = netxen_nic_pci_mem_write_2M;

		mem_ptr0 = ioremap(mem_base, mem_len);
		mem_ptr0 = pci_ioremap_bar(pdev, 0);
		if (mem_ptr0 == NULL) {
			dev_err(&pdev->dev, "failed to map PCI bar 0\n");
			return -EIO;
		}

		pci_len0 = mem_len;
		first_page_group_start = 0;
		first_page_group_end   = 0;
@@ -795,9 +800,12 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
	 * See if the firmware gave us a virtual-physical port mapping.
	 */
	adapter->physical_port = adapter->portnum;
	i = adapter->pci_read_normalize(adapter, CRB_V2P(adapter->portnum));
	if (adapter->fw_major < 4) {
		i = adapter->pci_read_normalize(adapter,
				CRB_V2P(adapter->portnum));
		if (i != 0x55555555)
			adapter->physical_port = i;
	}

	adapter->flags &= ~(NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED);

+112 −2
Original line number Diff line number Diff line
@@ -81,9 +81,9 @@ static const int multicast_filter_limit = 32;
#define RTL8169_TX_TIMEOUT	(6*HZ)
#define RTL8169_PHY_TIMEOUT	(10*HZ)

#define RTL_EEPROM_SIG		cpu_to_le32(0x8129)
#define RTL_EEPROM_SIG_MASK	cpu_to_le32(0xffff)
#define RTL_EEPROM_SIG		0x8129
#define RTL_EEPROM_SIG_ADDR	0x0000
#define RTL_EEPROM_MAC_ADDR	0x0007

/* write/read MMIO register */
#define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
@@ -293,6 +293,11 @@ enum rtl_register_content {
	/* Cfg9346Bits */
	Cfg9346_Lock	= 0x00,
	Cfg9346_Unlock	= 0xc0,
	Cfg9346_Program	= 0x80,		/* Programming mode */
	Cfg9346_EECS	= 0x08,		/* Chip select */
	Cfg9346_EESK	= 0x04,		/* Serial data clock */
	Cfg9346_EEDI	= 0x02,		/* Data input */
	Cfg9346_EEDO	= 0x01,		/* Data output */

	/* rx_mode_bits */
	AcceptErr	= 0x20,
@@ -305,6 +310,7 @@ enum rtl_register_content {
	/* RxConfigBits */
	RxCfgFIFOShift	= 13,
	RxCfgDMAShift	=  8,
	RxCfg9356SEL	=  6, 		/* EEPROM type: 0 = 9346, 1 = 9356 */

	/* TxConfigBits */
	TxInterFrameGapShift = 24,
@@ -1963,6 +1969,108 @@ static const struct net_device_ops rtl8169_netdev_ops = {

};

/* Delay between EEPROM clock transitions. Force out buffered PCI writes. */
#define RTL_EEPROM_DELAY()	RTL_R8(Cfg9346)
#define RTL_EEPROM_READ_CMD	6

/* read 16bit word stored in EEPROM. EEPROM is addressed by words. */
static u16 rtl_eeprom_read(void __iomem *ioaddr, int addr)
{
	u16 result = 0;
	int cmd, cmd_len, i;

	/* check for EEPROM address size (in bits) */
	if (RTL_R32(RxConfig) & (1 << RxCfg9356SEL)) {
		/* EEPROM is 93C56 */
		cmd_len = 3 + 8; /* 3 bits for command id and 8 for address */
		cmd = (RTL_EEPROM_READ_CMD << 8) | (addr & 0xff);
	} else {
		/* EEPROM is 93C46 */
		cmd_len = 3 + 6; /* 3 bits for command id and 6 for address */
		cmd = (RTL_EEPROM_READ_CMD << 6) | (addr & 0x3f);
	}

	/* enter programming mode */
	RTL_W8(Cfg9346, Cfg9346_Program | Cfg9346_EECS);
	RTL_EEPROM_DELAY();

	/* write command and requested address */
	while (cmd_len--) {
		u8 x = Cfg9346_Program | Cfg9346_EECS;

		x |= (cmd & (1 << cmd_len)) ? Cfg9346_EEDI : 0;

		/* write a bit */
		RTL_W8(Cfg9346, x);
		RTL_EEPROM_DELAY();

		/* raise clock */
		RTL_W8(Cfg9346, x | Cfg9346_EESK);
		RTL_EEPROM_DELAY();
	}

	/* lower clock */
	RTL_W8(Cfg9346, Cfg9346_Program | Cfg9346_EECS);
	RTL_EEPROM_DELAY();

	/* read back 16bit value */
	for (i = 16; i > 0; i--) {
		/* raise clock */
		RTL_W8(Cfg9346, Cfg9346_Program | Cfg9346_EECS | Cfg9346_EESK);
		RTL_EEPROM_DELAY();

		result <<= 1;
		result |= (RTL_R8(Cfg9346) & Cfg9346_EEDO) ? 1 : 0;

		/* lower clock */
		RTL_W8(Cfg9346, Cfg9346_Program | Cfg9346_EECS);
		RTL_EEPROM_DELAY();
	}

	RTL_W8(Cfg9346, Cfg9346_Program);
	/* leave programming mode */
	RTL_W8(Cfg9346, Cfg9346_Lock);

	return result;
}

static void rtl_init_mac_address(struct rtl8169_private *tp,
				 void __iomem *ioaddr)
{
	struct pci_dev *pdev = tp->pci_dev;
	u16 x;
	u8 mac[8];

	/* read EEPROM signature */
	x = rtl_eeprom_read(ioaddr, RTL_EEPROM_SIG_ADDR);

	if (x != RTL_EEPROM_SIG) {
		dev_info(&pdev->dev, "Missing EEPROM signature: %04x\n", x);
		return;
	}

	/* read MAC address */
	x = rtl_eeprom_read(ioaddr, RTL_EEPROM_MAC_ADDR);
	mac[0] = x & 0xff;
	mac[1] = x >> 8;
	x = rtl_eeprom_read(ioaddr, RTL_EEPROM_MAC_ADDR + 1);
	mac[2] = x & 0xff;
	mac[3] = x >> 8;
	x = rtl_eeprom_read(ioaddr, RTL_EEPROM_MAC_ADDR + 2);
	mac[4] = x & 0xff;
	mac[5] = x >> 8;

	if (netif_msg_probe(tp)) {
		DECLARE_MAC_BUF(buf);

		dev_info(&pdev->dev, "MAC address found in EEPROM: %s\n",
			 print_mac(buf, mac));
	}

	if (is_valid_ether_addr(mac))
		rtl_rar_set(tp, mac);
}

static int __devinit
rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
{
@@ -2141,6 +2249,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)

	tp->mmio_addr = ioaddr;

	rtl_init_mac_address(tp, ioaddr);

	/* Get MAC address */
	for (i = 0; i < MAC_ADDR_LEN; i++)
		dev->dev_addr[i] = RTL_R8(MAC0 + i);
Loading