mirror of
https://git.yoctoproject.org/meta-ti
synced 2026-07-27 14:28:05 +00:00
linux-mainline 3.2: kernel recipe based on mainline 3.2.16 with additional patches for e.g. beagleboard on top
This patchset is managed in https://github.com/beagleboard/kernel/tree/beagleboard-3.2 by Robert Nelson and myself. Tested on beagleboard-xM/Angstrom Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> Signed-off-by: Denys Dmytriyenko <denys@ti.com>
This commit is contained in:
committed by
Denys Dmytriyenko
parent
aff1018e66
commit
4e18d70247
+62
@@ -0,0 +1,62 @@
|
||||
From 84ab8eddc3e2d590489cf413ee86b9f20564994e Mon Sep 17 00:00:00 2001
|
||||
From: Robert Nelson <robertcnelson@gmail.com>
|
||||
Date: Thu, 29 Sep 2011 11:35:01 -0500
|
||||
Subject: [PATCH 01/14] ksz8851 eeprom 93cx6 add drive_data
|
||||
|
||||
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
|
||||
---
|
||||
drivers/misc/eeprom/eeprom_93cx6.c | 3 +++
|
||||
include/linux/eeprom_93cx6.h | 2 ++
|
||||
2 files changed, 5 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/drivers/misc/eeprom/eeprom_93cx6.c b/drivers/misc/eeprom/eeprom_93cx6.c
|
||||
index 7b33de9..a6037af 100644
|
||||
--- a/drivers/misc/eeprom/eeprom_93cx6.c
|
||||
+++ b/drivers/misc/eeprom/eeprom_93cx6.c
|
||||
@@ -63,6 +63,7 @@ static void eeprom_93cx6_startup(struct eeprom_93cx6 *eeprom)
|
||||
eeprom->reg_data_out = 0;
|
||||
eeprom->reg_data_clock = 0;
|
||||
eeprom->reg_chip_select = 1;
|
||||
+ eeprom->drive_data = 1;
|
||||
eeprom->register_write(eeprom);
|
||||
|
||||
/*
|
||||
@@ -101,6 +102,7 @@ static void eeprom_93cx6_write_bits(struct eeprom_93cx6 *eeprom,
|
||||
*/
|
||||
eeprom->reg_data_in = 0;
|
||||
eeprom->reg_data_out = 0;
|
||||
+ eeprom->drive_data = 1;
|
||||
|
||||
/*
|
||||
* Start writing all bits.
|
||||
@@ -140,6 +142,7 @@ static void eeprom_93cx6_read_bits(struct eeprom_93cx6 *eeprom,
|
||||
*/
|
||||
eeprom->reg_data_in = 0;
|
||||
eeprom->reg_data_out = 0;
|
||||
+ eeprom->drive_data = 0;
|
||||
|
||||
/*
|
||||
* Start reading all bits.
|
||||
diff --git a/include/linux/eeprom_93cx6.h b/include/linux/eeprom_93cx6.h
|
||||
index c4627cb..e04546e 100644
|
||||
--- a/include/linux/eeprom_93cx6.h
|
||||
+++ b/include/linux/eeprom_93cx6.h
|
||||
@@ -46,6 +46,7 @@
|
||||
* @register_write(struct eeprom_93cx6 *eeprom): handler to
|
||||
* write to the eeprom register by using all reg_* fields.
|
||||
* @width: eeprom width, should be one of the PCI_EEPROM_WIDTH_* defines
|
||||
+ * @drive_data: Set if we're driving the data line.
|
||||
* @reg_data_in: register field to indicate data input
|
||||
* @reg_data_out: register field to indicate data output
|
||||
* @reg_data_clock: register field to set the data clock
|
||||
@@ -62,6 +63,7 @@ struct eeprom_93cx6 {
|
||||
|
||||
int width;
|
||||
|
||||
+ char drive_data;
|
||||
char reg_data_in;
|
||||
char reg_data_out;
|
||||
char reg_data_clock;
|
||||
--
|
||||
1.7.7.4
|
||||
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
From cab9c276c954286c87db9aa7adc3c2cc3faaaf61 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Nelson <robertcnelson@gmail.com>
|
||||
Date: Thu, 29 Sep 2011 11:35:38 -0500
|
||||
Subject: [PATCH 02/14] ksz8851 eeprom 93cx6 add eeprom_93cx6_write
|
||||
|
||||
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
|
||||
---
|
||||
drivers/misc/eeprom/eeprom_93cx6.c | 86 ++++++++++++++++++++++++++++++++++++
|
||||
include/linux/eeprom_93cx6.h | 6 +++
|
||||
2 files changed, 92 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/drivers/misc/eeprom/eeprom_93cx6.c b/drivers/misc/eeprom/eeprom_93cx6.c
|
||||
index a6037af..77ca81f 100644
|
||||
--- a/drivers/misc/eeprom/eeprom_93cx6.c
|
||||
+++ b/drivers/misc/eeprom/eeprom_93cx6.c
|
||||
@@ -234,3 +234,89 @@ void eeprom_93cx6_multiread(struct eeprom_93cx6 *eeprom, const u8 word,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(eeprom_93cx6_multiread);
|
||||
|
||||
+
|
||||
+/**
|
||||
+ * eeprom_93cx6_wren - set the write enable state
|
||||
+ * @eeprom: Pointer to eeprom structure
|
||||
+ * @enable: true to enable writes, otherwise disable writes
|
||||
+ *
|
||||
+ * Set the EEPROM write enable state to either allow or deny
|
||||
+ * writes depending on the @enable value.
|
||||
+ */
|
||||
+void eeprom_93cx6_wren(struct eeprom_93cx6 *eeprom, bool enable)
|
||||
+{
|
||||
+ u16 command;
|
||||
+
|
||||
+ /* start the command */
|
||||
+ eeprom_93cx6_startup(eeprom);
|
||||
+
|
||||
+ /* create command to enable/disable */
|
||||
+
|
||||
+ command = enable ? PCI_EEPROM_EWEN_OPCODE : PCI_EEPROM_EWDS_OPCODE;
|
||||
+ command <<= (eeprom->width - 2);
|
||||
+
|
||||
+ eeprom_93cx6_write_bits(eeprom, command,
|
||||
+ PCI_EEPROM_WIDTH_OPCODE + eeprom->width);
|
||||
+
|
||||
+ eeprom_93cx6_cleanup(eeprom);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(eeprom_93cx6_wren);
|
||||
+
|
||||
+/**
|
||||
+ * eeprom_93cx6_write - write data to the EEPROM
|
||||
+ * @eeprom: Pointer to eeprom structure
|
||||
+ * @addr: Address to write data to.
|
||||
+ * @data: The data to write to address @addr.
|
||||
+ *
|
||||
+ * Write the @data to the specified @addr in the EEPROM and
|
||||
+ * waiting for the device to finish writing.
|
||||
+ *
|
||||
+ * Note, since we do not expect large number of write operations
|
||||
+ * we use msleep() to delay in between parts of the operation to
|
||||
+ * avoid using excessive amounts of CPU time busy waiting.
|
||||
+ */
|
||||
+void eeprom_93cx6_write(struct eeprom_93cx6 *eeprom, u8 addr, u16 data)
|
||||
+{
|
||||
+ int timeout = 100;
|
||||
+ u16 command;
|
||||
+
|
||||
+ /* start the command */
|
||||
+ eeprom_93cx6_startup(eeprom);
|
||||
+
|
||||
+ command = PCI_EEPROM_WRITE_OPCODE << eeprom->width;
|
||||
+ command |= addr;
|
||||
+
|
||||
+ /* send write command */
|
||||
+ eeprom_93cx6_write_bits(eeprom, command,
|
||||
+ PCI_EEPROM_WIDTH_OPCODE + eeprom->width);
|
||||
+
|
||||
+ /* send data */
|
||||
+ eeprom_93cx6_write_bits(eeprom, data, 16);
|
||||
+
|
||||
+ /* get ready to check for busy */
|
||||
+ eeprom->drive_data = 0;
|
||||
+ eeprom->reg_chip_select = 1;
|
||||
+ eeprom->register_write(eeprom);
|
||||
+
|
||||
+ /* wait at-least 250ns to get DO to be the busy signal */
|
||||
+ msleep(1);
|
||||
+
|
||||
+ /* wait for DO to go high to signify finish */
|
||||
+
|
||||
+ while (true) {
|
||||
+ eeprom->register_read(eeprom);
|
||||
+
|
||||
+ if (eeprom->reg_data_out)
|
||||
+ break;
|
||||
+
|
||||
+ msleep(1);
|
||||
+
|
||||
+ if (--timeout <= 0) {
|
||||
+ printk(KERN_ERR "%s: timeout\n", __func__);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ eeprom_93cx6_cleanup(eeprom);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(eeprom_93cx6_write);
|
||||
diff --git a/include/linux/eeprom_93cx6.h b/include/linux/eeprom_93cx6.h
|
||||
index e04546e..e50f98b 100644
|
||||
--- a/include/linux/eeprom_93cx6.h
|
||||
+++ b/include/linux/eeprom_93cx6.h
|
||||
@@ -33,6 +33,7 @@
|
||||
#define PCI_EEPROM_WIDTH_93C86 8
|
||||
#define PCI_EEPROM_WIDTH_OPCODE 3
|
||||
#define PCI_EEPROM_WRITE_OPCODE 0x05
|
||||
+#define PCI_EEPROM_ERASE_OPCODE 0x07
|
||||
#define PCI_EEPROM_READ_OPCODE 0x06
|
||||
#define PCI_EEPROM_EWDS_OPCODE 0x10
|
||||
#define PCI_EEPROM_EWEN_OPCODE 0x13
|
||||
@@ -74,3 +75,8 @@ extern void eeprom_93cx6_read(struct eeprom_93cx6 *eeprom,
|
||||
const u8 word, u16 *data);
|
||||
extern void eeprom_93cx6_multiread(struct eeprom_93cx6 *eeprom,
|
||||
const u8 word, __le16 *data, const u16 words);
|
||||
+
|
||||
+extern void eeprom_93cx6_wren(struct eeprom_93cx6 *eeprom, bool enable);
|
||||
+
|
||||
+extern void eeprom_93cx6_write(struct eeprom_93cx6 *eeprom,
|
||||
+ u8 addr, u16 data);
|
||||
--
|
||||
1.7.7.4
|
||||
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
From 9318b0759a699e6128817bead791603201e73d99 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Nelson <robertcnelson@gmail.com>
|
||||
Date: Thu, 29 Sep 2011 11:36:22 -0500
|
||||
Subject: [PATCH 03/14] ksz8851 read_mac_addr
|
||||
|
||||
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
|
||||
---
|
||||
drivers/net/ethernet/micrel/ks8851.c | 44 ++++++++++++++++++++++++++++-----
|
||||
1 files changed, 37 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c
|
||||
index f56743a..da7cbea 100644
|
||||
--- a/drivers/net/ethernet/micrel/ks8851.c
|
||||
+++ b/drivers/net/ethernet/micrel/ks8851.c
|
||||
@@ -367,21 +367,47 @@ static int ks8851_write_mac_addr(struct net_device *dev)
|
||||
}
|
||||
|
||||
/**
|
||||
+ * ks8851_read_mac_addr - read mac address from device registers
|
||||
+ * @dev: The network device
|
||||
+ *
|
||||
+ * Update our copy of the KS8851 MAC address from the registers of @dev.
|
||||
+*/
|
||||
+static void ks8851_read_mac_addr(struct net_device *dev)
|
||||
+{
|
||||
+ struct ks8851_net *ks = netdev_priv(dev);
|
||||
+ int i;
|
||||
+
|
||||
+ mutex_lock(&ks->lock);
|
||||
+
|
||||
+ for (i = 0; i < ETH_ALEN; i++)
|
||||
+ dev->dev_addr[i] = ks8851_rdreg8(ks, KS_MAR(i));
|
||||
+
|
||||
+ mutex_unlock(&ks->lock);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* ks8851_init_mac - initialise the mac address
|
||||
* @ks: The device structure
|
||||
*
|
||||
* Get or create the initial mac address for the device and then set that
|
||||
- * into the station address register. Currently we assume that the device
|
||||
- * does not have a valid mac address in it, and so we use random_ether_addr()
|
||||
+ * into the station address register. If there is an EEPROM present, then
|
||||
+ * we try that. If no valid mac address is found we use random_ether_addr()
|
||||
* to create a new one.
|
||||
- *
|
||||
- * In future, the driver should check to see if the device has an EEPROM
|
||||
- * attached and whether that has a valid ethernet address in it.
|
||||
*/
|
||||
static void ks8851_init_mac(struct ks8851_net *ks)
|
||||
{
|
||||
struct net_device *dev = ks->netdev;
|
||||
|
||||
+ /* first, try reading what we've got already */
|
||||
+ if (ks->rc_ccr & CCR_EEPROM) {
|
||||
+ ks8851_read_mac_addr(dev);
|
||||
+ if (is_valid_ether_addr(dev->dev_addr))
|
||||
+ return;
|
||||
+
|
||||
+ netdev_err(ks->netdev, "invalid mac address read %pM\n",
|
||||
+ dev->dev_addr);
|
||||
+ }
|
||||
+
|
||||
random_ether_addr(dev->dev_addr);
|
||||
ks8851_write_mac_addr(dev);
|
||||
}
|
||||
@@ -1658,6 +1684,9 @@ static int __devinit ks8851_probe(struct spi_device *spi)
|
||||
else
|
||||
ks->eeprom_size = 0;
|
||||
|
||||
+ /* cache the contents of the CCR register for EEPROM, etc. */
|
||||
+ ks->rc_ccr = ks8851_rdreg16(ks, KS_CCR);
|
||||
+
|
||||
ks8851_read_selftest(ks);
|
||||
ks8851_init_mac(ks);
|
||||
|
||||
@@ -1674,9 +1703,10 @@ static int __devinit ks8851_probe(struct spi_device *spi)
|
||||
goto err_netdev;
|
||||
}
|
||||
|
||||
- netdev_info(ndev, "revision %d, MAC %pM, IRQ %d\n",
|
||||
+ netdev_info(ndev, "revision %d, MAC %pM, IRQ %d %s EEPROM\n",
|
||||
CIDER_REV_GET(ks8851_rdreg16(ks, KS_CIDER)),
|
||||
- ndev->dev_addr, ndev->irq);
|
||||
+ ndev->dev_addr, ndev->irq,
|
||||
+ ks->rc_ccr & CCR_EEPROM ? "has" : "no");
|
||||
|
||||
return 0;
|
||||
|
||||
--
|
||||
1.7.7.4
|
||||
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
From 2b458e8bc6c07d7de20eb202c8f9c895dcf5ec6b Mon Sep 17 00:00:00 2001
|
||||
From: Robert Nelson <robertcnelson@gmail.com>
|
||||
Date: Thu, 29 Sep 2011 11:36:58 -0500
|
||||
Subject: [PATCH 04/14] ksz8851 93cx6 eeprom access
|
||||
|
||||
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
|
||||
---
|
||||
drivers/net/ethernet/micrel/Kconfig | 1 +
|
||||
drivers/net/ethernet/micrel/ks8851.c | 72 ++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 73 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/micrel/Kconfig b/drivers/net/ethernet/micrel/Kconfig
|
||||
index d10c2e1..fe42fc0 100644
|
||||
--- a/drivers/net/ethernet/micrel/Kconfig
|
||||
+++ b/drivers/net/ethernet/micrel/Kconfig
|
||||
@@ -42,6 +42,7 @@ config KS8851
|
||||
select NET_CORE
|
||||
select MII
|
||||
select CRC32
|
||||
+ select EEPROM_93CX6
|
||||
---help---
|
||||
SPI driver for Micrel KS8851 SPI attached network chip.
|
||||
|
||||
diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c
|
||||
index da7cbea..6a7f27f 100644
|
||||
--- a/drivers/net/ethernet/micrel/ks8851.c
|
||||
+++ b/drivers/net/ethernet/micrel/ks8851.c
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <linux/cache.h>
|
||||
#include <linux/crc32.h>
|
||||
#include <linux/mii.h>
|
||||
+#include <linux/eeprom_93cx6.h>
|
||||
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
@@ -128,6 +129,8 @@ struct ks8851_net {
|
||||
struct spi_message spi_msg2;
|
||||
struct spi_transfer spi_xfer1;
|
||||
struct spi_transfer spi_xfer2[2];
|
||||
+
|
||||
+ struct eeprom_93cx6 eeprom;
|
||||
};
|
||||
|
||||
static int msg_enable;
|
||||
@@ -1449,6 +1452,68 @@ static int ks8851_set_eeprom(struct net_device *dev,
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
+/* EEPROM support */
|
||||
+
|
||||
+static void ks8851_eeprom_regread(struct eeprom_93cx6 *ee)
|
||||
+{
|
||||
+ struct ks8851_net *ks = ee->data;
|
||||
+ unsigned val;
|
||||
+
|
||||
+ val = ks8851_rdreg16(ks, KS_EEPCR);
|
||||
+
|
||||
+ ee->reg_data_out = (val & EEPCR_EESB) ? 1 : 0;
|
||||
+ ee->reg_data_clock = (val & EEPCR_EESCK) ? 1 : 0;
|
||||
+ ee->reg_chip_select = (val & EEPCR_EECS) ? 1 : 0;
|
||||
+}
|
||||
+
|
||||
+static void ks8851_eeprom_regwrite(struct eeprom_93cx6 *ee)
|
||||
+{
|
||||
+ struct ks8851_net *ks = ee->data;
|
||||
+ unsigned val = EEPCR_EESA; /* default - eeprom access on */
|
||||
+
|
||||
+ if (ee->drive_data)
|
||||
+ val |= EEPCR_EESRWA;
|
||||
+ if (ee->reg_data_in)
|
||||
+ val |= EEPCR_EEDO;
|
||||
+ if (ee->reg_data_clock)
|
||||
+ val |= EEPCR_EESCK;
|
||||
+ if (ee->reg_chip_select)
|
||||
+ val |= EEPCR_EECS;
|
||||
+
|
||||
+ printk(KERN_INFO "%s: wr %04x\n", __func__, val);
|
||||
+ ks8851_wrreg16(ks, KS_EEPCR, val);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * ks8851_eeprom_claim - claim device EEPROM and activate the interface
|
||||
+ * @ks: The network deice state.
|
||||
+ *
|
||||
+ * Check for the presence of an EEPROM, and then activate software access
|
||||
+ * to the device.
|
||||
+ */
|
||||
+static int ks8851_eeprom_claim(struct ks8851_net *ks)
|
||||
+{
|
||||
+ if (!(ks->rc_ccr & CCR_EEPROM))
|
||||
+ return -ENOENT;
|
||||
+
|
||||
+ /* start with clock low, cs high */
|
||||
+ ks8851_wrreg16(ks, KS_EEPCR, EEPCR_EESA | EEPCR_EECS);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * ks8851_eeprom_release - release the EEPROM interface
|
||||
+ * @ks: The device state
|
||||
+ *
|
||||
+ * Release the software access to the device EEPROM
|
||||
+ */
|
||||
+static void ks8851_eeprom_release(struct ks8851_net *ks)
|
||||
+{
|
||||
+ unsigned val = ks8851_rdreg16(ks, KS_EEPCR);
|
||||
+
|
||||
+ ks8851_wrreg16(ks, KS_EEPCR, val & ~EEPCR_EESA);
|
||||
+}
|
||||
+
|
||||
static const struct ethtool_ops ks8851_ethtool_ops = {
|
||||
.get_drvinfo = ks8851_get_drvinfo,
|
||||
.get_msglevel = ks8851_get_msglevel,
|
||||
@@ -1639,6 +1704,13 @@ static int __devinit ks8851_probe(struct spi_device *spi)
|
||||
spi_message_add_tail(&ks->spi_xfer2[0], &ks->spi_msg2);
|
||||
spi_message_add_tail(&ks->spi_xfer2[1], &ks->spi_msg2);
|
||||
|
||||
+ /* setup EEPROM state */
|
||||
+
|
||||
+ ks->eeprom.data = ks;
|
||||
+ ks->eeprom.width = PCI_EEPROM_WIDTH_93C46;
|
||||
+ ks->eeprom.register_read = ks8851_eeprom_regread;
|
||||
+ ks->eeprom.register_write = ks8851_eeprom_regwrite;
|
||||
+
|
||||
/* setup mii state */
|
||||
ks->mii.dev = ndev;
|
||||
ks->mii.phy_id = 1,
|
||||
--
|
||||
1.7.7.4
|
||||
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
From a0aa9c88e27b160651f685945b42749a2a9e1a0a Mon Sep 17 00:00:00 2001
|
||||
From: Robert Nelson <robertcnelson@gmail.com>
|
||||
Date: Wed, 5 Oct 2011 16:19:20 -0500
|
||||
Subject: [PATCH 05/14] ks8851.h it helps to include the include file
|
||||
|
||||
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
|
||||
---
|
||||
include/linux/ks8851.h | 23 +++++++++++++++++++++++
|
||||
1 files changed, 23 insertions(+), 0 deletions(-)
|
||||
create mode 100644 include/linux/ks8851.h
|
||||
|
||||
diff --git a/include/linux/ks8851.h b/include/linux/ks8851.h
|
||||
new file mode 100644
|
||||
index 0000000..c933688
|
||||
--- /dev/null
|
||||
+++ b/include/linux/ks8851.h
|
||||
@@ -0,0 +1,23 @@
|
||||
+/* include/linux/ks8851.h
|
||||
+ *
|
||||
+ * Platform specific configuration data for KS8851 driver.
|
||||
+ *
|
||||
+ * Copyright 2009 Simtec Electronics
|
||||
+ * http://www.simtec.co.uk/
|
||||
+ * Ben Dooks <ben@simtec.co.uk>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
+/**
|
||||
+ * struct ks8851_pdata - platform specific configuration data
|
||||
+ * @irq_flags: The IRQ trigger flags to pass to request_irq().
|
||||
+ *
|
||||
+ * Platform specific configuration to be passed from board support
|
||||
+ * registering the spi device to the driver.
|
||||
+ */
|
||||
+struct ks8851_pdata {
|
||||
+ unsigned irq_flags;
|
||||
+};
|
||||
--
|
||||
1.7.7.4
|
||||
|
||||
+326
@@ -0,0 +1,326 @@
|
||||
From c3d2a211cfeec3d0af0a26603c66e10dd456dd36 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Nelson <robertcnelson@gmail.com>
|
||||
Date: Thu, 29 Sep 2011 11:37:48 -0500
|
||||
Subject: [PATCH 06/14] ksz8851 move to header
|
||||
|
||||
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
|
||||
---
|
||||
drivers/net/ethernet/micrel/ks8851_mll.c | 263 +-----------------------------
|
||||
1 files changed, 5 insertions(+), 258 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/micrel/ks8851_mll.c b/drivers/net/ethernet/micrel/ks8851_mll.c
|
||||
index d19c849..530b962 100644
|
||||
--- a/drivers/net/ethernet/micrel/ks8851_mll.c
|
||||
+++ b/drivers/net/ethernet/micrel/ks8851_mll.c
|
||||
@@ -37,6 +37,8 @@
|
||||
#include <linux/slab.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
+#include "ks8851.h"
|
||||
+
|
||||
#define DRV_NAME "ks8851_mll"
|
||||
|
||||
static u8 KS_DEFAULT_MAC_ADDRESS[] = { 0x00, 0x10, 0xA1, 0x86, 0x95, 0x11 };
|
||||
@@ -45,165 +47,26 @@ static u8 KS_DEFAULT_MAC_ADDRESS[] = { 0x00, 0x10, 0xA1, 0x86, 0x95, 0x11 };
|
||||
#define TX_BUF_SIZE 2000
|
||||
#define RX_BUF_SIZE 2000
|
||||
|
||||
-#define KS_CCR 0x08
|
||||
-#define CCR_EEPROM (1 << 9)
|
||||
-#define CCR_SPI (1 << 8)
|
||||
#define CCR_8BIT (1 << 7)
|
||||
#define CCR_16BIT (1 << 6)
|
||||
#define CCR_32BIT (1 << 5)
|
||||
#define CCR_SHARED (1 << 4)
|
||||
-#define CCR_32PIN (1 << 0)
|
||||
-
|
||||
-/* MAC address registers */
|
||||
-#define KS_MARL 0x10
|
||||
-#define KS_MARM 0x12
|
||||
-#define KS_MARH 0x14
|
||||
|
||||
-#define KS_OBCR 0x20
|
||||
#define OBCR_ODS_16MA (1 << 6)
|
||||
|
||||
-#define KS_EEPCR 0x22
|
||||
-#define EEPCR_EESA (1 << 4)
|
||||
-#define EEPCR_EESB (1 << 3)
|
||||
-#define EEPCR_EEDO (1 << 2)
|
||||
-#define EEPCR_EESCK (1 << 1)
|
||||
-#define EEPCR_EECS (1 << 0)
|
||||
-
|
||||
-#define KS_MBIR 0x24
|
||||
-#define MBIR_TXMBF (1 << 12)
|
||||
-#define MBIR_TXMBFA (1 << 11)
|
||||
-#define MBIR_RXMBF (1 << 4)
|
||||
-#define MBIR_RXMBFA (1 << 3)
|
||||
-
|
||||
-#define KS_GRR 0x26
|
||||
-#define GRR_QMU (1 << 1)
|
||||
-#define GRR_GSR (1 << 0)
|
||||
-
|
||||
-#define KS_WFCR 0x2A
|
||||
-#define WFCR_MPRXE (1 << 7)
|
||||
-#define WFCR_WF3E (1 << 3)
|
||||
-#define WFCR_WF2E (1 << 2)
|
||||
-#define WFCR_WF1E (1 << 1)
|
||||
-#define WFCR_WF0E (1 << 0)
|
||||
-
|
||||
-#define KS_WF0CRC0 0x30
|
||||
-#define KS_WF0CRC1 0x32
|
||||
-#define KS_WF0BM0 0x34
|
||||
-#define KS_WF0BM1 0x36
|
||||
-#define KS_WF0BM2 0x38
|
||||
-#define KS_WF0BM3 0x3A
|
||||
-
|
||||
-#define KS_WF1CRC0 0x40
|
||||
-#define KS_WF1CRC1 0x42
|
||||
-#define KS_WF1BM0 0x44
|
||||
-#define KS_WF1BM1 0x46
|
||||
-#define KS_WF1BM2 0x48
|
||||
-#define KS_WF1BM3 0x4A
|
||||
-
|
||||
-#define KS_WF2CRC0 0x50
|
||||
-#define KS_WF2CRC1 0x52
|
||||
-#define KS_WF2BM0 0x54
|
||||
-#define KS_WF2BM1 0x56
|
||||
-#define KS_WF2BM2 0x58
|
||||
-#define KS_WF2BM3 0x5A
|
||||
-
|
||||
-#define KS_WF3CRC0 0x60
|
||||
-#define KS_WF3CRC1 0x62
|
||||
-#define KS_WF3BM0 0x64
|
||||
-#define KS_WF3BM1 0x66
|
||||
-#define KS_WF3BM2 0x68
|
||||
-#define KS_WF3BM3 0x6A
|
||||
-
|
||||
-#define KS_TXCR 0x70
|
||||
-#define TXCR_TCGICMP (1 << 8)
|
||||
-#define TXCR_TCGUDP (1 << 7)
|
||||
-#define TXCR_TCGTCP (1 << 6)
|
||||
-#define TXCR_TCGIP (1 << 5)
|
||||
-#define TXCR_FTXQ (1 << 4)
|
||||
-#define TXCR_TXFCE (1 << 3)
|
||||
-#define TXCR_TXPE (1 << 2)
|
||||
-#define TXCR_TXCRC (1 << 1)
|
||||
-#define TXCR_TXE (1 << 0)
|
||||
-
|
||||
-#define KS_TXSR 0x72
|
||||
-#define TXSR_TXLC (1 << 13)
|
||||
-#define TXSR_TXMC (1 << 12)
|
||||
-#define TXSR_TXFID_MASK (0x3f << 0)
|
||||
-#define TXSR_TXFID_SHIFT (0)
|
||||
-#define TXSR_TXFID_GET(_v) (((_v) >> 0) & 0x3f)
|
||||
-
|
||||
-
|
||||
-#define KS_RXCR1 0x74
|
||||
-#define RXCR1_FRXQ (1 << 15)
|
||||
-#define RXCR1_RXUDPFCC (1 << 14)
|
||||
-#define RXCR1_RXTCPFCC (1 << 13)
|
||||
-#define RXCR1_RXIPFCC (1 << 12)
|
||||
-#define RXCR1_RXPAFMA (1 << 11)
|
||||
-#define RXCR1_RXFCE (1 << 10)
|
||||
-#define RXCR1_RXEFE (1 << 9)
|
||||
-#define RXCR1_RXMAFMA (1 << 8)
|
||||
-#define RXCR1_RXBE (1 << 7)
|
||||
-#define RXCR1_RXME (1 << 6)
|
||||
-#define RXCR1_RXUE (1 << 5)
|
||||
-#define RXCR1_RXAE (1 << 4)
|
||||
-#define RXCR1_RXINVF (1 << 1)
|
||||
-#define RXCR1_RXE (1 << 0)
|
||||
#define RXCR1_FILTER_MASK (RXCR1_RXINVF | RXCR1_RXAE | \
|
||||
RXCR1_RXMAFMA | RXCR1_RXPAFMA)
|
||||
|
||||
-#define KS_RXCR2 0x76
|
||||
-#define RXCR2_SRDBL_MASK (0x7 << 5)
|
||||
-#define RXCR2_SRDBL_SHIFT (5)
|
||||
-#define RXCR2_SRDBL_4B (0x0 << 5)
|
||||
-#define RXCR2_SRDBL_8B (0x1 << 5)
|
||||
-#define RXCR2_SRDBL_16B (0x2 << 5)
|
||||
-#define RXCR2_SRDBL_32B (0x3 << 5)
|
||||
-/* #define RXCR2_SRDBL_FRAME (0x4 << 5) */
|
||||
-#define RXCR2_IUFFP (1 << 4)
|
||||
-#define RXCR2_RXIUFCEZ (1 << 3)
|
||||
-#define RXCR2_UDPLFE (1 << 2)
|
||||
-#define RXCR2_RXICMPFCC (1 << 1)
|
||||
-#define RXCR2_RXSAF (1 << 0)
|
||||
-
|
||||
-#define KS_TXMIR 0x78
|
||||
-
|
||||
-#define KS_RXFHSR 0x7C
|
||||
-#define RXFSHR_RXFV (1 << 15)
|
||||
-#define RXFSHR_RXICMPFCS (1 << 13)
|
||||
-#define RXFSHR_RXIPFCS (1 << 12)
|
||||
-#define RXFSHR_RXTCPFCS (1 << 11)
|
||||
-#define RXFSHR_RXUDPFCS (1 << 10)
|
||||
-#define RXFSHR_RXBF (1 << 7)
|
||||
-#define RXFSHR_RXMF (1 << 6)
|
||||
-#define RXFSHR_RXUF (1 << 5)
|
||||
-#define RXFSHR_RXMR (1 << 4)
|
||||
-#define RXFSHR_RXFT (1 << 3)
|
||||
-#define RXFSHR_RXFTL (1 << 2)
|
||||
-#define RXFSHR_RXRF (1 << 1)
|
||||
-#define RXFSHR_RXCE (1 << 0)
|
||||
+#undef RXCR2_SRDBL_FRAME
|
||||
+
|
||||
#define RXFSHR_ERR (RXFSHR_RXCE | RXFSHR_RXRF |\
|
||||
RXFSHR_RXFTL | RXFSHR_RXMR |\
|
||||
RXFSHR_RXICMPFCS | RXFSHR_RXIPFCS |\
|
||||
RXFSHR_RXTCPFCS)
|
||||
+
|
||||
#define KS_RXFHBCR 0x7E
|
||||
#define RXFHBCR_CNT_MASK 0x0FFF
|
||||
|
||||
-#define KS_TXQCR 0x80
|
||||
-#define TXQCR_AETFE (1 << 2)
|
||||
-#define TXQCR_TXQMAM (1 << 1)
|
||||
-#define TXQCR_METFE (1 << 0)
|
||||
-
|
||||
-#define KS_RXQCR 0x82
|
||||
-#define RXQCR_RXDTTS (1 << 12)
|
||||
-#define RXQCR_RXDBCTS (1 << 11)
|
||||
-#define RXQCR_RXFCTS (1 << 10)
|
||||
-#define RXQCR_RXIPHTOE (1 << 9)
|
||||
-#define RXQCR_RXDTTE (1 << 7)
|
||||
-#define RXQCR_RXDBCTE (1 << 6)
|
||||
-#define RXQCR_RXFCTE (1 << 5)
|
||||
-#define RXQCR_ADRFE (1 << 4)
|
||||
-#define RXQCR_SDA (1 << 3)
|
||||
-#define RXQCR_RRXEF (1 << 0)
|
||||
#define RXQCR_CMD_CNTL (RXQCR_RXFCTE|RXQCR_ADRFE)
|
||||
|
||||
#define KS_TXFDPR 0x84
|
||||
@@ -214,130 +77,14 @@ static u8 KS_DEFAULT_MAC_ADDRESS[] = { 0x00, 0x10, 0xA1, 0x86, 0x95, 0x11 };
|
||||
#define KS_RXFDPR 0x86
|
||||
#define RXFDPR_RXFPAI (1 << 14)
|
||||
|
||||
-#define KS_RXDTTR 0x8C
|
||||
-#define KS_RXDBCTR 0x8E
|
||||
-
|
||||
-#define KS_IER 0x90
|
||||
-#define KS_ISR 0x92
|
||||
-#define IRQ_LCI (1 << 15)
|
||||
-#define IRQ_TXI (1 << 14)
|
||||
-#define IRQ_RXI (1 << 13)
|
||||
-#define IRQ_RXOI (1 << 11)
|
||||
-#define IRQ_TXPSI (1 << 9)
|
||||
-#define IRQ_RXPSI (1 << 8)
|
||||
-#define IRQ_TXSAI (1 << 6)
|
||||
-#define IRQ_RXWFDI (1 << 5)
|
||||
-#define IRQ_RXMPDI (1 << 4)
|
||||
-#define IRQ_LDI (1 << 3)
|
||||
-#define IRQ_EDI (1 << 2)
|
||||
-#define IRQ_SPIBEI (1 << 1)
|
||||
-#define IRQ_DEDI (1 << 0)
|
||||
-
|
||||
-#define KS_RXFCTR 0x9C
|
||||
#define RXFCTR_THRESHOLD_MASK 0x00FF
|
||||
|
||||
-#define KS_RXFC 0x9D
|
||||
-#define RXFCTR_RXFC_MASK (0xff << 8)
|
||||
-#define RXFCTR_RXFC_SHIFT (8)
|
||||
-#define RXFCTR_RXFC_GET(_v) (((_v) >> 8) & 0xff)
|
||||
-#define RXFCTR_RXFCT_MASK (0xff << 0)
|
||||
-#define RXFCTR_RXFCT_SHIFT (0)
|
||||
-
|
||||
-#define KS_TXNTFSR 0x9E
|
||||
-
|
||||
-#define KS_MAHTR0 0xA0
|
||||
-#define KS_MAHTR1 0xA2
|
||||
-#define KS_MAHTR2 0xA4
|
||||
-#define KS_MAHTR3 0xA6
|
||||
-
|
||||
-#define KS_FCLWR 0xB0
|
||||
-#define KS_FCHWR 0xB2
|
||||
-#define KS_FCOWR 0xB4
|
||||
-
|
||||
-#define KS_CIDER 0xC0
|
||||
-#define CIDER_ID 0x8870
|
||||
-#define CIDER_REV_MASK (0x7 << 1)
|
||||
-#define CIDER_REV_SHIFT (1)
|
||||
-#define CIDER_REV_GET(_v) (((_v) >> 1) & 0x7)
|
||||
-
|
||||
-#define KS_CGCR 0xC6
|
||||
-#define KS_IACR 0xC8
|
||||
-#define IACR_RDEN (1 << 12)
|
||||
-#define IACR_TSEL_MASK (0x3 << 10)
|
||||
-#define IACR_TSEL_SHIFT (10)
|
||||
-#define IACR_TSEL_MIB (0x3 << 10)
|
||||
-#define IACR_ADDR_MASK (0x1f << 0)
|
||||
-#define IACR_ADDR_SHIFT (0)
|
||||
-
|
||||
-#define KS_IADLR 0xD0
|
||||
-#define KS_IAHDR 0xD2
|
||||
-
|
||||
-#define KS_PMECR 0xD4
|
||||
-#define PMECR_PME_DELAY (1 << 14)
|
||||
-#define PMECR_PME_POL (1 << 12)
|
||||
-#define PMECR_WOL_WAKEUP (1 << 11)
|
||||
-#define PMECR_WOL_MAGICPKT (1 << 10)
|
||||
-#define PMECR_WOL_LINKUP (1 << 9)
|
||||
-#define PMECR_WOL_ENERGY (1 << 8)
|
||||
-#define PMECR_AUTO_WAKE_EN (1 << 7)
|
||||
-#define PMECR_WAKEUP_NORMAL (1 << 6)
|
||||
-#define PMECR_WKEVT_MASK (0xf << 2)
|
||||
-#define PMECR_WKEVT_SHIFT (2)
|
||||
-#define PMECR_WKEVT_GET(_v) (((_v) >> 2) & 0xf)
|
||||
-#define PMECR_WKEVT_ENERGY (0x1 << 2)
|
||||
-#define PMECR_WKEVT_LINK (0x2 << 2)
|
||||
-#define PMECR_WKEVT_MAGICPKT (0x4 << 2)
|
||||
-#define PMECR_WKEVT_FRAME (0x8 << 2)
|
||||
-#define PMECR_PM_MASK (0x3 << 0)
|
||||
-#define PMECR_PM_SHIFT (0)
|
||||
-#define PMECR_PM_NORMAL (0x0 << 0)
|
||||
-#define PMECR_PM_ENERGY (0x1 << 0)
|
||||
-#define PMECR_PM_SOFTDOWN (0x2 << 0)
|
||||
-#define PMECR_PM_POWERSAVE (0x3 << 0)
|
||||
-
|
||||
-/* Standard MII PHY data */
|
||||
-#define KS_P1MBCR 0xE4
|
||||
#define P1MBCR_FORCE_FDX (1 << 8)
|
||||
|
||||
-#define KS_P1MBSR 0xE6
|
||||
#define P1MBSR_AN_COMPLETE (1 << 5)
|
||||
#define P1MBSR_AN_CAPABLE (1 << 3)
|
||||
#define P1MBSR_LINK_UP (1 << 2)
|
||||
|
||||
-#define KS_PHY1ILR 0xE8
|
||||
-#define KS_PHY1IHR 0xEA
|
||||
-#define KS_P1ANAR 0xEC
|
||||
-#define KS_P1ANLPR 0xEE
|
||||
-
|
||||
-#define KS_P1SCLMD 0xF4
|
||||
-#define P1SCLMD_LEDOFF (1 << 15)
|
||||
-#define P1SCLMD_TXIDS (1 << 14)
|
||||
-#define P1SCLMD_RESTARTAN (1 << 13)
|
||||
-#define P1SCLMD_DISAUTOMDIX (1 << 10)
|
||||
-#define P1SCLMD_FORCEMDIX (1 << 9)
|
||||
-#define P1SCLMD_AUTONEGEN (1 << 7)
|
||||
-#define P1SCLMD_FORCE100 (1 << 6)
|
||||
-#define P1SCLMD_FORCEFDX (1 << 5)
|
||||
-#define P1SCLMD_ADV_FLOW (1 << 4)
|
||||
-#define P1SCLMD_ADV_100BT_FDX (1 << 3)
|
||||
-#define P1SCLMD_ADV_100BT_HDX (1 << 2)
|
||||
-#define P1SCLMD_ADV_10BT_FDX (1 << 1)
|
||||
-#define P1SCLMD_ADV_10BT_HDX (1 << 0)
|
||||
-
|
||||
-#define KS_P1CR 0xF6
|
||||
-#define P1CR_HP_MDIX (1 << 15)
|
||||
-#define P1CR_REV_POL (1 << 13)
|
||||
-#define P1CR_OP_100M (1 << 10)
|
||||
-#define P1CR_OP_FDX (1 << 9)
|
||||
-#define P1CR_OP_MDI (1 << 7)
|
||||
-#define P1CR_AN_DONE (1 << 6)
|
||||
-#define P1CR_LINK_GOOD (1 << 5)
|
||||
-#define P1CR_PNTR_FLOW (1 << 4)
|
||||
-#define P1CR_PNTR_100BT_FDX (1 << 3)
|
||||
-#define P1CR_PNTR_100BT_HDX (1 << 2)
|
||||
-#define P1CR_PNTR_10BT_FDX (1 << 1)
|
||||
-#define P1CR_PNTR_10BT_HDX (1 << 0)
|
||||
-
|
||||
/* TX Frame control */
|
||||
|
||||
#define TXFR_TXIC (1 << 15)
|
||||
--
|
||||
1.7.7.4
|
||||
|
||||
+143
@@ -0,0 +1,143 @@
|
||||
From 5b4881326fe4509fd2a55e866a11f9123745d2a8 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Nelson <robertcnelson@gmail.com>
|
||||
Date: Thu, 29 Sep 2011 11:38:35 -0500
|
||||
Subject: [PATCH 07/14] ksz8851 move more to header
|
||||
|
||||
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
|
||||
---
|
||||
drivers/net/ethernet/micrel/ks8851.h | 27 ++++++++++++++++++++
|
||||
drivers/net/ethernet/micrel/ks8851_mll.c | 40 +-----------------------------
|
||||
2 files changed, 28 insertions(+), 39 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/micrel/ks8851.h b/drivers/net/ethernet/micrel/ks8851.h
|
||||
index 537fb06e..1ed7cfa 100644
|
||||
--- a/drivers/net/ethernet/micrel/ks8851.h
|
||||
+++ b/drivers/net/ethernet/micrel/ks8851.h
|
||||
@@ -3,6 +3,9 @@
|
||||
* Copyright 2009 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
+ * portions from drivers/net/ks8851_mll.c,
|
||||
+ * Copyright (c) 2009 Micrel Inc.
|
||||
+ *
|
||||
* KS8851 register definitions
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -13,6 +16,10 @@
|
||||
#define KS_CCR 0x08
|
||||
#define CCR_EEPROM (1 << 9)
|
||||
#define CCR_SPI (1 << 8)
|
||||
+#define CCR_8BIT (1 << 7)
|
||||
+#define CCR_16BIT (1 << 6)
|
||||
+#define CCR_32BIT (1 << 5)
|
||||
+#define CCR_SHARED (1 << 4)
|
||||
#define CCR_32PIN (1 << 0)
|
||||
|
||||
/* MAC address registers */
|
||||
@@ -261,7 +268,13 @@
|
||||
|
||||
/* Standard MII PHY data */
|
||||
#define KS_P1MBCR 0xE4
|
||||
+#define P1MBCR_FORCE_FDX (1 << 8)
|
||||
+
|
||||
#define KS_P1MBSR 0xE6
|
||||
+#define P1MBSR_AN_COMPLETE (1 << 5)
|
||||
+#define P1MBSR_AN_CAPABLE (1 << 3)
|
||||
+#define P1MBSR_LINK_UP (1 << 2)
|
||||
+
|
||||
#define KS_PHY1ILR 0xE8
|
||||
#define KS_PHY1IHR 0xEA
|
||||
#define KS_P1ANAR 0xEC
|
||||
@@ -296,6 +309,20 @@
|
||||
#define P1CR_PNTR_10BT_FDX (1 << 1)
|
||||
#define P1CR_PNTR_10BT_HDX (1 << 0)
|
||||
|
||||
+#define KS_P1SR 0xF8
|
||||
+#define P1SR_HP_MDIX (1 << 15)
|
||||
+#define P1SR_REV_POL (1 << 13)
|
||||
+#define P1SR_OP_100M (1 << 10)
|
||||
+#define P1SR_OP_FDX (1 << 9)
|
||||
+#define P1SR_OP_MDI (1 << 7)
|
||||
+#define P1SR_AN_DONE (1 << 6)
|
||||
+#define P1SR_LINK_GOOD (1 << 5)
|
||||
+#define P1SR_PNTR_FLOW (1 << 4)
|
||||
+#define P1SR_PNTR_100BT_FDX (1 << 3)
|
||||
+#define P1SR_PNTR_100BT_HDX (1 << 2)
|
||||
+#define P1SR_PNTR_10BT_FDX (1 << 1)
|
||||
+#define P1SR_PNTR_10BT_HDX (1 << 0)
|
||||
+
|
||||
/* TX Frame control */
|
||||
|
||||
#define TXFR_TXIC (1 << 15)
|
||||
diff --git a/drivers/net/ethernet/micrel/ks8851_mll.c b/drivers/net/ethernet/micrel/ks8851_mll.c
|
||||
index 530b962..d3bb46f 100644
|
||||
--- a/drivers/net/ethernet/micrel/ks8851_mll.c
|
||||
+++ b/drivers/net/ethernet/micrel/ks8851_mll.c
|
||||
@@ -47,13 +47,6 @@ static u8 KS_DEFAULT_MAC_ADDRESS[] = { 0x00, 0x10, 0xA1, 0x86, 0x95, 0x11 };
|
||||
#define TX_BUF_SIZE 2000
|
||||
#define RX_BUF_SIZE 2000
|
||||
|
||||
-#define CCR_8BIT (1 << 7)
|
||||
-#define CCR_16BIT (1 << 6)
|
||||
-#define CCR_32BIT (1 << 5)
|
||||
-#define CCR_SHARED (1 << 4)
|
||||
-
|
||||
-#define OBCR_ODS_16MA (1 << 6)
|
||||
-
|
||||
#define RXCR1_FILTER_MASK (RXCR1_RXINVF | RXCR1_RXAE | \
|
||||
RXCR1_RXMAFMA | RXCR1_RXPAFMA)
|
||||
|
||||
@@ -69,41 +62,10 @@ static u8 KS_DEFAULT_MAC_ADDRESS[] = { 0x00, 0x10, 0xA1, 0x86, 0x95, 0x11 };
|
||||
|
||||
#define RXQCR_CMD_CNTL (RXQCR_RXFCTE|RXQCR_ADRFE)
|
||||
|
||||
-#define KS_TXFDPR 0x84
|
||||
-#define TXFDPR_TXFPAI (1 << 14)
|
||||
-#define TXFDPR_TXFP_MASK (0x7ff << 0)
|
||||
-#define TXFDPR_TXFP_SHIFT (0)
|
||||
-
|
||||
-#define KS_RXFDPR 0x86
|
||||
-#define RXFDPR_RXFPAI (1 << 14)
|
||||
-
|
||||
#define RXFCTR_THRESHOLD_MASK 0x00FF
|
||||
|
||||
-#define P1MBCR_FORCE_FDX (1 << 8)
|
||||
-
|
||||
-#define P1MBSR_AN_COMPLETE (1 << 5)
|
||||
-#define P1MBSR_AN_CAPABLE (1 << 3)
|
||||
-#define P1MBSR_LINK_UP (1 << 2)
|
||||
-
|
||||
/* TX Frame control */
|
||||
|
||||
-#define TXFR_TXIC (1 << 15)
|
||||
-#define TXFR_TXFID_MASK (0x3f << 0)
|
||||
-#define TXFR_TXFID_SHIFT (0)
|
||||
-
|
||||
-#define KS_P1SR 0xF8
|
||||
-#define P1SR_HP_MDIX (1 << 15)
|
||||
-#define P1SR_REV_POL (1 << 13)
|
||||
-#define P1SR_OP_100M (1 << 10)
|
||||
-#define P1SR_OP_FDX (1 << 9)
|
||||
-#define P1SR_OP_MDI (1 << 7)
|
||||
-#define P1SR_AN_DONE (1 << 6)
|
||||
-#define P1SR_LINK_GOOD (1 << 5)
|
||||
-#define P1SR_PNTR_FLOW (1 << 4)
|
||||
-#define P1SR_PNTR_100BT_FDX (1 << 3)
|
||||
-#define P1SR_PNTR_100BT_HDX (1 << 2)
|
||||
-#define P1SR_PNTR_10BT_FDX (1 << 1)
|
||||
-#define P1SR_PNTR_10BT_HDX (1 << 0)
|
||||
|
||||
#define ENUM_BUS_NONE 0
|
||||
#define ENUM_BUS_8BIT 1
|
||||
@@ -1350,7 +1312,7 @@ static int __devinit ks8851_probe(struct platform_device *pdev)
|
||||
memcpy(netdev->dev_addr, ks->mac_addr, 6);
|
||||
|
||||
data = ks_rdreg16(ks, KS_OBCR);
|
||||
- ks_wrreg16(ks, KS_OBCR, data | OBCR_ODS_16MA);
|
||||
+ ks_wrreg16(ks, KS_OBCR, data | OBCR_ODS_16mA);
|
||||
|
||||
/**
|
||||
* If you want to use the default MAC addr,
|
||||
--
|
||||
1.7.7.4
|
||||
|
||||
+95
@@ -0,0 +1,95 @@
|
||||
From bd69d174b8ae6f720c8534db5dd4a55f2170f06c Mon Sep 17 00:00:00 2001
|
||||
From: Robert Nelson <robertcnelson@gmail.com>
|
||||
Date: Thu, 29 Sep 2011 11:49:16 -0500
|
||||
Subject: [PATCH 08/14] ksz8851 share ks8851_tx_hdr union
|
||||
|
||||
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
|
||||
---
|
||||
drivers/net/ethernet/micrel/ks8851.c | 13 -------------
|
||||
drivers/net/ethernet/micrel/ks8851.h | 14 ++++++++++++++
|
||||
drivers/net/ethernet/micrel/ks8851_mll.c | 16 +---------------
|
||||
3 files changed, 15 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c
|
||||
index 6a7f27f..64be436 100644
|
||||
--- a/drivers/net/ethernet/micrel/ks8851.c
|
||||
+++ b/drivers/net/ethernet/micrel/ks8851.c
|
||||
@@ -46,19 +46,6 @@ struct ks8851_rxctrl {
|
||||
u16 rxcr2;
|
||||
};
|
||||
|
||||
-/**
|
||||
- * union ks8851_tx_hdr - tx header data
|
||||
- * @txb: The header as bytes
|
||||
- * @txw: The header as 16bit, little-endian words
|
||||
- *
|
||||
- * A dual representation of the tx header data to allow
|
||||
- * access to individual bytes, and to allow 16bit accesses
|
||||
- * with 16bit alignment.
|
||||
- */
|
||||
-union ks8851_tx_hdr {
|
||||
- u8 txb[6];
|
||||
- __le16 txw[3];
|
||||
-};
|
||||
|
||||
/**
|
||||
* struct ks8851_net - KS8851 driver private data
|
||||
diff --git a/drivers/net/ethernet/micrel/ks8851.h b/drivers/net/ethernet/micrel/ks8851.h
|
||||
index 1ed7cfa..bc2476e 100644
|
||||
--- a/drivers/net/ethernet/micrel/ks8851.h
|
||||
+++ b/drivers/net/ethernet/micrel/ks8851.h
|
||||
@@ -334,3 +334,17 @@
|
||||
#define KS_SPIOP_WR (0x40)
|
||||
#define KS_SPIOP_RXFIFO (0x80)
|
||||
#define KS_SPIOP_TXFIFO (0xC0)
|
||||
+
|
||||
+/**
|
||||
+ * union ks8851_tx_hdr - tx header data
|
||||
+ * @txb: The header as bytes
|
||||
+ * @txw: The header as 16bit, little-endian words
|
||||
+ *
|
||||
+ * A dual representation of the tx header data to allow
|
||||
+ * access to individual bytes, and to allow 16bit accesses
|
||||
+ * with 16bit alignment.
|
||||
+ */
|
||||
+union ks8851_tx_hdr {
|
||||
+ u8 txb[6];
|
||||
+ __le16 txw[3];
|
||||
+};
|
||||
diff --git a/drivers/net/ethernet/micrel/ks8851_mll.c b/drivers/net/ethernet/micrel/ks8851_mll.c
|
||||
index d3bb46f..ffaf14e 100644
|
||||
--- a/drivers/net/ethernet/micrel/ks8851_mll.c
|
||||
+++ b/drivers/net/ethernet/micrel/ks8851_mll.c
|
||||
@@ -76,20 +76,6 @@ static u8 KS_DEFAULT_MAC_ADDRESS[] = { 0x00, 0x10, 0xA1, 0x86, 0x95, 0x11 };
|
||||
#define HW_MCAST_SIZE 8
|
||||
|
||||
/**
|
||||
- * union ks_tx_hdr - tx header data
|
||||
- * @txb: The header as bytes
|
||||
- * @txw: The header as 16bit, little-endian words
|
||||
- *
|
||||
- * A dual representation of the tx header data to allow
|
||||
- * access to individual bytes, and to allow 16bit accesses
|
||||
- * with 16bit alignment.
|
||||
- */
|
||||
-union ks_tx_hdr {
|
||||
- u8 txb[4];
|
||||
- __le16 txw[2];
|
||||
-};
|
||||
-
|
||||
-/**
|
||||
* struct ks_net - KS8851 driver private data
|
||||
* @net_device : The network device we're bound to
|
||||
* @hw_addr : start address of data register.
|
||||
@@ -141,7 +127,7 @@ struct ks_net {
|
||||
struct net_device *netdev;
|
||||
void __iomem *hw_addr;
|
||||
void __iomem *hw_addr_cmd;
|
||||
- union ks_tx_hdr txh ____cacheline_aligned;
|
||||
+ union ks8851_tx_hdr txh ____cacheline_aligned;
|
||||
struct mutex lock; /* spinlock to be interrupt safe */
|
||||
struct platform_device *pdev;
|
||||
struct mii_if_info mii;
|
||||
--
|
||||
1.7.7.4
|
||||
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
From 390e80215217f32c35c7a2d6611407b759d695d2 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Nelson <robertcnelson@gmail.com>
|
||||
Date: Thu, 29 Sep 2011 11:50:09 -0500
|
||||
Subject: [PATCH 09/14] ksz8851 add is_level_irq
|
||||
|
||||
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
|
||||
---
|
||||
drivers/net/ethernet/micrel/ks8851.c | 28 ++++++++++++++++++++++++----
|
||||
1 files changed, 24 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c
|
||||
index 64be436..f771fd8 100644
|
||||
--- a/drivers/net/ethernet/micrel/ks8851.c
|
||||
+++ b/drivers/net/ethernet/micrel/ks8851.c
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <linux/crc32.h>
|
||||
#include <linux/mii.h>
|
||||
#include <linux/eeprom_93cx6.h>
|
||||
+#include <linux/ks8851.h>
|
||||
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
@@ -70,6 +71,7 @@ struct ks8851_rxctrl {
|
||||
* @rc_ccr: Cached copy of KS_CCR.
|
||||
* @rc_rxqcr: Cached copy of KS_RXQCR.
|
||||
* @eeprom_size: Companion eeprom size in Bytes, 0 if no eeprom
|
||||
+ * @irq_flags: The IRQ flags passed to request_irq().
|
||||
*
|
||||
* The @lock ensures that the chip is protected when certain operations are
|
||||
* in progress. When the read or write packet transfer is in progress, most
|
||||
@@ -118,6 +120,7 @@ struct ks8851_net {
|
||||
struct spi_transfer spi_xfer2[2];
|
||||
|
||||
struct eeprom_93cx6 eeprom;
|
||||
+ unsigned irq_flags;
|
||||
};
|
||||
|
||||
static int msg_enable;
|
||||
@@ -403,6 +406,15 @@ static void ks8851_init_mac(struct ks8851_net *ks)
|
||||
}
|
||||
|
||||
/**
|
||||
+ * is_level_irq() - return if the given IRQ flags are level triggered
|
||||
+ * @flags: The flags passed to request_irq().
|
||||
+*/
|
||||
+static bool is_level_irq(unsigned flags)
|
||||
+{
|
||||
+ return flags & (IRQF_TRIGGER_LOW | IRQF_TRIGGER_HIGH);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* ks8851_irq - device interrupt handler
|
||||
* @irq: Interrupt number passed from the IRQ hnalder.
|
||||
* @pw: The private word passed to register_irq(), our struct ks8851_net.
|
||||
@@ -414,7 +426,9 @@ static irqreturn_t ks8851_irq(int irq, void *pw)
|
||||
{
|
||||
struct ks8851_net *ks = pw;
|
||||
|
||||
- disable_irq_nosync(irq);
|
||||
+ if (is_level_irq(ks->irq_flags))
|
||||
+ disable_irq_nosync(irq);
|
||||
+
|
||||
schedule_work(&ks->irq_work);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -646,7 +660,8 @@ static void ks8851_irq_work(struct work_struct *work)
|
||||
if (status & IRQ_TXI)
|
||||
netif_wake_queue(ks->netdev);
|
||||
|
||||
- enable_irq(ks->netdev->irq);
|
||||
+ if (is_level_irq(ks->irq_flags))
|
||||
+ enable_irq(ks->netdev->irq);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1657,6 +1672,7 @@ static int ks8851_resume(struct spi_device *spi)
|
||||
|
||||
static int __devinit ks8851_probe(struct spi_device *spi)
|
||||
{
|
||||
+ struct ks8851_pdata *pd = spi->dev.platform_data;
|
||||
struct net_device *ndev;
|
||||
struct ks8851_net *ks;
|
||||
int ret;
|
||||
@@ -1749,8 +1765,12 @@ static int __devinit ks8851_probe(struct spi_device *spi)
|
||||
ks8851_read_selftest(ks);
|
||||
ks8851_init_mac(ks);
|
||||
|
||||
- ret = request_irq(spi->irq, ks8851_irq, IRQF_TRIGGER_LOW,
|
||||
- ndev->name, ks);
|
||||
+ if (pd && pd->irq_flags)
|
||||
+ ks->irq_flags = pd->irq_flags;
|
||||
+ else
|
||||
+ ks->irq_flags = IRQF_TRIGGER_LOW;
|
||||
+
|
||||
+ ret = request_irq(spi->irq, ks8851_irq, ks->irq_flags, ndev->name, ks);
|
||||
if (ret < 0) {
|
||||
dev_err(&spi->dev, "failed to get irq\n");
|
||||
goto err_irq;
|
||||
--
|
||||
1.7.7.4
|
||||
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
From bd5cf7c6157fb20e70e8bdc417b98d0ae81e56eb Mon Sep 17 00:00:00 2001
|
||||
From: Robert Nelson <robertcnelson@gmail.com>
|
||||
Date: Thu, 29 Sep 2011 11:50:42 -0500
|
||||
Subject: [PATCH 10/14] ksz8851 turn off hardware interrupt druing receive
|
||||
process
|
||||
|
||||
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
|
||||
---
|
||||
drivers/net/ethernet/micrel/ks8851.c | 10 ++++++++++
|
||||
1 files changed, 10 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c
|
||||
index f771fd8..347f38f 100644
|
||||
--- a/drivers/net/ethernet/micrel/ks8851.c
|
||||
+++ b/drivers/net/ethernet/micrel/ks8851.c
|
||||
@@ -586,6 +586,13 @@ static void ks8851_irq_work(struct work_struct *work)
|
||||
|
||||
mutex_lock(&ks->lock);
|
||||
|
||||
+ /*
|
||||
+ * Turn off hardware interrupt during receive processing. This fixes
|
||||
+ * the receive problem under heavy TCP traffic while transmit done
|
||||
+ * is enabled.
|
||||
+ */
|
||||
+ ks8851_wrreg16(ks, KS_IER, 0);
|
||||
+
|
||||
status = ks8851_rdreg16(ks, KS_ISR);
|
||||
|
||||
netif_dbg(ks, intr, ks->netdev,
|
||||
@@ -655,6 +662,9 @@ static void ks8851_irq_work(struct work_struct *work)
|
||||
ks8851_wrreg16(ks, KS_RXCR1, rxc->rxcr1);
|
||||
}
|
||||
|
||||
+ /* Re-enable hardware interrupt. */
|
||||
+ ks8851_wrreg16(ks, KS_IER, ks->rc_ier);
|
||||
+
|
||||
mutex_unlock(&ks->lock);
|
||||
|
||||
if (status & IRQ_TXI)
|
||||
--
|
||||
1.7.7.4
|
||||
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
From c7f65cdff49e6a3e186bb1e43fa50289a662619b Mon Sep 17 00:00:00 2001
|
||||
From: Robert Nelson <robertcnelson@gmail.com>
|
||||
Date: Thu, 29 Sep 2011 11:52:45 -0500
|
||||
Subject: [PATCH 11/14] ksz8851 make sure is awake before writing mac
|
||||
|
||||
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
|
||||
---
|
||||
drivers/net/ethernet/micrel/ks8851.c | 9 ++++++++-
|
||||
drivers/net/ethernet/micrel/ks8851.h | 2 +-
|
||||
2 files changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c
|
||||
index 347f38f..4f68517 100644
|
||||
--- a/drivers/net/ethernet/micrel/ks8851.c
|
||||
+++ b/drivers/net/ethernet/micrel/ks8851.c
|
||||
@@ -351,8 +351,15 @@ static int ks8851_write_mac_addr(struct net_device *dev)
|
||||
|
||||
mutex_lock(&ks->lock);
|
||||
|
||||
+ /*
|
||||
+ * Wake up chip in case it was powered off when stopped; otherwise,
|
||||
+ * the first write to the MAC address does not take effect.
|
||||
+ */
|
||||
+ ks8851_set_powermode(ks, PMECR_PM_NORMAL);
|
||||
for (i = 0; i < ETH_ALEN; i++)
|
||||
ks8851_wrreg8(ks, KS_MAR(i), dev->dev_addr[i]);
|
||||
+ if (!netif_running(dev))
|
||||
+ ks8851_set_powermode(ks, PMECR_PM_SOFTDOWN);
|
||||
|
||||
mutex_unlock(&ks->lock);
|
||||
|
||||
@@ -1699,7 +1706,6 @@ static int __devinit ks8851_probe(struct spi_device *spi)
|
||||
|
||||
ks->netdev = ndev;
|
||||
ks->spidev = spi;
|
||||
- ks->tx_space = 6144;
|
||||
|
||||
mutex_init(&ks->lock);
|
||||
spin_lock_init(&ks->statelock);
|
||||
@@ -1771,6 +1777,7 @@ static int __devinit ks8851_probe(struct spi_device *spi)
|
||||
|
||||
/* cache the contents of the CCR register for EEPROM, etc. */
|
||||
ks->rc_ccr = ks8851_rdreg16(ks, KS_CCR);
|
||||
+ ks->tx_space = ks8851_rdreg16(ks, KS_TXMIR);
|
||||
|
||||
ks8851_read_selftest(ks);
|
||||
ks8851_init_mac(ks);
|
||||
diff --git a/drivers/net/ethernet/micrel/ks8851.h b/drivers/net/ethernet/micrel/ks8851.h
|
||||
index bc2476e..d39ce97 100644
|
||||
--- a/drivers/net/ethernet/micrel/ks8851.h
|
||||
+++ b/drivers/net/ethernet/micrel/ks8851.h
|
||||
@@ -23,7 +23,7 @@
|
||||
#define CCR_32PIN (1 << 0)
|
||||
|
||||
/* MAC address registers */
|
||||
-#define KS_MAR(_m) 0x15 - (_m)
|
||||
+#define KS_MAR(_m) (0x15 - (_m))
|
||||
#define KS_MARL 0x10
|
||||
#define KS_MARM 0x12
|
||||
#define KS_MARH 0x14
|
||||
--
|
||||
1.7.7.4
|
||||
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
From 77734035c97803b393210976dd430cd5190d072d Mon Sep 17 00:00:00 2001
|
||||
From: Robert Nelson <robertcnelson@gmail.com>
|
||||
Date: Thu, 29 Sep 2011 11:53:36 -0500
|
||||
Subject: [PATCH 12/14] ksz8851 add mutex lock/unlock to ks
|
||||
|
||||
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
|
||||
---
|
||||
drivers/net/ethernet/micrel/ks8851.c | 4 +++-
|
||||
1 files changed, 3 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c
|
||||
index 4f68517..e22ce5d 100644
|
||||
--- a/drivers/net/ethernet/micrel/ks8851.c
|
||||
+++ b/drivers/net/ethernet/micrel/ks8851.c
|
||||
@@ -1499,7 +1499,6 @@ static void ks8851_eeprom_regwrite(struct eeprom_93cx6 *ee)
|
||||
if (ee->reg_chip_select)
|
||||
val |= EEPCR_EECS;
|
||||
|
||||
- printk(KERN_INFO "%s: wr %04x\n", __func__, val);
|
||||
ks8851_wrreg16(ks, KS_EEPCR, val);
|
||||
}
|
||||
|
||||
@@ -1515,6 +1514,8 @@ static int ks8851_eeprom_claim(struct ks8851_net *ks)
|
||||
if (!(ks->rc_ccr & CCR_EEPROM))
|
||||
return -ENOENT;
|
||||
|
||||
+ mutex_lock(&ks->lock);
|
||||
+
|
||||
/* start with clock low, cs high */
|
||||
ks8851_wrreg16(ks, KS_EEPCR, EEPCR_EESA | EEPCR_EECS);
|
||||
return 0;
|
||||
@@ -1531,6 +1532,7 @@ static void ks8851_eeprom_release(struct ks8851_net *ks)
|
||||
unsigned val = ks8851_rdreg16(ks, KS_EEPCR);
|
||||
|
||||
ks8851_wrreg16(ks, KS_EEPCR, val & ~EEPCR_EESA);
|
||||
+ mutex_unlock(&ks->lock);
|
||||
}
|
||||
|
||||
static const struct ethtool_ops ks8851_ethtool_ops = {
|
||||
--
|
||||
1.7.7.4
|
||||
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
From 7b4062c1b950287f4b588a72edd520d050e92745 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Nelson <robertcnelson@gmail.com>
|
||||
Date: Thu, 29 Sep 2011 11:54:12 -0500
|
||||
Subject: [PATCH 13/14] ksz8851 add ks8851_tx_check
|
||||
|
||||
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
|
||||
---
|
||||
drivers/net/ethernet/micrel/ks8851.c | 36 +++++++++++++++++-----------------
|
||||
1 files changed, 18 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c
|
||||
index e22ce5d..b72baa6 100644
|
||||
--- a/drivers/net/ethernet/micrel/ks8851.c
|
||||
+++ b/drivers/net/ethernet/micrel/ks8851.c
|
||||
@@ -108,11 +108,13 @@ struct ks8851_net {
|
||||
struct mii_if_info mii;
|
||||
struct ks8851_rxctrl rxctrl;
|
||||
|
||||
+ struct work_struct tx_check;
|
||||
struct work_struct tx_work;
|
||||
struct work_struct irq_work;
|
||||
struct work_struct rxctrl_work;
|
||||
|
||||
struct sk_buff_head txq;
|
||||
+ int tx_len;
|
||||
|
||||
struct spi_message spi_msg1;
|
||||
struct spi_message spi_msg2;
|
||||
@@ -621,19 +623,6 @@ static void ks8851_irq_work(struct work_struct *work)
|
||||
if (status & IRQ_RXPSI)
|
||||
handled |= IRQ_RXPSI;
|
||||
|
||||
- if (status & IRQ_TXI) {
|
||||
- handled |= IRQ_TXI;
|
||||
-
|
||||
- /* no lock here, tx queue should have been stopped */
|
||||
-
|
||||
- /* update our idea of how much tx space is available to the
|
||||
- * system */
|
||||
- ks->tx_space = ks8851_rdreg16(ks, KS_TXMIR);
|
||||
-
|
||||
- netif_dbg(ks, intr, ks->netdev,
|
||||
- "%s: txspace %d\n", __func__, ks->tx_space);
|
||||
- }
|
||||
-
|
||||
if (status & IRQ_RXI)
|
||||
handled |= IRQ_RXI;
|
||||
|
||||
@@ -674,9 +663,6 @@ static void ks8851_irq_work(struct work_struct *work)
|
||||
|
||||
mutex_unlock(&ks->lock);
|
||||
|
||||
- if (status & IRQ_TXI)
|
||||
- netif_wake_queue(ks->netdev);
|
||||
-
|
||||
if (is_level_irq(ks->irq_flags))
|
||||
enable_irq(ks->netdev->irq);
|
||||
}
|
||||
@@ -754,6 +740,17 @@ static void ks8851_done_tx(struct ks8851_net *ks, struct sk_buff *txb)
|
||||
dev_kfree_skb(txb);
|
||||
}
|
||||
|
||||
+static void ks8851_tx_check(struct work_struct *work)
|
||||
+{
|
||||
+ struct ks8851_net *ks = container_of(work, struct ks8851_net, tx_check);
|
||||
+
|
||||
+ ks->tx_space = ks8851_rdreg16(ks, KS_TXMIR);
|
||||
+ if (ks->tx_space > ks->tx_len)
|
||||
+ netif_wake_queue(ks->netdev);
|
||||
+ else
|
||||
+ schedule_work(&ks->tx_check);
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* ks8851_tx_work - process tx packet(s)
|
||||
* @work: The work strucutre what was scheduled.
|
||||
@@ -865,7 +862,6 @@ static int ks8851_net_open(struct net_device *dev)
|
||||
/* clear then enable interrupts */
|
||||
|
||||
#define STD_IRQ (IRQ_LCI | /* Link Change */ \
|
||||
- IRQ_TXI | /* TX done */ \
|
||||
IRQ_RXI | /* RX done */ \
|
||||
IRQ_SPIBEI | /* SPI bus error */ \
|
||||
IRQ_TXPSI | /* TX process stop */ \
|
||||
@@ -903,6 +899,7 @@ static int ks8851_net_stop(struct net_device *dev)
|
||||
|
||||
/* stop any outstanding work */
|
||||
flush_work(&ks->irq_work);
|
||||
+ flush_work(&ks->tx_check);
|
||||
flush_work(&ks->tx_work);
|
||||
flush_work(&ks->rxctrl_work);
|
||||
|
||||
@@ -960,14 +957,16 @@ static netdev_tx_t ks8851_start_xmit(struct sk_buff *skb,
|
||||
|
||||
if (needed > ks->tx_space) {
|
||||
netif_stop_queue(dev);
|
||||
+ ks->tx_len = needed;
|
||||
+ schedule_work(&ks->tx_check);
|
||||
ret = NETDEV_TX_BUSY;
|
||||
} else {
|
||||
ks->tx_space -= needed;
|
||||
skb_queue_tail(&ks->txq, skb);
|
||||
+ schedule_work(&ks->tx_work);
|
||||
}
|
||||
|
||||
spin_unlock(&ks->statelock);
|
||||
- schedule_work(&ks->tx_work);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1712,6 +1711,7 @@ static int __devinit ks8851_probe(struct spi_device *spi)
|
||||
mutex_init(&ks->lock);
|
||||
spin_lock_init(&ks->statelock);
|
||||
|
||||
+ INIT_WORK(&ks->tx_check, ks8851_tx_check);
|
||||
INIT_WORK(&ks->tx_work, ks8851_tx_work);
|
||||
INIT_WORK(&ks->irq_work, ks8851_irq_work);
|
||||
INIT_WORK(&ks->rxctrl_work, ks8851_rxctrl_work);
|
||||
--
|
||||
1.7.7.4
|
||||
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
From 06112587cca46a906d73d2a6ec450d1e6ae535d3 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Nelson <robertcnelson@gmail.com>
|
||||
Date: Thu, 29 Sep 2011 11:54:51 -0500
|
||||
Subject: [PATCH 14/14] ksz8851 move ks8851_set_powermode
|
||||
|
||||
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
|
||||
---
|
||||
drivers/net/ethernet/micrel/ks8851.c | 40 +++++++++++++++++-----------------
|
||||
1 files changed, 20 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c
|
||||
index b72baa6..c420410 100644
|
||||
--- a/drivers/net/ethernet/micrel/ks8851.c
|
||||
+++ b/drivers/net/ethernet/micrel/ks8851.c
|
||||
@@ -338,6 +338,26 @@ static void ks8851_soft_reset(struct ks8851_net *ks, unsigned op)
|
||||
}
|
||||
|
||||
/**
|
||||
+ * ks8851_set_powermode - set power mode of the device
|
||||
+ * @ks: The device state
|
||||
+ * @pwrmode: The power mode value to write to KS_PMECR.
|
||||
+ *
|
||||
+ * Change the power mode of the chip.
|
||||
+ */
|
||||
+static void ks8851_set_powermode(struct ks8851_net *ks, unsigned pwrmode)
|
||||
+{
|
||||
+ unsigned pmecr;
|
||||
+
|
||||
+ netif_dbg(ks, hw, ks->netdev, "setting power mode %d\n", pwrmode);
|
||||
+
|
||||
+ pmecr = ks8851_rdreg16(ks, KS_PMECR);
|
||||
+ pmecr &= ~PMECR_PM_MASK;
|
||||
+ pmecr |= pwrmode;
|
||||
+
|
||||
+ ks8851_wrreg16(ks, KS_PMECR, pmecr);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* ks8851_write_mac_addr - write mac address to device registers
|
||||
* @dev: The network device
|
||||
*
|
||||
@@ -784,26 +804,6 @@ static void ks8851_tx_work(struct work_struct *work)
|
||||
}
|
||||
|
||||
/**
|
||||
- * ks8851_set_powermode - set power mode of the device
|
||||
- * @ks: The device state
|
||||
- * @pwrmode: The power mode value to write to KS_PMECR.
|
||||
- *
|
||||
- * Change the power mode of the chip.
|
||||
- */
|
||||
-static void ks8851_set_powermode(struct ks8851_net *ks, unsigned pwrmode)
|
||||
-{
|
||||
- unsigned pmecr;
|
||||
-
|
||||
- netif_dbg(ks, hw, ks->netdev, "setting power mode %d\n", pwrmode);
|
||||
-
|
||||
- pmecr = ks8851_rdreg16(ks, KS_PMECR);
|
||||
- pmecr &= ~PMECR_PM_MASK;
|
||||
- pmecr |= pwrmode;
|
||||
-
|
||||
- ks8851_wrreg16(ks, KS_PMECR, pmecr);
|
||||
-}
|
||||
-
|
||||
-/**
|
||||
* ks8851_net_open - open network device
|
||||
* @dev: The network device being opened.
|
||||
*
|
||||
--
|
||||
1.7.7.4
|
||||
|
||||
Reference in New Issue
Block a user