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

Commit cbd09dbb authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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

* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6:
  [ZLIB]: Fix external builds of zlib_inflate code.
  [TG3]: Fix APE induced regression
  [SKY2]: version 1.19
  [SKY2]: use netdevice stats struct
  [SKY2]: fiber advertise bits initialization (trivial)
  [SKY2]: fix power settings on Yukon XL
  [SKY2]: ethtool register reserved area blackout
parents d81fec0f d4faaecb
Loading
Loading
Loading
Loading
+75 −39
Original line number Original line Diff line number Diff line
@@ -52,7 +52,7 @@
#include "sky2.h"
#include "sky2.h"


#define DRV_NAME		"sky2"
#define DRV_NAME		"sky2"
#define DRV_VERSION		"1.18"
#define DRV_VERSION		"1.19"
#define PFX			DRV_NAME " "
#define PFX			DRV_NAME " "


/*
/*
@@ -296,10 +296,10 @@ static const u16 copper_fc_adv[] = {


/* flow control to advertise bits when using 1000BaseX */
/* flow control to advertise bits when using 1000BaseX */
static const u16 fiber_fc_adv[] = {
static const u16 fiber_fc_adv[] = {
	[FC_BOTH] = PHY_M_P_BOTH_MD_X,
	[FC_NONE] = PHY_M_P_NO_PAUSE_X,
	[FC_TX]   = PHY_M_P_ASYM_MD_X,
	[FC_TX]   = PHY_M_P_ASYM_MD_X,
	[FC_RX]	  = PHY_M_P_SYM_MD_X,
	[FC_RX]	  = PHY_M_P_SYM_MD_X,
	[FC_NONE] = PHY_M_P_NO_PAUSE_X,
	[FC_BOTH] = PHY_M_P_BOTH_MD_X,
};
};


/* flow control to GMA disable bits */
/* flow control to GMA disable bits */
@@ -606,20 +606,19 @@ static void sky2_phy_power(struct sky2_hw *hw, unsigned port, int onoff)
{
{
	struct pci_dev *pdev = hw->pdev;
	struct pci_dev *pdev = hw->pdev;
	u32 reg1;
	u32 reg1;
	static const u32 phy_power[]
	static const u32 phy_power[] = { PCI_Y2_PHY1_POWD, PCI_Y2_PHY2_POWD };
		= { PCI_Y2_PHY1_POWD, PCI_Y2_PHY2_POWD };
	static const u32 coma_mode[] = { PCI_Y2_PHY1_COMA, PCI_Y2_PHY2_COMA };

	/* looks like this XL is back asswards .. */
	if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1)
		onoff = !onoff;


	pci_read_config_dword(pdev, PCI_DEV_REG1, &reg1);
	pci_read_config_dword(pdev, PCI_DEV_REG1, &reg1);
	/* Turn on/off phy power saving */
	if (onoff)
	if (onoff)
		/* Turn off phy power saving */
		reg1 &= ~phy_power[port];
		reg1 &= ~phy_power[port];
	else
	else
		reg1 |= phy_power[port];
		reg1 |= phy_power[port];


	if (onoff && hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1)
		reg1 |= coma_mode[port];

	pci_write_config_dword(pdev, PCI_DEV_REG1, reg1);
	pci_write_config_dword(pdev, PCI_DEV_REG1, reg1);
	pci_read_config_dword(pdev, PCI_DEV_REG1, &reg1);
	pci_read_config_dword(pdev, PCI_DEV_REG1, &reg1);


@@ -1636,8 +1635,8 @@ static void sky2_tx_complete(struct sky2_port *sky2, u16 done)
				printk(KERN_DEBUG "%s: tx done %u\n",
				printk(KERN_DEBUG "%s: tx done %u\n",
				       dev->name, idx);
				       dev->name, idx);


			sky2->net_stats.tx_packets++;
			dev->stats.tx_packets++;
			sky2->net_stats.tx_bytes += re->skb->len;
			dev->stats.tx_bytes += re->skb->len;


			dev_kfree_skb_any(re->skb);
			dev_kfree_skb_any(re->skb);
			sky2->tx_next = RING_NEXT(idx, TX_RING_SIZE);
			sky2->tx_next = RING_NEXT(idx, TX_RING_SIZE);
@@ -2205,16 +2204,16 @@ resubmit:
len_error:
len_error:
	/* Truncation of overlength packets
	/* Truncation of overlength packets
	   causes PHY length to not match MAC length */
	   causes PHY length to not match MAC length */
	++sky2->net_stats.rx_length_errors;
	++dev->stats.rx_length_errors;
	if (netif_msg_rx_err(sky2) && net_ratelimit())
	if (netif_msg_rx_err(sky2) && net_ratelimit())
		pr_info(PFX "%s: rx length error: status %#x length %d\n",
		pr_info(PFX "%s: rx length error: status %#x length %d\n",
			dev->name, status, length);
			dev->name, status, length);
	goto resubmit;
	goto resubmit;


error:
error:
	++sky2->net_stats.rx_errors;
	++dev->stats.rx_errors;
	if (status & GMR_FS_RX_FF_OV) {
	if (status & GMR_FS_RX_FF_OV) {
		sky2->net_stats.rx_over_errors++;
		dev->stats.rx_over_errors++;
		goto resubmit;
		goto resubmit;
	}
	}


@@ -2223,11 +2222,11 @@ error:
		       dev->name, status, length);
		       dev->name, status, length);


	if (status & (GMR_FS_LONG_ERR | GMR_FS_UN_SIZE))
	if (status & (GMR_FS_LONG_ERR | GMR_FS_UN_SIZE))
		sky2->net_stats.rx_length_errors++;
		dev->stats.rx_length_errors++;
	if (status & GMR_FS_FRAGMENT)
	if (status & GMR_FS_FRAGMENT)
		sky2->net_stats.rx_frame_errors++;
		dev->stats.rx_frame_errors++;
	if (status & GMR_FS_CRC_ERR)
	if (status & GMR_FS_CRC_ERR)
		sky2->net_stats.rx_crc_errors++;
		dev->stats.rx_crc_errors++;


	goto resubmit;
	goto resubmit;
}
}
@@ -2272,7 +2271,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx)
			++rx[port];
			++rx[port];
			skb = sky2_receive(dev, length, status);
			skb = sky2_receive(dev, length, status);
			if (unlikely(!skb)) {
			if (unlikely(!skb)) {
				sky2->net_stats.rx_dropped++;
				dev->stats.rx_dropped++;
				break;
				break;
			}
			}


@@ -2287,8 +2286,8 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx)
			}
			}


			skb->protocol = eth_type_trans(skb, dev);
			skb->protocol = eth_type_trans(skb, dev);
			sky2->net_stats.rx_packets++;
			dev->stats.rx_packets++;
			sky2->net_stats.rx_bytes += skb->len;
			dev->stats.rx_bytes += skb->len;
			dev->last_rx = jiffies;
			dev->last_rx = jiffies;


#ifdef SKY2_VLAN_TAG_USED
#ifdef SKY2_VLAN_TAG_USED
@@ -2479,12 +2478,12 @@ static void sky2_mac_intr(struct sky2_hw *hw, unsigned port)
		gma_read16(hw, port, GM_TX_IRQ_SRC);
		gma_read16(hw, port, GM_TX_IRQ_SRC);


	if (status & GM_IS_RX_FF_OR) {
	if (status & GM_IS_RX_FF_OR) {
		++sky2->net_stats.rx_fifo_errors;
		++dev->stats.rx_fifo_errors;
		sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_CLI_RX_FO);
		sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_CLI_RX_FO);
	}
	}


	if (status & GM_IS_TX_FF_UR) {
	if (status & GM_IS_TX_FF_UR) {
		++sky2->net_stats.tx_fifo_errors;
		++dev->stats.tx_fifo_errors;
		sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_CLI_TX_FU);
		sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_CLI_TX_FU);
	}
	}
}
}
@@ -3223,12 +3222,6 @@ static void sky2_get_strings(struct net_device *dev, u32 stringset, u8 * data)
	}
	}
}
}


static struct net_device_stats *sky2_get_stats(struct net_device *dev)
{
	struct sky2_port *sky2 = netdev_priv(dev);
	return &sky2->net_stats;
}

static int sky2_set_mac_address(struct net_device *dev, void *p)
static int sky2_set_mac_address(struct net_device *dev, void *p)
{
{
	struct sky2_port *sky2 = netdev_priv(dev);
	struct sky2_port *sky2 = netdev_priv(dev);
@@ -3569,20 +3562,64 @@ static void sky2_get_regs(struct net_device *dev, struct ethtool_regs *regs,
{
{
	const struct sky2_port *sky2 = netdev_priv(dev);
	const struct sky2_port *sky2 = netdev_priv(dev);
	const void __iomem *io = sky2->hw->regs;
	const void __iomem *io = sky2->hw->regs;
	unsigned int b;


	regs->version = 1;
	regs->version = 1;
	memset(p, 0, regs->len);

	memcpy_fromio(p, io, B3_RAM_ADDR);


	for (b = 0; b < 128; b++) {
		/* This complicated switch statement is to make sure and
		 * only access regions that are unreserved.
		 * Some blocks are only valid on dual port cards.
		 * and block 3 has some special diagnostic registers that
		 * are poison.
		 */
		switch (b) {
		case 3:
			/* skip diagnostic ram region */
			/* skip diagnostic ram region */
	memcpy_fromio(p + B3_RI_WTO_R1, io + B3_RI_WTO_R1, 0x2000 - B3_RI_WTO_R1);
			memcpy_fromio(p + 0x10, io + 0x10, 128 - 0x10);
			break;


	/* copy GMAC registers */
		/* dual port cards only */
	memcpy_fromio(p + BASE_GMAC_1, io + BASE_GMAC_1, 0x1000);
		case 5:		/* Tx Arbiter 2 */
	if (sky2->hw->ports > 1)
		case 9: 	/* RX2 */
		memcpy_fromio(p + BASE_GMAC_2, io + BASE_GMAC_2, 0x1000);
		case 14 ... 15:	/* TX2 */
		case 17: case 19: /* Ram Buffer 2 */
		case 22 ... 23: /* Tx Ram Buffer 2 */
		case 25: 	/* Rx MAC Fifo 1 */
		case 27: 	/* Tx MAC Fifo 2 */
		case 31:	/* GPHY 2 */
		case 40 ... 47: /* Pattern Ram 2 */
		case 52: case 54: /* TCP Segmentation 2 */
		case 112 ... 116: /* GMAC 2 */
			if (sky2->hw->ports == 1)
				goto reserved;
			/* fall through */
		case 0:		/* Control */
		case 2:		/* Mac address */
		case 4:		/* Tx Arbiter 1 */
		case 7:		/* PCI express reg */
		case 8:		/* RX1 */
		case 12 ... 13: /* TX1 */
		case 16: case 18:/* Rx Ram Buffer 1 */
		case 20 ... 21: /* Tx Ram Buffer 1 */
		case 24: 	/* Rx MAC Fifo 1 */
		case 26: 	/* Tx MAC Fifo 1 */
		case 28 ... 29: /* Descriptor and status unit */
		case 30:	/* GPHY 1*/
		case 32 ... 39: /* Pattern Ram 1 */
		case 48: case 50: /* TCP Segmentation 1 */
		case 56 ... 60:	/* PCI space */
		case 80 ... 84:	/* GMAC 1 */
			memcpy_fromio(p, io, 128);
			break;
		default:
reserved:
			memset(p, 0, 128);
		}


		p += 128;
		io += 128;
	}
}
}


/* In order to do Jumbo packets on these chips, need to turn off the
/* In order to do Jumbo packets on these chips, need to turn off the
@@ -3934,7 +3971,6 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
	dev->stop = sky2_down;
	dev->stop = sky2_down;
	dev->do_ioctl = sky2_ioctl;
	dev->do_ioctl = sky2_ioctl;
	dev->hard_start_xmit = sky2_xmit_frame;
	dev->hard_start_xmit = sky2_xmit_frame;
	dev->get_stats = sky2_get_stats;
	dev->set_multicast_list = sky2_set_multicast;
	dev->set_multicast_list = sky2_set_multicast;
	dev->set_mac_address = sky2_set_mac_address;
	dev->set_mac_address = sky2_set_mac_address;
	dev->change_mtu = sky2_change_mtu;
	dev->change_mtu = sky2_change_mtu;
+0 −2
Original line number Original line Diff line number Diff line
@@ -2031,8 +2031,6 @@ struct sky2_port {
#ifdef CONFIG_SKY2_DEBUG
#ifdef CONFIG_SKY2_DEBUG
	struct dentry	     *debugfs;
	struct dentry	     *debugfs;
#endif
#endif
	struct net_device_stats net_stats;

};
};


struct sky2_hw {
struct sky2_hw {
+4 −3
Original line number Original line Diff line number Diff line
@@ -6985,6 +6985,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
		break;
		break;
	};
	};


	if (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE)
		/* Write our heartbeat update interval to APE. */
		/* Write our heartbeat update interval to APE. */
		tg3_ape_write32(tp, TG3_APE_HOST_HEARTBEAT_INT_MS,
		tg3_ape_write32(tp, TG3_APE_HOST_HEARTBEAT_INT_MS,
				APE_HOST_HEARTBEAT_INT_DISABLE);
				APE_HOST_HEARTBEAT_INT_DISABLE);
+1 −1
Original line number Original line Diff line number Diff line
@@ -15,5 +15,5 @@


obj-$(CONFIG_ZLIB_INFLATE) += zlib_inflate.o
obj-$(CONFIG_ZLIB_INFLATE) += zlib_inflate.o


zlib_inflate-objs := inffast.o inflate.o \
zlib_inflate-objs := inffast.o inflate.o infutil.o \
		     inftrees.o inflate_syms.o
		     inftrees.o inflate_syms.o
+0 −47
Original line number Original line Diff line number Diff line
@@ -916,50 +916,3 @@ int zlib_inflateIncomp(z_stream *z)


    return Z_OK;
    return Z_OK;
}
}

#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>

/* Utility function: initialize zlib, unpack binary blob, clean up zlib,
 * return len or negative error code. */
int zlib_inflate_blob(void *gunzip_buf, unsigned sz, const void *buf, unsigned len)
{
	const u8 *zbuf = buf;
	struct z_stream_s *strm;
	int rc;

	rc = -ENOMEM;
	strm = kmalloc(sizeof(*strm), GFP_KERNEL);
	if (strm == NULL)
		goto gunzip_nomem1;
	strm->workspace = kmalloc(zlib_inflate_workspacesize(), GFP_KERNEL);
	if (strm->workspace == NULL)
		goto gunzip_nomem2;

	/* gzip header (1f,8b,08... 10 bytes total + possible asciz filename)
	 * expected to be stripped from input */

	strm->next_in = zbuf;
	strm->avail_in = len;
	strm->next_out = gunzip_buf;
	strm->avail_out = sz;

	rc = zlib_inflateInit2(strm, -MAX_WBITS);
	if (rc == Z_OK) {
		rc = zlib_inflate(strm, Z_FINISH);
		/* after Z_FINISH, only Z_STREAM_END is "we unpacked it all" */
		if (rc == Z_STREAM_END)
			rc = sz - strm->avail_out;
		else
			rc = -EINVAL;
		zlib_inflateEnd(strm);
	} else
		rc = -EINVAL;

	kfree(strm->workspace);
gunzip_nomem2:
	kfree(strm);
gunzip_nomem1:
	return rc; /* returns Z_OK (0) if successful */
}
Loading