diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-01-14 11:39:52 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-01-14 11:39:52 -0800 |
commit | 24bf7251532a9616fffb5cbc56ce261b6fb18234 (patch) | |
tree | 15a8433d112d82ce193f37ae434c3a446d6d00ed | |
parent | 69d078128c3a0308dff06e1faa4a5a9646012b37 (diff) | |
download | ltsi-kernel-24bf7251532a9616fffb5cbc56ce261b6fb18234.tar.gz |
MinnowBoard patches added
10 files changed, 1947 insertions, 0 deletions
diff --git a/patches.minnowboard/pch_gbe-add-minnowboard-support.patch b/patches.minnowboard/pch_gbe-add-minnowboard-support.patch new file mode 100644 index 00000000000000..8eeff6c64a227b --- /dev/null +++ b/patches.minnowboard/pch_gbe-add-minnowboard-support.patch @@ -0,0 +1,293 @@ +From f1a26fdf5944ff950888ae0017e546690353f85f Mon Sep 17 00:00:00 2001 +From: Darren Hart <dvhart@linux.intel.com> +Date: Sat, 18 May 2013 14:46:00 -0700 +Subject: pch_gbe: Add MinnowBoard support + +From: Darren Hart <dvhart@linux.intel.com> + +commit f1a26fdf5944ff950888ae0017e546690353f85f upstream. + +The MinnowBoard uses an AR803x PHY with the PCH GBE which requires +special handling. Use the MinnowBoard PCI Subsystem ID to detect this +and add a pci_device_id.driver_data structure and functions to handle +platform setup. + +The AR803x does not implement the RGMII 2ns TX clock delay in the trace +routing nor via strapping. Add a detection method for the board and the +PHY and enable the TX clock delay via the registers. + +This PHY will hibernate without link for 10 seconds. Ensure the PHY is +awake for probe and then disable hibernation. A future improvement would +be to convert pch_gbe to using PHYLIB and making sure we can wake the +PHY at the necessary times rather than permanently disabling it. + +Signed-off-by: Darren Hart <dvhart@linux.intel.com> +Cc: "David S. Miller" <davem@davemloft.net> +Cc: "H. Peter Anvin" <hpa@zytor.com> +Cc: Peter Waskiewicz <peter.p.waskiewicz.jr@intel.com> +Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com> +Cc: Joe Perches <joe@perches.com> +Cc: netdev@vger.kernel.org +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h | 15 ++ + drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | 49 +++++++++ + drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c | 97 +++++++++++++++++++ + drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.h | 1 + 4 files changed, 162 insertions(+) + +--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h ++++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h +@@ -582,6 +582,19 @@ struct pch_gbe_hw_stats { + }; + + /** ++ * struct pch_gbe_privdata - PCI Device ID driver data ++ * @phy_tx_clk_delay: Bool, configure the PHY TX delay in software ++ * @phy_disable_hibernate: Bool, disable PHY hibernation ++ * @platform_init: Platform initialization callback, called from ++ * probe, prior to PHY initialization. ++ */ ++struct pch_gbe_privdata { ++ bool phy_tx_clk_delay; ++ bool phy_disable_hibernate; ++ int (*platform_init)(struct pci_dev *pdev); ++}; ++ ++/** + * struct pch_gbe_adapter - board specific private data structure + * @stats_lock: Spinlock structure for status + * @ethtool_lock: Spinlock structure for ethtool +@@ -604,6 +617,7 @@ struct pch_gbe_hw_stats { + * @rx_buffer_len: Receive buffer length + * @tx_queue_len: Transmit queue length + * @have_msi: PCI MSI mode flag ++ * @pch_gbe_privdata: PCI Device ID driver_data + */ + + struct pch_gbe_adapter { +@@ -631,6 +645,7 @@ struct pch_gbe_adapter { + int hwts_tx_en; + int hwts_rx_en; + struct pci_dev *ptp_pdev; ++ struct pch_gbe_privdata *pdata; + }; + + #define pch_gbe_hw_to_adapter(hw) container_of(hw, struct pch_gbe_adapter, hw) +--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c ++++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c +@@ -23,6 +23,7 @@ + #include <linux/module.h> + #include <linux/net_tstamp.h> + #include <linux/ptp_classify.h> ++#include <linux/gpio.h> + + #define DRV_VERSION "1.01" + const char pch_driver_version[] = DRV_VERSION; +@@ -111,6 +112,8 @@ const char pch_driver_version[] = DRV_VE + #define PTP_L4_MULTICAST_SA "01:00:5e:00:01:81" + #define PTP_L2_MULTICAST_SA "01:1b:19:00:00:00" + ++#define MINNOW_PHY_RESET_GPIO 13 ++ + static unsigned int copybreak __read_mostly = PCH_GBE_COPYBREAK_DEFAULT; + + static int pch_gbe_mdio_read(struct net_device *netdev, int addr, int reg); +@@ -2635,6 +2638,9 @@ static int pch_gbe_probe(struct pci_dev + adapter->pdev = pdev; + adapter->hw.back = adapter; + adapter->hw.reg = pcim_iomap_table(pdev)[PCH_GBE_PCI_BAR]; ++ adapter->pdata = (struct pch_gbe_privdata *)pci_id->driver_data; ++ if (adapter->pdata && adapter->pdata->platform_init) ++ adapter->pdata->platform_init(pdev); + + adapter->ptp_pdev = pci_get_bus_and_slot(adapter->pdev->bus->number, + PCI_DEVFN(12, 4)); +@@ -2710,6 +2716,10 @@ static int pch_gbe_probe(struct pci_dev + + dev_dbg(&pdev->dev, "PCH Network Connection\n"); + ++ /* Disable hibernation on certain platforms */ ++ if (adapter->pdata && adapter->pdata->phy_disable_hibernate) ++ pch_gbe_phy_disable_hibernate(&adapter->hw); ++ + device_set_wakeup_enable(&pdev->dev, 1); + return 0; + +@@ -2720,9 +2730,48 @@ err_free_netdev: + return ret; + } + ++/* The AR803X PHY on the MinnowBoard requires a physical pin to be toggled to ++ * ensure it is awake for probe and init. Request the line and reset the PHY. ++ */ ++static int pch_gbe_minnow_platform_init(struct pci_dev *pdev) ++{ ++ unsigned long flags = GPIOF_DIR_OUT | GPIOF_INIT_HIGH | GPIOF_EXPORT; ++ unsigned gpio = MINNOW_PHY_RESET_GPIO; ++ int ret; ++ ++ ret = devm_gpio_request_one(&pdev->dev, gpio, flags, ++ "minnow_phy_reset"); ++ if (ret) { ++ dev_err(&pdev->dev, ++ "ERR: Can't request PHY reset GPIO line '%d'\n", gpio); ++ return ret; ++ } ++ ++ gpio_set_value(gpio, 0); ++ usleep_range(1250, 1500); ++ gpio_set_value(gpio, 1); ++ usleep_range(1250, 1500); ++ ++ return ret; ++} ++ ++static struct pch_gbe_privdata pch_gbe_minnow_privdata = { ++ .phy_tx_clk_delay = true, ++ .phy_disable_hibernate = true, ++ .platform_init = pch_gbe_minnow_platform_init, ++}; ++ + static DEFINE_PCI_DEVICE_TABLE(pch_gbe_pcidev_id) = { + {.vendor = PCI_VENDOR_ID_INTEL, + .device = PCI_DEVICE_ID_INTEL_IOH1_GBE, ++ .subvendor = PCI_VENDOR_ID_CIRCUITCO, ++ .subdevice = PCI_SUBSYSTEM_ID_CIRCUITCO_MINNOWBOARD, ++ .class = (PCI_CLASS_NETWORK_ETHERNET << 8), ++ .class_mask = (0xFFFF00), ++ .driver_data = (kernel_ulong_t)&pch_gbe_minnow_privdata ++ }, ++ {.vendor = PCI_VENDOR_ID_INTEL, ++ .device = PCI_DEVICE_ID_INTEL_IOH1_GBE, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .class = (PCI_CLASS_NETWORK_ETHERNET << 8), +--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c ++++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c +@@ -74,6 +74,15 @@ + #define MII_SR_100X_FD_CAPS 0x4000 /* 100X Full Duplex Capable */ + #define MII_SR_100T4_CAPS 0x8000 /* 100T4 Capable */ + ++/* AR8031 PHY Debug Registers */ ++#define PHY_AR803X_ID 0x00001374 ++#define PHY_AR8031_DBG_OFF 0x1D ++#define PHY_AR8031_DBG_DAT 0x1E ++#define PHY_AR8031_SERDES 0x05 ++#define PHY_AR8031_HIBERNATE 0x0B ++#define PHY_AR8031_SERDES_TX_CLK_DLY 0x0100 /* TX clock delay of 2.0ns */ ++#define PHY_AR8031_PS_HIB_EN 0x8000 /* Hibernate enable */ ++ + /* Phy Id Register (word 2) */ + #define PHY_REVISION_MASK 0x000F + +@@ -249,6 +258,51 @@ inline void pch_gbe_phy_set_rgmii(struct + } + + /** ++ * pch_gbe_phy_tx_clk_delay - Setup TX clock delay via the PHY ++ * @hw: Pointer to the HW structure ++ * Returns ++ * 0: Successful. ++ * -EINVAL: Invalid argument. ++ */ ++static int pch_gbe_phy_tx_clk_delay(struct pch_gbe_hw *hw) ++{ ++ /* The RGMII interface requires a ~2ns TX clock delay. This is typically ++ * done in layout with a longer trace or via PHY strapping, but can also ++ * be done via PHY configuration registers. ++ */ ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); ++ u16 mii_reg; ++ int ret = 0; ++ ++ switch (hw->phy.id) { ++ case PHY_AR803X_ID: ++ netdev_dbg(adapter->netdev, ++ "Configuring AR803X PHY for 2ns TX clock delay\n"); ++ pch_gbe_phy_read_reg_miic(hw, PHY_AR8031_DBG_OFF, &mii_reg); ++ ret = pch_gbe_phy_write_reg_miic(hw, PHY_AR8031_DBG_OFF, ++ PHY_AR8031_SERDES); ++ if (ret) ++ break; ++ ++ pch_gbe_phy_read_reg_miic(hw, PHY_AR8031_DBG_DAT, &mii_reg); ++ mii_reg |= PHY_AR8031_SERDES_TX_CLK_DLY; ++ ret = pch_gbe_phy_write_reg_miic(hw, PHY_AR8031_DBG_DAT, ++ mii_reg); ++ break; ++ default: ++ netdev_err(adapter->netdev, ++ "Unknown PHY (%x), could not set TX clock delay\n", ++ hw->phy.id); ++ return -EINVAL; ++ } ++ ++ if (ret) ++ netdev_err(adapter->netdev, ++ "Could not configure tx clock delay for PHY\n"); ++ return ret; ++} ++ ++/** + * pch_gbe_phy_init_setting - PHY initial setting + * @hw: Pointer to the HW structure + */ +@@ -278,4 +332,47 @@ void pch_gbe_phy_init_setting(struct pch + mii_reg |= PHYSP_CTRL_ASSERT_CRS_TX; + pch_gbe_phy_write_reg_miic(hw, PHY_PHYSP_CONTROL, mii_reg); + ++ /* Setup a TX clock delay on certain platforms */ ++ if (adapter->pdata && adapter->pdata->phy_tx_clk_delay) ++ pch_gbe_phy_tx_clk_delay(hw); ++} ++ ++/** ++ * pch_gbe_phy_disable_hibernate - Disable the PHY low power state ++ * @hw: Pointer to the HW structure ++ * Returns ++ * 0: Successful. ++ * -EINVAL: Invalid argument. ++ */ ++int pch_gbe_phy_disable_hibernate(struct pch_gbe_hw *hw) ++{ ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); ++ u16 mii_reg; ++ int ret = 0; ++ ++ switch (hw->phy.id) { ++ case PHY_AR803X_ID: ++ netdev_dbg(adapter->netdev, ++ "Disabling hibernation for AR803X PHY\n"); ++ ret = pch_gbe_phy_write_reg_miic(hw, PHY_AR8031_DBG_OFF, ++ PHY_AR8031_HIBERNATE); ++ if (ret) ++ break; ++ ++ pch_gbe_phy_read_reg_miic(hw, PHY_AR8031_DBG_DAT, &mii_reg); ++ mii_reg &= ~PHY_AR8031_PS_HIB_EN; ++ ret = pch_gbe_phy_write_reg_miic(hw, PHY_AR8031_DBG_DAT, ++ mii_reg); ++ break; ++ default: ++ netdev_err(adapter->netdev, ++ "Unknown PHY (%x), could not disable hibernation\n", ++ hw->phy.id); ++ return -EINVAL; ++ } ++ ++ if (ret) ++ netdev_err(adapter->netdev, ++ "Could not disable PHY hibernation\n"); ++ return ret; + } +--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.h ++++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.h +@@ -33,5 +33,6 @@ void pch_gbe_phy_power_up(struct pch_gbe + void pch_gbe_phy_power_down(struct pch_gbe_hw *hw); + void pch_gbe_phy_set_rgmii(struct pch_gbe_hw *hw); + void pch_gbe_phy_init_setting(struct pch_gbe_hw *hw); ++int pch_gbe_phy_disable_hibernate(struct pch_gbe_hw *hw); + + #endif /* _PCH_GBE_PHY_H_ */ diff --git a/patches.minnowboard/pch_gbe-convert-pr_-to-netdev_.patch b/patches.minnowboard/pch_gbe-convert-pr_-to-netdev_.patch new file mode 100644 index 00000000000000..9ff1d7acb4744d --- /dev/null +++ b/patches.minnowboard/pch_gbe-convert-pr_-to-netdev_.patch @@ -0,0 +1,1157 @@ +From 453ca931f515161902dbb325d7f39a992c3059ce Mon Sep 17 00:00:00 2001 +From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> +Date: Fri, 28 Jun 2013 14:02:53 +0300 +Subject: pch_gbe: convert pr_* to netdev_* + +From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> + +commit 453ca931f515161902dbb325d7f39a992c3059ce upstream. + +We may use nice macros to prefix our messages with proper device name. + +Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h | 2 + drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_api.c | 49 +- + drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c | 2 + drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | 275 +++++++++------- + drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c | 63 ++- + drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c | 23 - + 6 files changed, 250 insertions(+), 164 deletions(-) + +--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h ++++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h +@@ -633,6 +633,8 @@ struct pch_gbe_adapter { + struct pci_dev *ptp_pdev; + }; + ++#define pch_gbe_hw_to_adapter(hw) container_of(hw, struct pch_gbe_adapter, hw) ++ + extern const char pch_driver_version[]; + + /* pch_gbe_main.c */ +--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_api.c ++++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_api.c +@@ -70,7 +70,9 @@ static s32 pch_gbe_plat_init_hw(struct p + + ret_val = pch_gbe_phy_get_id(hw); + if (ret_val) { +- pr_err("pch_gbe_phy_get_id error\n"); ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); ++ ++ netdev_err(adapter->netdev, "pch_gbe_phy_get_id error\n"); + return ret_val; + } + pch_gbe_phy_init_setting(hw); +@@ -115,7 +117,9 @@ static void pch_gbe_plat_init_function_p + inline s32 pch_gbe_hal_setup_init_funcs(struct pch_gbe_hw *hw) + { + if (!hw->reg) { +- pr_err("ERROR: Registers not mapped\n"); ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); ++ ++ netdev_err(adapter->netdev, "ERROR: Registers not mapped\n"); + return -ENOSYS; + } + pch_gbe_plat_init_function_pointers(hw); +@@ -128,10 +132,13 @@ inline s32 pch_gbe_hal_setup_init_funcs( + */ + inline void pch_gbe_hal_get_bus_info(struct pch_gbe_hw *hw) + { +- if (!hw->func->get_bus_info) +- pr_err("ERROR: configuration\n"); +- else +- hw->func->get_bus_info(hw); ++ if (!hw->func->get_bus_info) { ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); ++ ++ netdev_err(adapter->netdev, "ERROR: configuration\n"); ++ return; ++ } ++ hw->func->get_bus_info(hw); + } + + /** +@@ -144,7 +151,9 @@ inline void pch_gbe_hal_get_bus_info(str + inline s32 pch_gbe_hal_init_hw(struct pch_gbe_hw *hw) + { + if (!hw->func->init_hw) { +- pr_err("ERROR: configuration\n"); ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); ++ ++ netdev_err(adapter->netdev, "ERROR: configuration\n"); + return -ENOSYS; + } + return hw->func->init_hw(hw); +@@ -190,10 +199,13 @@ inline s32 pch_gbe_hal_write_phy_reg(str + */ + inline void pch_gbe_hal_phy_hw_reset(struct pch_gbe_hw *hw) + { +- if (!hw->func->reset_phy) +- pr_err("ERROR: configuration\n"); +- else +- hw->func->reset_phy(hw); ++ if (!hw->func->reset_phy) { ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); ++ ++ netdev_err(adapter->netdev, "ERROR: configuration\n"); ++ return; ++ } ++ hw->func->reset_phy(hw); + } + + /** +@@ -202,10 +214,13 @@ inline void pch_gbe_hal_phy_hw_reset(str + */ + inline void pch_gbe_hal_phy_sw_reset(struct pch_gbe_hw *hw) + { +- if (!hw->func->sw_reset_phy) +- pr_err("ERROR: configuration\n"); +- else +- hw->func->sw_reset_phy(hw); ++ if (!hw->func->sw_reset_phy) { ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); ++ ++ netdev_err(adapter->netdev, "ERROR: configuration\n"); ++ return; ++ } ++ hw->func->sw_reset_phy(hw); + } + + /** +@@ -218,7 +233,9 @@ inline void pch_gbe_hal_phy_sw_reset(str + inline s32 pch_gbe_hal_read_mac_addr(struct pch_gbe_hw *hw) + { + if (!hw->func->read_mac_addr) { +- pr_err("ERROR: configuration\n"); ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); ++ ++ netdev_err(adapter->netdev, "ERROR: configuration\n"); + return -ENOSYS; + } + return hw->func->read_mac_addr(hw); +--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c ++++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c +@@ -122,7 +122,7 @@ static int pch_gbe_set_settings(struct n + } + ret = mii_ethtool_sset(&adapter->mii, ecmd); + if (ret) { +- pr_err("Error: mii_ethtool_sset\n"); ++ netdev_err(netdev, "Error: mii_ethtool_sset\n"); + return ret; + } + hw->mac.link_speed = speed; +--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c ++++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c +@@ -300,6 +300,7 @@ inline void pch_gbe_mac_load_mac_addr(st + */ + s32 pch_gbe_mac_read_mac_addr(struct pch_gbe_hw *hw) + { ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); + u32 adr1a, adr1b; + + adr1a = ioread32(&hw->reg->mac_adr[0].high); +@@ -312,7 +313,7 @@ s32 pch_gbe_mac_read_mac_addr(struct pch + hw->mac.addr[4] = (u8)(adr1b & 0xFF); + hw->mac.addr[5] = (u8)((adr1b >> 8) & 0xFF); + +- pr_debug("hw->mac.addr : %pM\n", hw->mac.addr); ++ netdev_dbg(adapter->netdev, "hw->mac.addr : %pM\n", hw->mac.addr); + return 0; + } + +@@ -324,6 +325,7 @@ s32 pch_gbe_mac_read_mac_addr(struct pch + static void pch_gbe_wait_clr_bit(void *reg, u32 bit) + { + u32 tmp; ++ + /* wait busy */ + tmp = 1000; + while ((ioread32(reg) & bit) && --tmp) +@@ -340,9 +342,10 @@ static void pch_gbe_wait_clr_bit(void *r + */ + static void pch_gbe_mac_mar_set(struct pch_gbe_hw *hw, u8 * addr, u32 index) + { ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); + u32 mar_low, mar_high, adrmask; + +- pr_debug("index : 0x%x\n", index); ++ netdev_dbg(adapter->netdev, "index : 0x%x\n", index); + + /* + * HW expects these in little endian so we reverse the byte order +@@ -468,10 +471,11 @@ static void pch_gbe_mac_mc_addr_list_upd + */ + s32 pch_gbe_mac_force_mac_fc(struct pch_gbe_hw *hw) + { ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); + struct pch_gbe_mac_info *mac = &hw->mac; + u32 rx_fctrl; + +- pr_debug("mac->fc = %u\n", mac->fc); ++ netdev_dbg(adapter->netdev, "mac->fc = %u\n", mac->fc); + + rx_fctrl = ioread32(&hw->reg->RX_FCTRL); + +@@ -493,14 +497,16 @@ s32 pch_gbe_mac_force_mac_fc(struct pch_ + mac->tx_fc_enable = true; + break; + default: +- pr_err("Flow control param set incorrectly\n"); ++ netdev_err(adapter->netdev, ++ "Flow control param set incorrectly\n"); + return -EINVAL; + } + if (mac->link_duplex == DUPLEX_HALF) + rx_fctrl &= ~PCH_GBE_FL_CTRL_EN; + iowrite32(rx_fctrl, &hw->reg->RX_FCTRL); +- pr_debug("RX_FCTRL reg : 0x%08x mac->tx_fc_enable : %d\n", +- ioread32(&hw->reg->RX_FCTRL), mac->tx_fc_enable); ++ netdev_dbg(adapter->netdev, ++ "RX_FCTRL reg : 0x%08x mac->tx_fc_enable : %d\n", ++ ioread32(&hw->reg->RX_FCTRL), mac->tx_fc_enable); + return 0; + } + +@@ -511,10 +517,11 @@ s32 pch_gbe_mac_force_mac_fc(struct pch_ + */ + static void pch_gbe_mac_set_wol_event(struct pch_gbe_hw *hw, u32 wu_evt) + { ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); + u32 addr_mask; + +- pr_debug("wu_evt : 0x%08x ADDR_MASK reg : 0x%08x\n", +- wu_evt, ioread32(&hw->reg->ADDR_MASK)); ++ netdev_dbg(adapter->netdev, "wu_evt : 0x%08x ADDR_MASK reg : 0x%08x\n", ++ wu_evt, ioread32(&hw->reg->ADDR_MASK)); + + if (wu_evt) { + /* Set Wake-On-Lan address mask */ +@@ -546,6 +553,7 @@ static void pch_gbe_mac_set_wol_event(st + u16 pch_gbe_mac_ctrl_miim(struct pch_gbe_hw *hw, u32 addr, u32 dir, u32 reg, + u16 data) + { ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); + u32 data_out = 0; + unsigned int i; + unsigned long flags; +@@ -558,7 +566,7 @@ u16 pch_gbe_mac_ctrl_miim(struct pch_gbe + udelay(20); + } + if (i == 0) { +- pr_err("pch-gbe.miim won't go Ready\n"); ++ netdev_err(adapter->netdev, "pch-gbe.miim won't go Ready\n"); + spin_unlock_irqrestore(&hw->miim_lock, flags); + return 0; /* No way to indicate timeout error */ + } +@@ -573,9 +581,9 @@ u16 pch_gbe_mac_ctrl_miim(struct pch_gbe + } + spin_unlock_irqrestore(&hw->miim_lock, flags); + +- pr_debug("PHY %s: reg=%d, data=0x%04X\n", +- dir == PCH_GBE_MIIM_OPER_READ ? "READ" : "WRITE", reg, +- dir == PCH_GBE_MIIM_OPER_READ ? data_out : data); ++ netdev_dbg(adapter->netdev, "PHY %s: reg=%d, data=0x%04X\n", ++ dir == PCH_GBE_MIIM_OPER_READ ? "READ" : "WRITE", reg, ++ dir == PCH_GBE_MIIM_OPER_READ ? data_out : data); + return (u16) data_out; + } + +@@ -585,6 +593,7 @@ u16 pch_gbe_mac_ctrl_miim(struct pch_gbe + */ + static void pch_gbe_mac_set_pause_packet(struct pch_gbe_hw *hw) + { ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); + unsigned long tmp2, tmp3; + + /* Set Pause packet */ +@@ -606,10 +615,13 @@ static void pch_gbe_mac_set_pause_packet + /* Transmit Pause Packet */ + iowrite32(PCH_GBE_PS_PKT_RQ, &hw->reg->PAUSE_REQ); + +- pr_debug("PAUSE_PKT1-5 reg : 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", +- ioread32(&hw->reg->PAUSE_PKT1), ioread32(&hw->reg->PAUSE_PKT2), +- ioread32(&hw->reg->PAUSE_PKT3), ioread32(&hw->reg->PAUSE_PKT4), +- ioread32(&hw->reg->PAUSE_PKT5)); ++ netdev_dbg(adapter->netdev, ++ "PAUSE_PKT1-5 reg : 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", ++ ioread32(&hw->reg->PAUSE_PKT1), ++ ioread32(&hw->reg->PAUSE_PKT2), ++ ioread32(&hw->reg->PAUSE_PKT3), ++ ioread32(&hw->reg->PAUSE_PKT4), ++ ioread32(&hw->reg->PAUSE_PKT5)); + + return; + } +@@ -669,7 +681,7 @@ static int pch_gbe_init_phy(struct pch_g + break; + } + adapter->hw.phy.addr = adapter->mii.phy_id; +- pr_debug("phy_addr = %d\n", adapter->mii.phy_id); ++ netdev_dbg(netdev, "phy_addr = %d\n", adapter->mii.phy_id); + if (addr == 32) + return -EAGAIN; + /* Selected the phy and isolate the rest */ +@@ -758,13 +770,15 @@ void pch_gbe_reinit_locked(struct pch_gb + */ + void pch_gbe_reset(struct pch_gbe_adapter *adapter) + { ++ struct net_device *netdev = adapter->netdev; ++ + pch_gbe_mac_reset_hw(&adapter->hw); + /* reprogram multicast address register after reset */ +- pch_gbe_set_multi(adapter->netdev); ++ pch_gbe_set_multi(netdev); + /* Setup the receive address. */ + pch_gbe_mac_init_rx_addrs(&adapter->hw, PCH_GBE_MAR_ENTRIES); + if (pch_gbe_hal_init_hw(&adapter->hw)) +- pr_err("Hardware Error\n"); ++ netdev_err(netdev, "Hardware Error\n"); + } + + /** +@@ -778,7 +792,7 @@ static void pch_gbe_free_irq(struct pch_ + free_irq(adapter->pdev->irq, netdev); + if (adapter->have_msi) { + pci_disable_msi(adapter->pdev); +- pr_debug("call pci_disable_msi\n"); ++ netdev_dbg(netdev, "call pci_disable_msi\n"); + } + } + +@@ -795,7 +809,8 @@ static void pch_gbe_irq_disable(struct p + ioread32(&hw->reg->INT_ST); + synchronize_irq(adapter->pdev->irq); + +- pr_debug("INT_EN reg : 0x%08x\n", ioread32(&hw->reg->INT_EN)); ++ netdev_dbg(adapter->netdev, "INT_EN reg : 0x%08x\n", ++ ioread32(&hw->reg->INT_EN)); + } + + /** +@@ -809,7 +824,8 @@ static void pch_gbe_irq_enable(struct pc + if (likely(atomic_dec_and_test(&adapter->irq_sem))) + iowrite32(PCH_GBE_INT_ENABLE_MASK, &hw->reg->INT_EN); + ioread32(&hw->reg->INT_ST); +- pr_debug("INT_EN reg : 0x%08x\n", ioread32(&hw->reg->INT_EN)); ++ netdev_dbg(adapter->netdev, "INT_EN reg : 0x%08x\n", ++ ioread32(&hw->reg->INT_EN)); + } + + +@@ -846,9 +862,9 @@ static void pch_gbe_configure_tx(struct + struct pch_gbe_hw *hw = &adapter->hw; + u32 tdba, tdlen, dctrl; + +- pr_debug("dma addr = 0x%08llx size = 0x%08x\n", +- (unsigned long long)adapter->tx_ring->dma, +- adapter->tx_ring->size); ++ netdev_dbg(adapter->netdev, "dma addr = 0x%08llx size = 0x%08x\n", ++ (unsigned long long)adapter->tx_ring->dma, ++ adapter->tx_ring->size); + + /* Setup the HW Tx Head and Tail descriptor pointers */ + tdba = adapter->tx_ring->dma; +@@ -894,9 +910,9 @@ static void pch_gbe_configure_rx(struct + struct pch_gbe_hw *hw = &adapter->hw; + u32 rdba, rdlen, rxdma; + +- pr_debug("dma adr = 0x%08llx size = 0x%08x\n", +- (unsigned long long)adapter->rx_ring->dma, +- adapter->rx_ring->size); ++ netdev_dbg(adapter->netdev, "dma adr = 0x%08llx size = 0x%08x\n", ++ (unsigned long long)adapter->rx_ring->dma, ++ adapter->rx_ring->size); + + pch_gbe_mac_force_mac_fc(hw); + +@@ -907,9 +923,10 @@ static void pch_gbe_configure_rx(struct + rxdma &= ~PCH_GBE_RX_DMA_EN; + iowrite32(rxdma, &hw->reg->DMA_CTRL); + +- pr_debug("MAC_RX_EN reg = 0x%08x DMA_CTRL reg = 0x%08x\n", +- ioread32(&hw->reg->MAC_RX_EN), +- ioread32(&hw->reg->DMA_CTRL)); ++ netdev_dbg(adapter->netdev, ++ "MAC_RX_EN reg = 0x%08x DMA_CTRL reg = 0x%08x\n", ++ ioread32(&hw->reg->MAC_RX_EN), ++ ioread32(&hw->reg->DMA_CTRL)); + + /* Setup the HW Rx Head and Tail Descriptor Pointers and + * the Base and Length of the Rx Descriptor Ring */ +@@ -977,7 +994,8 @@ static void pch_gbe_clean_tx_ring(struct + buffer_info = &tx_ring->buffer_info[i]; + pch_gbe_unmap_and_free_tx_resource(adapter, buffer_info); + } +- pr_debug("call pch_gbe_unmap_and_free_tx_resource() %d count\n", i); ++ netdev_dbg(adapter->netdev, ++ "call pch_gbe_unmap_and_free_tx_resource() %d count\n", i); + + size = (unsigned long)sizeof(struct pch_gbe_buffer) * tx_ring->count; + memset(tx_ring->buffer_info, 0, size); +@@ -1009,7 +1027,8 @@ pch_gbe_clean_rx_ring(struct pch_gbe_ada + buffer_info = &rx_ring->buffer_info[i]; + pch_gbe_unmap_and_free_rx_resource(adapter, buffer_info); + } +- pr_debug("call pch_gbe_unmap_and_free_rx_resource() %d count\n", i); ++ netdev_dbg(adapter->netdev, ++ "call pch_gbe_unmap_and_free_rx_resource() %d count\n", i); + size = (unsigned long)sizeof(struct pch_gbe_buffer) * rx_ring->count; + memset(rx_ring->buffer_info, 0, size); + +@@ -1087,7 +1106,7 @@ static void pch_gbe_watchdog(unsigned lo + struct net_device *netdev = adapter->netdev; + struct pch_gbe_hw *hw = &adapter->hw; + +- pr_debug("right now = %ld\n", jiffies); ++ netdev_dbg(netdev, "right now = %ld\n", jiffies); + + pch_gbe_update_stats(adapter); + if ((mii_link_ok(&adapter->mii)) && (!netif_carrier_ok(netdev))) { +@@ -1095,7 +1114,7 @@ static void pch_gbe_watchdog(unsigned lo + netdev->tx_queue_len = adapter->tx_queue_len; + /* mii library handles link maintenance tasks */ + if (mii_ethtool_gset(&adapter->mii, &cmd)) { +- pr_err("ethtool get setting Error\n"); ++ netdev_err(netdev, "ethtool get setting Error\n"); + mod_timer(&adapter->watchdog_timer, + round_jiffies(jiffies + + PCH_GBE_WATCHDOG_PERIOD)); +@@ -1213,7 +1232,7 @@ static void pch_gbe_tx_queue(struct pch_ + buffer_info->length, + DMA_TO_DEVICE); + if (dma_mapping_error(&adapter->pdev->dev, buffer_info->dma)) { +- pr_err("TX DMA map failed\n"); ++ netdev_err(adapter->netdev, "TX DMA map failed\n"); + buffer_info->dma = 0; + buffer_info->time_stamp = 0; + tx_ring->next_to_use = ring_num; +@@ -1333,13 +1352,13 @@ static irqreturn_t pch_gbe_intr(int irq, + /* When request status is no interruption factor */ + if (unlikely(!int_st)) + return IRQ_NONE; /* Not our interrupt. End processing. */ +- pr_debug("%s occur int_st = 0x%08x\n", __func__, int_st); ++ netdev_dbg(netdev, "%s occur int_st = 0x%08x\n", __func__, int_st); + if (int_st & PCH_GBE_INT_RX_FRAME_ERR) + adapter->stats.intr_rx_frame_err_count++; + if (int_st & PCH_GBE_INT_RX_FIFO_ERR) + if (!adapter->rx_stop_flag) { + adapter->stats.intr_rx_fifo_err_count++; +- pr_debug("Rx fifo over run\n"); ++ netdev_dbg(netdev, "Rx fifo over run\n"); + adapter->rx_stop_flag = true; + int_en = ioread32(&hw->reg->INT_EN); + iowrite32((int_en & ~PCH_GBE_INT_RX_FIFO_ERR), +@@ -1359,7 +1378,7 @@ static irqreturn_t pch_gbe_intr(int irq, + /* When Rx descriptor is empty */ + if ((int_st & PCH_GBE_INT_RX_DSC_EMP)) { + adapter->stats.intr_rx_dsc_empty_count++; +- pr_debug("Rx descriptor is empty\n"); ++ netdev_dbg(netdev, "Rx descriptor is empty\n"); + int_en = ioread32(&hw->reg->INT_EN); + iowrite32((int_en & ~PCH_GBE_INT_RX_DSC_EMP), &hw->reg->INT_EN); + if (hw->mac.tx_fc_enable) { +@@ -1382,8 +1401,8 @@ static irqreturn_t pch_gbe_intr(int irq, + __napi_schedule(&adapter->napi); + } + } +- pr_debug("return = 0x%08x INT_EN reg = 0x%08x\n", +- IRQ_HANDLED, ioread32(&hw->reg->INT_EN)); ++ netdev_dbg(netdev, "return = 0x%08x INT_EN reg = 0x%08x\n", ++ IRQ_HANDLED, ioread32(&hw->reg->INT_EN)); + return IRQ_HANDLED; + } + +@@ -1437,9 +1456,10 @@ pch_gbe_alloc_rx_buffers(struct pch_gbe_ + rx_desc->buffer_addr = (buffer_info->dma); + rx_desc->gbec_status = DSC_INIT16; + +- pr_debug("i = %d buffer_info->dma = 0x08%llx buffer_info->length = 0x%x\n", +- i, (unsigned long long)buffer_info->dma, +- buffer_info->length); ++ netdev_dbg(netdev, ++ "i = %d buffer_info->dma = 0x08%llx buffer_info->length = 0x%x\n", ++ i, (unsigned long long)buffer_info->dma, ++ buffer_info->length); + + if (unlikely(++i == rx_ring->count)) + i = 0; +@@ -1531,12 +1551,13 @@ pch_gbe_clean_tx(struct pch_gbe_adapter + bool cleaned = false; + int unused, thresh; + +- pr_debug("next_to_clean : %d\n", tx_ring->next_to_clean); ++ netdev_dbg(adapter->netdev, "next_to_clean : %d\n", ++ tx_ring->next_to_clean); + + i = tx_ring->next_to_clean; + tx_desc = PCH_GBE_TX_DESC(*tx_ring, i); +- pr_debug("gbec_status:0x%04x dma_status:0x%04x\n", +- tx_desc->gbec_status, tx_desc->dma_status); ++ netdev_dbg(adapter->netdev, "gbec_status:0x%04x dma_status:0x%04x\n", ++ tx_desc->gbec_status, tx_desc->dma_status); + + unused = PCH_GBE_DESC_UNUSED(tx_ring); + thresh = tx_ring->count - PCH_GBE_TX_WEIGHT; +@@ -1544,8 +1565,10 @@ pch_gbe_clean_tx(struct pch_gbe_adapter + { /* current marked clean, tx queue filling up, do extra clean */ + int j, k; + if (unused < 8) { /* tx queue nearly full */ +- pr_debug("clean_tx: transmit queue warning (%x,%x) unused=%d\n", +- tx_ring->next_to_clean,tx_ring->next_to_use,unused); ++ netdev_dbg(adapter->netdev, ++ "clean_tx: transmit queue warning (%x,%x) unused=%d\n", ++ tx_ring->next_to_clean, tx_ring->next_to_use, ++ unused); + } + + /* current marked clean, scan for more that need cleaning. */ +@@ -1557,49 +1580,56 @@ pch_gbe_clean_tx(struct pch_gbe_adapter + if (++k >= tx_ring->count) k = 0; /*increment, wrap*/ + } + if (j < PCH_GBE_TX_WEIGHT) { +- pr_debug("clean_tx: unused=%d loops=%d found tx_desc[%x,%x:%x].gbec_status=%04x\n", +- unused,j, i,k, tx_ring->next_to_use, tx_desc->gbec_status); ++ netdev_dbg(adapter->netdev, ++ "clean_tx: unused=%d loops=%d found tx_desc[%x,%x:%x].gbec_status=%04x\n", ++ unused, j, i, k, tx_ring->next_to_use, ++ tx_desc->gbec_status); + i = k; /*found one to clean, usu gbec_status==2000.*/ + } + } + + while ((tx_desc->gbec_status & DSC_INIT16) == 0x0000) { +- pr_debug("gbec_status:0x%04x\n", tx_desc->gbec_status); ++ netdev_dbg(adapter->netdev, "gbec_status:0x%04x\n", ++ tx_desc->gbec_status); + buffer_info = &tx_ring->buffer_info[i]; + skb = buffer_info->skb; + cleaned = true; + + if ((tx_desc->gbec_status & PCH_GBE_TXD_GMAC_STAT_ABT)) { + adapter->stats.tx_aborted_errors++; +- pr_err("Transfer Abort Error\n"); ++ netdev_err(adapter->netdev, "Transfer Abort Error\n"); + } else if ((tx_desc->gbec_status & PCH_GBE_TXD_GMAC_STAT_CRSER) + ) { + adapter->stats.tx_carrier_errors++; +- pr_err("Transfer Carrier Sense Error\n"); ++ netdev_err(adapter->netdev, ++ "Transfer Carrier Sense Error\n"); + } else if ((tx_desc->gbec_status & PCH_GBE_TXD_GMAC_STAT_EXCOL) + ) { + adapter->stats.tx_aborted_errors++; +- pr_err("Transfer Collision Abort Error\n"); ++ netdev_err(adapter->netdev, ++ "Transfer Collision Abort Error\n"); + } else if ((tx_desc->gbec_status & + (PCH_GBE_TXD_GMAC_STAT_SNGCOL | + PCH_GBE_TXD_GMAC_STAT_MLTCOL))) { + adapter->stats.collisions++; + adapter->stats.tx_packets++; + adapter->stats.tx_bytes += skb->len; +- pr_debug("Transfer Collision\n"); ++ netdev_dbg(adapter->netdev, "Transfer Collision\n"); + } else if ((tx_desc->gbec_status & PCH_GBE_TXD_GMAC_STAT_CMPLT) + ) { + adapter->stats.tx_packets++; + adapter->stats.tx_bytes += skb->len; + } + if (buffer_info->mapped) { +- pr_debug("unmap buffer_info->dma : %d\n", i); ++ netdev_dbg(adapter->netdev, ++ "unmap buffer_info->dma : %d\n", i); + dma_unmap_single(&adapter->pdev->dev, buffer_info->dma, + buffer_info->length, DMA_TO_DEVICE); + buffer_info->mapped = false; + } + if (buffer_info->skb) { +- pr_debug("trim buffer_info->skb : %d\n", i); ++ netdev_dbg(adapter->netdev, ++ "trim buffer_info->skb : %d\n", i); + skb_trim(buffer_info->skb, 0); + } + tx_desc->gbec_status = DSC_INIT16; +@@ -1613,8 +1643,9 @@ pch_gbe_clean_tx(struct pch_gbe_adapter + break; + } + } +- pr_debug("called pch_gbe_unmap_and_free_tx_resource() %d count\n", +- cleaned_count); ++ netdev_dbg(adapter->netdev, ++ "called pch_gbe_unmap_and_free_tx_resource() %d count\n", ++ cleaned_count); + if (cleaned_count > 0) { /*skip this if nothing cleaned*/ + /* Recover from running out of Tx resources in xmit_frame */ + spin_lock(&tx_ring->tx_lock); +@@ -1622,12 +1653,13 @@ pch_gbe_clean_tx(struct pch_gbe_adapter + { + netif_wake_queue(adapter->netdev); + adapter->stats.tx_restart_count++; +- pr_debug("Tx wake queue\n"); ++ netdev_dbg(adapter->netdev, "Tx wake queue\n"); + } + + tx_ring->next_to_clean = i; + +- pr_debug("next_to_clean : %d\n", tx_ring->next_to_clean); ++ netdev_dbg(adapter->netdev, "next_to_clean : %d\n", ++ tx_ring->next_to_clean); + spin_unlock(&tx_ring->tx_lock); + } + return cleaned; +@@ -1684,22 +1716,22 @@ pch_gbe_clean_rx(struct pch_gbe_adapter + buffer_info->length, DMA_FROM_DEVICE); + buffer_info->mapped = false; + +- pr_debug("RxDecNo = 0x%04x Status[DMA:0x%02x GBE:0x%04x " +- "TCP:0x%08x] BufInf = 0x%p\n", +- i, dma_status, gbec_status, tcp_ip_status, +- buffer_info); ++ netdev_dbg(netdev, ++ "RxDecNo = 0x%04x Status[DMA:0x%02x GBE:0x%04x TCP:0x%08x] BufInf = 0x%p\n", ++ i, dma_status, gbec_status, tcp_ip_status, ++ buffer_info); + /* Error check */ + if (unlikely(gbec_status & PCH_GBE_RXD_GMAC_STAT_NOTOCTAL)) { + adapter->stats.rx_frame_errors++; +- pr_err("Receive Not Octal Error\n"); ++ netdev_err(netdev, "Receive Not Octal Error\n"); + } else if (unlikely(gbec_status & + PCH_GBE_RXD_GMAC_STAT_NBLERR)) { + adapter->stats.rx_frame_errors++; +- pr_err("Receive Nibble Error\n"); ++ netdev_err(netdev, "Receive Nibble Error\n"); + } else if (unlikely(gbec_status & + PCH_GBE_RXD_GMAC_STAT_CRCERR)) { + adapter->stats.rx_crc_errors++; +- pr_err("Receive CRC Error\n"); ++ netdev_err(netdev, "Receive CRC Error\n"); + } else { + /* get receive length */ + /* length convert[-3], length includes FCS length */ +@@ -1730,8 +1762,9 @@ pch_gbe_clean_rx(struct pch_gbe_adapter + + napi_gro_receive(&adapter->napi, skb); + (*work_done)++; +- pr_debug("Receive skb->ip_summed: %d length: %d\n", +- skb->ip_summed, length); ++ netdev_dbg(netdev, ++ "Receive skb->ip_summed: %d length: %d\n", ++ skb->ip_summed, length); + } + /* return some buffers to hardware, one at a time is too slow */ + if (unlikely(cleaned_count >= PCH_GBE_RX_BUFFER_WRITE)) { +@@ -1787,10 +1820,10 @@ int pch_gbe_setup_tx_resources(struct pc + tx_desc = PCH_GBE_TX_DESC(*tx_ring, desNo); + tx_desc->gbec_status = DSC_INIT16; + } +- pr_debug("tx_ring->desc = 0x%p tx_ring->dma = 0x%08llx\n" +- "next_to_clean = 0x%08x next_to_use = 0x%08x\n", +- tx_ring->desc, (unsigned long long)tx_ring->dma, +- tx_ring->next_to_clean, tx_ring->next_to_use); ++ netdev_dbg(adapter->netdev, ++ "tx_ring->desc = 0x%p tx_ring->dma = 0x%08llx next_to_clean = 0x%08x next_to_use = 0x%08x\n", ++ tx_ring->desc, (unsigned long long)tx_ring->dma, ++ tx_ring->next_to_clean, tx_ring->next_to_use); + return 0; + } + +@@ -1829,10 +1862,10 @@ int pch_gbe_setup_rx_resources(struct pc + rx_desc = PCH_GBE_RX_DESC(*rx_ring, desNo); + rx_desc->gbec_status = DSC_INIT16; + } +- pr_debug("rx_ring->desc = 0x%p rx_ring->dma = 0x%08llx " +- "next_to_clean = 0x%08x next_to_use = 0x%08x\n", +- rx_ring->desc, (unsigned long long)rx_ring->dma, +- rx_ring->next_to_clean, rx_ring->next_to_use); ++ netdev_dbg(adapter->netdev, ++ "rx_ring->desc = 0x%p rx_ring->dma = 0x%08llx next_to_clean = 0x%08x next_to_use = 0x%08x\n", ++ rx_ring->desc, (unsigned long long)rx_ring->dma, ++ rx_ring->next_to_clean, rx_ring->next_to_use); + return 0; + } + +@@ -1886,9 +1919,9 @@ static int pch_gbe_request_irq(struct pc + flags = IRQF_SHARED; + adapter->have_msi = false; + err = pci_enable_msi(adapter->pdev); +- pr_debug("call pci_enable_msi\n"); ++ netdev_dbg(netdev, "call pci_enable_msi\n"); + if (err) { +- pr_debug("call pci_enable_msi - Error: %d\n", err); ++ netdev_dbg(netdev, "call pci_enable_msi - Error: %d\n", err); + } else { + flags = 0; + adapter->have_msi = true; +@@ -1896,9 +1929,11 @@ static int pch_gbe_request_irq(struct pc + err = request_irq(adapter->pdev->irq, &pch_gbe_intr, + flags, netdev->name, netdev); + if (err) +- pr_err("Unable to allocate interrupt Error: %d\n", err); +- pr_debug("adapter->have_msi : %d flags : 0x%04x return : 0x%04x\n", +- adapter->have_msi, flags, err); ++ netdev_err(netdev, "Unable to allocate interrupt Error: %d\n", ++ err); ++ netdev_dbg(netdev, ++ "adapter->have_msi : %d flags : 0x%04x return : 0x%04x\n", ++ adapter->have_msi, flags, err); + return err; + } + +@@ -1919,7 +1954,7 @@ int pch_gbe_up(struct pch_gbe_adapter *a + + /* Ensure we have a valid MAC */ + if (!is_valid_ether_addr(adapter->hw.mac.addr)) { +- pr_err("Error: Invalid MAC address\n"); ++ netdev_err(netdev, "Error: Invalid MAC address\n"); + goto out; + } + +@@ -1933,12 +1968,14 @@ int pch_gbe_up(struct pch_gbe_adapter *a + + err = pch_gbe_request_irq(adapter); + if (err) { +- pr_err("Error: can't bring device up - irq request failed\n"); ++ netdev_err(netdev, ++ "Error: can't bring device up - irq request failed\n"); + goto out; + } + err = pch_gbe_alloc_rx_buffers_pool(adapter, rx_ring, rx_ring->count); + if (err) { +- pr_err("Error: can't bring device up - alloc rx buffers pool failed\n"); ++ netdev_err(netdev, ++ "Error: can't bring device up - alloc rx buffers pool failed\n"); + goto freeirq; + } + pch_gbe_alloc_tx_buffers(adapter, tx_ring); +@@ -2015,11 +2052,11 @@ static int pch_gbe_sw_init(struct pch_gb + + /* Initialize the hardware-specific values */ + if (pch_gbe_hal_setup_init_funcs(hw)) { +- pr_err("Hardware Initialization Failure\n"); ++ netdev_err(netdev, "Hardware Initialization Failure\n"); + return -EIO; + } + if (pch_gbe_alloc_queues(adapter)) { +- pr_err("Unable to allocate memory for queues\n"); ++ netdev_err(netdev, "Unable to allocate memory for queues\n"); + return -ENOMEM; + } + spin_lock_init(&adapter->hw.miim_lock); +@@ -2030,9 +2067,10 @@ static int pch_gbe_sw_init(struct pch_gb + + pch_gbe_init_stats(adapter); + +- pr_debug("rx_buffer_len : %d mac.min_frame_size : %d mac.max_frame_size : %d\n", +- (u32) adapter->rx_buffer_len, +- hw->mac.min_frame_size, hw->mac.max_frame_size); ++ netdev_dbg(netdev, ++ "rx_buffer_len : %d mac.min_frame_size : %d mac.max_frame_size : %d\n", ++ (u32) adapter->rx_buffer_len, ++ hw->mac.min_frame_size, hw->mac.max_frame_size); + return 0; + } + +@@ -2061,7 +2099,7 @@ static int pch_gbe_open(struct net_devic + err = pch_gbe_up(adapter); + if (err) + goto err_up; +- pr_debug("Success End\n"); ++ netdev_dbg(netdev, "Success End\n"); + return 0; + + err_up: +@@ -2072,7 +2110,7 @@ err_setup_rx: + pch_gbe_free_tx_resources(adapter, adapter->tx_ring); + err_setup_tx: + pch_gbe_reset(adapter); +- pr_err("Error End\n"); ++ netdev_err(netdev, "Error End\n"); + return err; + } + +@@ -2116,8 +2154,9 @@ static int pch_gbe_xmit_frame(struct sk_ + if (unlikely(!PCH_GBE_DESC_UNUSED(tx_ring))) { + netif_stop_queue(netdev); + spin_unlock_irqrestore(&tx_ring->tx_lock, flags); +- pr_debug("Return : BUSY next_to use : 0x%08x next_to clean : 0x%08x\n", +- tx_ring->next_to_use, tx_ring->next_to_clean); ++ netdev_dbg(netdev, ++ "Return : BUSY next_to use : 0x%08x next_to clean : 0x%08x\n", ++ tx_ring->next_to_use, tx_ring->next_to_clean); + return NETDEV_TX_BUSY; + } + +@@ -2152,7 +2191,7 @@ static void pch_gbe_set_multi(struct net + int i; + int mc_count; + +- pr_debug("netdev->flags : 0x%08x\n", netdev->flags); ++ netdev_dbg(netdev, "netdev->flags : 0x%08x\n", netdev->flags); + + /* Check for Promiscuous and All Multicast modes */ + rctl = ioread32(&hw->reg->RX_MODE); +@@ -2192,7 +2231,8 @@ static void pch_gbe_set_multi(struct net + PCH_GBE_MAR_ENTRIES); + kfree(mta_list); + +- pr_debug("RX_MODE reg(check bit31,30 ADD,MLT) : 0x%08x netdev->mc_count : 0x%08x\n", ++ netdev_dbg(netdev, ++ "RX_MODE reg(check bit31,30 ADD,MLT) : 0x%08x netdev->mc_count : 0x%08x\n", + ioread32(&hw->reg->RX_MODE), mc_count); + } + +@@ -2218,12 +2258,12 @@ static int pch_gbe_set_mac(struct net_de + pch_gbe_mac_mar_set(&adapter->hw, adapter->hw.mac.addr, 0); + ret_val = 0; + } +- pr_debug("ret_val : 0x%08x\n", ret_val); +- pr_debug("dev_addr : %pM\n", netdev->dev_addr); +- pr_debug("mac_addr : %pM\n", adapter->hw.mac.addr); +- pr_debug("MAC_ADR1AB reg : 0x%08x 0x%08x\n", +- ioread32(&adapter->hw.reg->mac_adr[0].high), +- ioread32(&adapter->hw.reg->mac_adr[0].low)); ++ netdev_dbg(netdev, "ret_val : 0x%08x\n", ret_val); ++ netdev_dbg(netdev, "dev_addr : %pM\n", netdev->dev_addr); ++ netdev_dbg(netdev, "mac_addr : %pM\n", adapter->hw.mac.addr); ++ netdev_dbg(netdev, "MAC_ADR1AB reg : 0x%08x 0x%08x\n", ++ ioread32(&adapter->hw.reg->mac_adr[0].high), ++ ioread32(&adapter->hw.reg->mac_adr[0].low)); + return ret_val; + } + +@@ -2245,7 +2285,7 @@ static int pch_gbe_change_mtu(struct net + max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; + if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) || + (max_frame > PCH_GBE_MAX_JUMBO_FRAME_SIZE)) { +- pr_err("Invalid MTU setting\n"); ++ netdev_err(netdev, "Invalid MTU setting\n"); + return -EINVAL; + } + if (max_frame <= PCH_GBE_FRAME_SIZE_2048) +@@ -2274,9 +2314,10 @@ static int pch_gbe_change_mtu(struct net + adapter->hw.mac.max_frame_size = max_frame; + } + +- pr_debug("max_frame : %d rx_buffer_len : %d mtu : %d max_frame_size : %d\n", +- max_frame, (u32) adapter->rx_buffer_len, netdev->mtu, +- adapter->hw.mac.max_frame_size); ++ netdev_dbg(netdev, ++ "max_frame : %d rx_buffer_len : %d mtu : %d max_frame_size : %d\n", ++ max_frame, (u32) adapter->rx_buffer_len, netdev->mtu, ++ adapter->hw.mac.max_frame_size); + return 0; + } + +@@ -2317,7 +2358,7 @@ static int pch_gbe_ioctl(struct net_devi + { + struct pch_gbe_adapter *adapter = netdev_priv(netdev); + +- pr_debug("cmd : 0x%04x\n", cmd); ++ netdev_dbg(netdev, "cmd : 0x%04x\n", cmd); + + if (cmd == SIOCSHWTSTAMP) + return hwtstamp_ioctl(netdev, ifr, cmd); +@@ -2354,7 +2395,7 @@ static int pch_gbe_napi_poll(struct napi + bool poll_end_flag = false; + bool cleaned = false; + +- pr_debug("budget : %d\n", budget); ++ netdev_dbg(adapter->netdev, "budget : %d\n", budget); + + pch_gbe_clean_rx(adapter, adapter->rx_ring, &work_done, budget); + cleaned = pch_gbe_clean_tx(adapter, adapter->tx_ring); +@@ -2377,8 +2418,9 @@ static int pch_gbe_napi_poll(struct napi + pch_gbe_enable_dma_rx(&adapter->hw); + } + +- pr_debug("poll_end_flag : %d work_done : %d budget : %d\n", +- poll_end_flag, work_done, budget); ++ netdev_dbg(adapter->netdev, ++ "poll_end_flag : %d work_done : %d budget : %d\n", ++ poll_end_flag, work_done, budget); + + return work_done; + } +@@ -2435,7 +2477,7 @@ static pci_ers_result_t pch_gbe_io_slot_ + struct pch_gbe_hw *hw = &adapter->hw; + + if (pci_enable_device(pdev)) { +- pr_err("Cannot re-enable PCI device after reset\n"); ++ netdev_err(netdev, "Cannot re-enable PCI device after reset\n"); + return PCI_ERS_RESULT_DISCONNECT; + } + pci_set_master(pdev); +@@ -2455,7 +2497,8 @@ static void pch_gbe_io_resume(struct pci + + if (netif_running(netdev)) { + if (pch_gbe_up(adapter)) { +- pr_debug("can't bring device back up after reset\n"); ++ netdev_dbg(netdev, ++ "can't bring device back up after reset\n"); + return; + } + } +@@ -2509,7 +2552,7 @@ static int pch_gbe_resume(struct device + + err = pci_enable_device(pdev); + if (err) { +- pr_err("Cannot enable PCI device from suspend\n"); ++ netdev_err(netdev, "Cannot enable PCI device from suspend\n"); + return err; + } + pci_set_master(pdev); +@@ -2609,7 +2652,7 @@ static int pch_gbe_probe(struct pci_dev + adapter->ptp_pdev = pci_get_bus_and_slot(adapter->pdev->bus->number, + PCI_DEVFN(12, 4)); + if (ptp_filter_init(ptp_filter, ARRAY_SIZE(ptp_filter))) { +- pr_err("Bad ptp filter\n"); ++ dev_err(&pdev->dev, "Bad ptp filter\n"); + return -EINVAL; + } + +--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c ++++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c +@@ -237,16 +237,17 @@ static int pch_gbe_validate_option(int * + case enable_option: + switch (*value) { + case OPTION_ENABLED: +- pr_debug("%s Enabled\n", opt->name); ++ netdev_dbg(adapter->netdev, "%s Enabled\n", opt->name); + return 0; + case OPTION_DISABLED: +- pr_debug("%s Disabled\n", opt->name); ++ netdev_dbg(adapter->netdev, "%s Disabled\n", opt->name); + return 0; + } + break; + case range_option: + if (*value >= opt->arg.r.min && *value <= opt->arg.r.max) { +- pr_debug("%s set to %i\n", opt->name, *value); ++ netdev_dbg(adapter->netdev, "%s set to %i\n", ++ opt->name, *value); + return 0; + } + break; +@@ -258,7 +259,8 @@ static int pch_gbe_validate_option(int * + ent = &opt->arg.l.p[i]; + if (*value == ent->i) { + if (ent->str[0] != '\0') +- pr_debug("%s\n", ent->str); ++ netdev_dbg(adapter->netdev, "%s\n", ++ ent->str); + return 0; + } + } +@@ -268,8 +270,8 @@ static int pch_gbe_validate_option(int * + BUG(); + } + +- pr_debug("Invalid %s value specified (%i) %s\n", +- opt->name, *value, opt->err); ++ netdev_dbg(adapter->netdev, "Invalid %s value specified (%i) %s\n", ++ opt->name, *value, opt->err); + *value = opt->def; + return -1; + } +@@ -318,7 +320,8 @@ static void pch_gbe_check_copper_options + .p = an_list} } + }; + if (speed || dplx) { +- pr_debug("AutoNeg specified along with Speed or Duplex, AutoNeg parameter ignored\n"); ++ netdev_dbg(adapter->netdev, ++ "AutoNeg specified along with Speed or Duplex, AutoNeg parameter ignored\n"); + hw->phy.autoneg_advertised = opt.def; + } else { + int tmp = AutoNeg; +@@ -332,13 +335,16 @@ static void pch_gbe_check_copper_options + case 0: + hw->mac.autoneg = hw->mac.fc_autoneg = 1; + if ((speed || dplx)) +- pr_debug("Speed and duplex autonegotiation enabled\n"); ++ netdev_dbg(adapter->netdev, ++ "Speed and duplex autonegotiation enabled\n"); + hw->mac.link_speed = SPEED_10; + hw->mac.link_duplex = DUPLEX_HALF; + break; + case HALF_DUPLEX: +- pr_debug("Half Duplex specified without Speed\n"); +- pr_debug("Using Autonegotiation at Half Duplex only\n"); ++ netdev_dbg(adapter->netdev, ++ "Half Duplex specified without Speed\n"); ++ netdev_dbg(adapter->netdev, ++ "Using Autonegotiation at Half Duplex only\n"); + hw->mac.autoneg = hw->mac.fc_autoneg = 1; + hw->phy.autoneg_advertised = PHY_ADVERTISE_10_HALF | + PHY_ADVERTISE_100_HALF; +@@ -346,8 +352,10 @@ static void pch_gbe_check_copper_options + hw->mac.link_duplex = DUPLEX_HALF; + break; + case FULL_DUPLEX: +- pr_debug("Full Duplex specified without Speed\n"); +- pr_debug("Using Autonegotiation at Full Duplex only\n"); ++ netdev_dbg(adapter->netdev, ++ "Full Duplex specified without Speed\n"); ++ netdev_dbg(adapter->netdev, ++ "Using Autonegotiation at Full Duplex only\n"); + hw->mac.autoneg = hw->mac.fc_autoneg = 1; + hw->phy.autoneg_advertised = PHY_ADVERTISE_10_FULL | + PHY_ADVERTISE_100_FULL | +@@ -356,8 +364,10 @@ static void pch_gbe_check_copper_options + hw->mac.link_duplex = DUPLEX_FULL; + break; + case SPEED_10: +- pr_debug("10 Mbps Speed specified without Duplex\n"); +- pr_debug("Using Autonegotiation at 10 Mbps only\n"); ++ netdev_dbg(adapter->netdev, ++ "10 Mbps Speed specified without Duplex\n"); ++ netdev_dbg(adapter->netdev, ++ "Using Autonegotiation at 10 Mbps only\n"); + hw->mac.autoneg = hw->mac.fc_autoneg = 1; + hw->phy.autoneg_advertised = PHY_ADVERTISE_10_HALF | + PHY_ADVERTISE_10_FULL; +@@ -365,22 +375,24 @@ static void pch_gbe_check_copper_options + hw->mac.link_duplex = DUPLEX_HALF; + break; + case SPEED_10 + HALF_DUPLEX: +- pr_debug("Forcing to 10 Mbps Half Duplex\n"); ++ netdev_dbg(adapter->netdev, "Forcing to 10 Mbps Half Duplex\n"); + hw->mac.autoneg = hw->mac.fc_autoneg = 0; + hw->phy.autoneg_advertised = 0; + hw->mac.link_speed = SPEED_10; + hw->mac.link_duplex = DUPLEX_HALF; + break; + case SPEED_10 + FULL_DUPLEX: +- pr_debug("Forcing to 10 Mbps Full Duplex\n"); ++ netdev_dbg(adapter->netdev, "Forcing to 10 Mbps Full Duplex\n"); + hw->mac.autoneg = hw->mac.fc_autoneg = 0; + hw->phy.autoneg_advertised = 0; + hw->mac.link_speed = SPEED_10; + hw->mac.link_duplex = DUPLEX_FULL; + break; + case SPEED_100: +- pr_debug("100 Mbps Speed specified without Duplex\n"); +- pr_debug("Using Autonegotiation at 100 Mbps only\n"); ++ netdev_dbg(adapter->netdev, ++ "100 Mbps Speed specified without Duplex\n"); ++ netdev_dbg(adapter->netdev, ++ "Using Autonegotiation at 100 Mbps only\n"); + hw->mac.autoneg = hw->mac.fc_autoneg = 1; + hw->phy.autoneg_advertised = PHY_ADVERTISE_100_HALF | + PHY_ADVERTISE_100_FULL; +@@ -388,28 +400,33 @@ static void pch_gbe_check_copper_options + hw->mac.link_duplex = DUPLEX_HALF; + break; + case SPEED_100 + HALF_DUPLEX: +- pr_debug("Forcing to 100 Mbps Half Duplex\n"); ++ netdev_dbg(adapter->netdev, ++ "Forcing to 100 Mbps Half Duplex\n"); + hw->mac.autoneg = hw->mac.fc_autoneg = 0; + hw->phy.autoneg_advertised = 0; + hw->mac.link_speed = SPEED_100; + hw->mac.link_duplex = DUPLEX_HALF; + break; + case SPEED_100 + FULL_DUPLEX: +- pr_debug("Forcing to 100 Mbps Full Duplex\n"); ++ netdev_dbg(adapter->netdev, ++ "Forcing to 100 Mbps Full Duplex\n"); + hw->mac.autoneg = hw->mac.fc_autoneg = 0; + hw->phy.autoneg_advertised = 0; + hw->mac.link_speed = SPEED_100; + hw->mac.link_duplex = DUPLEX_FULL; + break; + case SPEED_1000: +- pr_debug("1000 Mbps Speed specified without Duplex\n"); ++ netdev_dbg(adapter->netdev, ++ "1000 Mbps Speed specified without Duplex\n"); + goto full_duplex_only; + case SPEED_1000 + HALF_DUPLEX: +- pr_debug("Half Duplex is not supported at 1000 Mbps\n"); ++ netdev_dbg(adapter->netdev, ++ "Half Duplex is not supported at 1000 Mbps\n"); + /* fall through */ + case SPEED_1000 + FULL_DUPLEX: + full_duplex_only: +- pr_debug("Using Autonegotiation at 1000 Mbps Full Duplex only\n"); ++ netdev_dbg(adapter->netdev, ++ "Using Autonegotiation at 1000 Mbps Full Duplex only\n"); + hw->mac.autoneg = hw->mac.fc_autoneg = 1; + hw->phy.autoneg_advertised = PHY_ADVERTISE_1000_FULL; + hw->mac.link_speed = SPEED_1000; +--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c ++++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c +@@ -97,6 +97,7 @@ + */ + s32 pch_gbe_phy_get_id(struct pch_gbe_hw *hw) + { ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); + struct pch_gbe_phy_info *phy = &hw->phy; + s32 ret; + u16 phy_id1; +@@ -115,8 +116,9 @@ s32 pch_gbe_phy_get_id(struct pch_gbe_hw + phy->id = (u32)phy_id1; + phy->id = ((phy->id << 6) | ((phy_id2 & 0xFC00) >> 10)); + phy->revision = (u32) (phy_id2 & 0x000F); +- pr_debug("phy->id : 0x%08x phy->revision : 0x%08x\n", +- phy->id, phy->revision); ++ netdev_dbg(adapter->netdev, ++ "phy->id : 0x%08x phy->revision : 0x%08x\n", ++ phy->id, phy->revision); + return 0; + } + +@@ -134,7 +136,10 @@ s32 pch_gbe_phy_read_reg_miic(struct pch + struct pch_gbe_phy_info *phy = &hw->phy; + + if (offset > PHY_MAX_REG_ADDRESS) { +- pr_err("PHY Address %d is out of range\n", offset); ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); ++ ++ netdev_err(adapter->netdev, "PHY Address %d is out of range\n", ++ offset); + return -EINVAL; + } + *data = pch_gbe_mac_ctrl_miim(hw, phy->addr, PCH_GBE_HAL_MIIM_READ, +@@ -156,7 +161,10 @@ s32 pch_gbe_phy_write_reg_miic(struct pc + struct pch_gbe_phy_info *phy = &hw->phy; + + if (offset > PHY_MAX_REG_ADDRESS) { +- pr_err("PHY Address %d is out of range\n", offset); ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); ++ ++ netdev_err(adapter->netdev, "PHY Address %d is out of range\n", ++ offset); + return -EINVAL; + } + pch_gbe_mac_ctrl_miim(hw, phy->addr, PCH_GBE_HAL_MIIM_WRITE, +@@ -246,15 +254,14 @@ inline void pch_gbe_phy_set_rgmii(struct + */ + void pch_gbe_phy_init_setting(struct pch_gbe_hw *hw) + { +- struct pch_gbe_adapter *adapter; ++ struct pch_gbe_adapter *adapter = pch_gbe_hw_to_adapter(hw); + struct ethtool_cmd cmd = { .cmd = ETHTOOL_GSET }; + int ret; + u16 mii_reg; + +- adapter = container_of(hw, struct pch_gbe_adapter, hw); + ret = mii_ethtool_gset(&adapter->mii, &cmd); + if (ret) +- pr_err("Error: mii_ethtool_gset\n"); ++ netdev_err(adapter->netdev, "Error: mii_ethtool_gset\n"); + + ethtool_cmd_speed_set(&cmd, hw->mac.link_speed); + cmd.duplex = hw->mac.link_duplex; +@@ -263,7 +270,7 @@ void pch_gbe_phy_init_setting(struct pch + pch_gbe_phy_write_reg_miic(hw, MII_BMCR, BMCR_RESET); + ret = mii_ethtool_sset(&adapter->mii, &cmd); + if (ret) +- pr_err("Error: mii_ethtool_sset\n"); ++ netdev_err(adapter->netdev, "Error: mii_ethtool_sset\n"); + + pch_gbe_phy_sw_reset(hw); + diff --git a/patches.minnowboard/pch_gbe-use-managed-functions-pcim_-and-devm_.patch b/patches.minnowboard/pch_gbe-use-managed-functions-pcim_-and-devm_.patch new file mode 100644 index 00000000000000..90f6a436631963 --- /dev/null +++ b/patches.minnowboard/pch_gbe-use-managed-functions-pcim_-and-devm_.patch @@ -0,0 +1,144 @@ +From 29cc436cb90da4cabf404d8ceedc762fc7387b15 Mon Sep 17 00:00:00 2001 +From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> +Date: Fri, 28 Jun 2013 14:02:54 +0300 +Subject: pch_gbe: use managed functions pcim_* and devm_* + +From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> + +commit 29cc436cb90da4cabf404d8ceedc762fc7387b15 upstream. + +This makes the error handling much more simpler than open-coding everything and +in addition makes the probe function smaller an tidier. + +Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | 50 +++++-------------- + 1 file changed, 15 insertions(+), 35 deletions(-) + +--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c ++++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c +@@ -636,15 +636,15 @@ static void pch_gbe_mac_set_pause_packet + */ + static int pch_gbe_alloc_queues(struct pch_gbe_adapter *adapter) + { +- adapter->tx_ring = kzalloc(sizeof(*adapter->tx_ring), GFP_KERNEL); ++ adapter->tx_ring = devm_kzalloc(&adapter->pdev->dev, ++ sizeof(*adapter->tx_ring), GFP_KERNEL); + if (!adapter->tx_ring) + return -ENOMEM; + +- adapter->rx_ring = kzalloc(sizeof(*adapter->rx_ring), GFP_KERNEL); +- if (!adapter->rx_ring) { +- kfree(adapter->tx_ring); ++ adapter->rx_ring = devm_kzalloc(&adapter->pdev->dev, ++ sizeof(*adapter->rx_ring), GFP_KERNEL); ++ if (!adapter->rx_ring) + return -ENOMEM; +- } + return 0; + } + +@@ -2588,13 +2588,7 @@ static void pch_gbe_remove(struct pci_de + + pch_gbe_hal_phy_hw_reset(&adapter->hw); + +- kfree(adapter->tx_ring); +- kfree(adapter->rx_ring); +- +- iounmap(adapter->hw.reg); +- pci_release_regions(pdev); + free_netdev(netdev); +- pci_disable_device(pdev); + } + + static int pch_gbe_probe(struct pci_dev *pdev, +@@ -2604,7 +2598,7 @@ static int pch_gbe_probe(struct pci_dev + struct pch_gbe_adapter *adapter; + int ret; + +- ret = pci_enable_device(pdev); ++ ret = pcim_enable_device(pdev); + if (ret) + return ret; + +@@ -2617,24 +2611,22 @@ static int pch_gbe_probe(struct pci_dev + if (ret) { + dev_err(&pdev->dev, "ERR: No usable DMA " + "configuration, aborting\n"); +- goto err_disable_device; ++ return ret; + } + } + } + +- ret = pci_request_regions(pdev, KBUILD_MODNAME); ++ ret = pcim_iomap_regions(pdev, 1 << PCH_GBE_PCI_BAR, pci_name(pdev)); + if (ret) { + dev_err(&pdev->dev, + "ERR: Can't reserve PCI I/O and memory resources\n"); +- goto err_disable_device; ++ return ret; + } + pci_set_master(pdev); + + netdev = alloc_etherdev((int)sizeof(struct pch_gbe_adapter)); +- if (!netdev) { +- ret = -ENOMEM; +- goto err_release_pci; +- } ++ if (!netdev) ++ return -ENOMEM; + SET_NETDEV_DEV(netdev, &pdev->dev); + + pci_set_drvdata(pdev, netdev); +@@ -2642,18 +2634,14 @@ static int pch_gbe_probe(struct pci_dev + adapter->netdev = netdev; + adapter->pdev = pdev; + adapter->hw.back = adapter; +- adapter->hw.reg = pci_iomap(pdev, PCH_GBE_PCI_BAR, 0); +- if (!adapter->hw.reg) { +- ret = -EIO; +- dev_err(&pdev->dev, "Can't ioremap\n"); +- goto err_free_netdev; +- } ++ adapter->hw.reg = pcim_iomap_table(pdev)[PCH_GBE_PCI_BAR]; + + adapter->ptp_pdev = pci_get_bus_and_slot(adapter->pdev->bus->number, + PCI_DEVFN(12, 4)); + if (ptp_filter_init(ptp_filter, ARRAY_SIZE(ptp_filter))) { + dev_err(&pdev->dev, "Bad ptp filter\n"); +- return -EINVAL; ++ ret = -EINVAL; ++ goto err_free_netdev; + } + + netdev->netdev_ops = &pch_gbe_netdev_ops; +@@ -2671,7 +2659,7 @@ static int pch_gbe_probe(struct pci_dev + /* setup the private structure */ + ret = pch_gbe_sw_init(adapter); + if (ret) +- goto err_iounmap; ++ goto err_free_netdev; + + /* Initialize PHY */ + ret = pch_gbe_init_phy(adapter); +@@ -2727,16 +2715,8 @@ static int pch_gbe_probe(struct pci_dev + + err_free_adapter: + pch_gbe_hal_phy_hw_reset(&adapter->hw); +- kfree(adapter->tx_ring); +- kfree(adapter->rx_ring); +-err_iounmap: +- iounmap(adapter->hw.reg); + err_free_netdev: + free_netdev(netdev); +-err_release_pci: +- pci_release_regions(pdev); +-err_disable_device: +- pci_disable_device(pdev); + return ret; + } + diff --git a/patches.minnowboard/pch_gbe-use-pch_gbe_phy_regs_len-instead-of-32.patch b/patches.minnowboard/pch_gbe-use-pch_gbe_phy_regs_len-instead-of-32.patch new file mode 100644 index 00000000000000..62a4d1f017f61e --- /dev/null +++ b/patches.minnowboard/pch_gbe-use-pch_gbe_phy_regs_len-instead-of-32.patch @@ -0,0 +1,35 @@ +From b04d68ebb04aa2d4ab9392c5353a53c81be7b847 Mon Sep 17 00:00:00 2001 +From: Darren Hart <dvhart@linux.intel.com> +Date: Sat, 18 May 2013 14:45:55 -0700 +Subject: pch_gbe: Use PCH_GBE_PHY_REGS_LEN instead of 32 + +From: Darren Hart <dvhart@linux.intel.com> + +commit b04d68ebb04aa2d4ab9392c5353a53c81be7b847 upstream. + +Avoid using magic numbers when we have perfectly good defines just lying +around. + +Signed-off-by: Darren Hart <dvhart@linux.intel.com> +Cc: "David S. Miller" <davem@davemloft.net> +Cc: "H. Peter Anvin" <hpa@zytor.com> +Cc: Peter Waskiewicz <peter.p.waskiewicz.jr@intel.com> +Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com> +Cc: netdev@vger.kernel.org +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c ++++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c +@@ -682,7 +682,7 @@ static int pch_gbe_init_phy(struct pch_g + } + adapter->hw.phy.addr = adapter->mii.phy_id; + netdev_dbg(netdev, "phy_addr = %d\n", adapter->mii.phy_id); +- if (addr == 32) ++ if (addr == PCH_GBE_PHY_REGS_LEN) + return -EAGAIN; + /* Selected the phy and isolate the rest */ + for (addr = 0; addr < PCH_GBE_PHY_REGS_LEN; addr++) { diff --git a/patches.minnowboard/pch_uart-use-dmi-interface-for-board-detection.patch b/patches.minnowboard/pch_uart-use-dmi-interface-for-board-detection.patch new file mode 100644 index 00000000000000..8c33bd7fcb53b1 --- /dev/null +++ b/patches.minnowboard/pch_uart-use-dmi-interface-for-board-detection.patch @@ -0,0 +1,107 @@ +From 4e3234897fbc4c83286f3cd3105d38b26634812d Mon Sep 17 00:00:00 2001 +From: Darren Hart <dvhart@linux.intel.com> +Date: Fri, 12 Jul 2013 17:58:05 -0700 +Subject: pch_uart: Use DMI interface for board detection + +From: Darren Hart <dvhart@linux.intel.com> + +commit 4e3234897fbc4c83286f3cd3105d38b26634812d upstream. + +Use the DMI interface rather than manually matching DMI strings. + +Signed-off-by: Darren Hart <dvhart@linux.intel.com> +Cc: Michael Brunner <mibru@gmx.de> +Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/tty/serial/pch_uart.c | 71 ++++++++++++++++++++++++++++-------------- + 1 file changed, 49 insertions(+), 22 deletions(-) + +--- a/drivers/tty/serial/pch_uart.c ++++ b/drivers/tty/serial/pch_uart.c +@@ -373,35 +373,62 @@ static const struct file_operations port + }; + #endif /* CONFIG_DEBUG_FS */ + ++static struct dmi_system_id __initdata pch_uart_dmi_table[] = { ++ { ++ .ident = "CM-iTC", ++ { ++ DMI_MATCH(DMI_BOARD_NAME, "CM-iTC"), ++ }, ++ (void *)CMITC_UARTCLK, ++ }, ++ { ++ .ident = "FRI2", ++ { ++ DMI_MATCH(DMI_BIOS_VERSION, "FRI2"), ++ }, ++ (void *)FRI2_64_UARTCLK, ++ }, ++ { ++ .ident = "Fish River Island II", ++ { ++ DMI_MATCH(DMI_PRODUCT_NAME, "Fish River Island II"), ++ }, ++ (void *)FRI2_48_UARTCLK, ++ }, ++ { ++ .ident = "COMe-mTT", ++ { ++ DMI_MATCH(DMI_BOARD_NAME, "COMe-mTT"), ++ }, ++ (void *)NTC1_UARTCLK, ++ }, ++ { ++ .ident = "nanoETXexpress-TT", ++ { ++ DMI_MATCH(DMI_BOARD_NAME, "nanoETXexpress-TT"), ++ }, ++ (void *)NTC1_UARTCLK, ++ }, ++ { ++ .ident = "MinnowBoard", ++ { ++ DMI_MATCH(DMI_BOARD_NAME, "MinnowBoard"), ++ }, ++ (void *)MINNOW_UARTCLK, ++ }, ++}; ++ + /* Return UART clock, checking for board specific clocks. */ + static int pch_uart_get_uartclk(void) + { +- const char *cmp; ++ const struct dmi_system_id *d; + + if (user_uartclk) + return user_uartclk; + +- cmp = dmi_get_system_info(DMI_BOARD_NAME); +- if (cmp && strstr(cmp, "CM-iTC")) +- return CMITC_UARTCLK; +- +- cmp = dmi_get_system_info(DMI_BIOS_VERSION); +- if (cmp && strnstr(cmp, "FRI2", 4)) +- return FRI2_64_UARTCLK; +- +- cmp = dmi_get_system_info(DMI_PRODUCT_NAME); +- if (cmp && strstr(cmp, "Fish River Island II")) +- return FRI2_48_UARTCLK; +- +- /* Kontron COMe-mTT10 (nanoETXexpress-TT) */ +- cmp = dmi_get_system_info(DMI_BOARD_NAME); +- if (cmp && (strstr(cmp, "COMe-mTT") || +- strstr(cmp, "nanoETXexpress-TT"))) +- return NTC1_UARTCLK; +- +- cmp = dmi_get_system_info(DMI_BOARD_NAME); +- if (cmp && strstr(cmp, "MinnowBoard")) +- return MINNOW_UARTCLK; ++ d = dmi_first_match(pch_uart_dmi_table); ++ if (d) ++ return (int)d->driver_data; + + return DEFAULT_UARTCLK; + } diff --git a/patches.minnowboard/pci-add-circuitco-vendor-id-and-subsystem-id.patch b/patches.minnowboard/pci-add-circuitco-vendor-id-and-subsystem-id.patch new file mode 100644 index 00000000000000..04ee87538ce517 --- /dev/null +++ b/patches.minnowboard/pci-add-circuitco-vendor-id-and-subsystem-id.patch @@ -0,0 +1,33 @@ +From 91bbe923d18cfff4286a84e59b9d5b61389c3027 Mon Sep 17 00:00:00 2001 +From: Darren Hart <dvhart@linux.intel.com> +Date: Tue, 25 Jun 2013 20:08:46 -0600 +Subject: PCI: Add CircuitCo vendor ID and subsystem ID + +From: Darren Hart <dvhart@linux.intel.com> + +commit 91bbe923d18cfff4286a84e59b9d5b61389c3027 upstream. + +Add CircuitCo's newly created VENDOR ID and their first board subsystem +ID for the MinnowBoard. + +[bhelgaas: sort, change DEVICE_ID to SUBSYSTEM_ID] +Signed-off-by: Darren Hart <dvhart@linux.intel.com> +Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + include/linux/pci_ids.h | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/include/linux/pci_ids.h ++++ b/include/linux/pci_ids.h +@@ -2478,6 +2478,9 @@ + + #define PCI_VENDOR_ID_ASMEDIA 0x1b21 + ++#define PCI_VENDOR_ID_CIRCUITCO 0x1cc8 ++#define PCI_SUBSYSTEM_ID_CIRCUITCO_MINNOWBOARD 0x0001 ++ + #define PCI_VENDOR_ID_TEKRAM 0x1de1 + #define PCI_DEVICE_ID_TEKRAM_DC290 0xdc29 + diff --git a/patches.minnowboard/serial-pch_uart-fix-compilation-warning.patch b/patches.minnowboard/serial-pch_uart-fix-compilation-warning.patch new file mode 100644 index 00000000000000..3e78a7f6995cce --- /dev/null +++ b/patches.minnowboard/serial-pch_uart-fix-compilation-warning.patch @@ -0,0 +1,41 @@ +From 09a5163f5c0eb0944f3a2c219acd75933f74fda2 Mon Sep 17 00:00:00 2001 +From: Luis Henriques <luis.henriques@canonical.com> +Date: Wed, 14 Aug 2013 23:18:37 +0100 +Subject: serial: pch_uart: fix compilation warning + +From: Luis Henriques <luis.henriques@canonical.com> + +commit 09a5163f5c0eb0944f3a2c219acd75933f74fda2 upstream. + +Function wait_for_xmitr is invoked only on functions that either depend +on CONFIG_CONSOLE_POLL or CONFIG_SERIAL_PCH_UART_CONSOLE. + +This patch fixes the following warning: + +drivers/tty/serial/pch_uart.c:1504:13: warning: ‘wait_for_xmitr’ defined but not used [-Wunused-function] + +Signed-off-by: Luis Henriques <luis.henriques@canonical.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/tty/serial/pch_uart.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/tty/serial/pch_uart.c ++++ b/drivers/tty/serial/pch_uart.c +@@ -1527,6 +1527,7 @@ static int pch_uart_verify_port(struct u + return 0; + } + ++#if defined(CONFIG_CONSOLE_POLL) || defined(CONFIG_SERIAL_PCH_UART_CONSOLE) + /* + * Wait for transmitter & holding register to empty + */ +@@ -1557,6 +1558,7 @@ static void wait_for_xmitr(struct eg20t_ + } + } + } ++#endif /* CONFIG_CONSOLE_POLL || CONFIG_SERIAL_PCH_UART_CONSOLE */ + + #ifdef CONFIG_CONSOLE_POLL + /* diff --git a/patches.minnowboard/serial-pch_uart-fix-signed-ness-and-casting-of-uartclk-related-fields.patch b/patches.minnowboard/serial-pch_uart-fix-signed-ness-and-casting-of-uartclk-related-fields.patch new file mode 100644 index 00000000000000..dc62bd60ffdaed --- /dev/null +++ b/patches.minnowboard/serial-pch_uart-fix-signed-ness-and-casting-of-uartclk-related-fields.patch @@ -0,0 +1,86 @@ +From e26439ce03f0808f5d797ca33f180fdb8258335a Mon Sep 17 00:00:00 2001 +From: Darren Hart <dvhart@linux.intel.com> +Date: Mon, 29 Jul 2013 15:15:07 -0700 +Subject: serial: pch_uart: Fix signed-ness and casting of uartclk related fields + +From: Darren Hart <dvhart@linux.intel.com> + +commit e26439ce03f0808f5d797ca33f180fdb8258335a upstream. + +Storing one struct per known board would be overkill. Pre-cast the +driver_data pointer to an unsigned long to avoid the pointer to int +compiler warning: + +drivers/tty/serial/pch_uart.c:431:10: warning: cast from pointer to +integer of different size [-Wpointer-to-int-cast] + +Unify the signed-ness of the baud and uartclk types throughout the +driver. + +Signed-off-by: Darren Hart <dvhart@linux.intel.com> +Reported-by: kbuild test robot <fengguang.wu@intel.com> +Cc: Jiri Slaby <jslaby@suse.cz> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/tty/serial/pch_uart.c | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +--- a/drivers/tty/serial/pch_uart.c ++++ b/drivers/tty/serial/pch_uart.c +@@ -232,7 +232,7 @@ struct eg20t_port { + unsigned int iobase; + struct pci_dev *pdev; + int fifo_size; +- int uartclk; ++ unsigned int uartclk; + int start_tx; + int start_rx; + int tx_empty; +@@ -419,7 +419,7 @@ static struct dmi_system_id pch_uart_dmi + }; + + /* Return UART clock, checking for board specific clocks. */ +-static int pch_uart_get_uartclk(void) ++static unsigned int pch_uart_get_uartclk(void) + { + const struct dmi_system_id *d; + +@@ -428,7 +428,7 @@ static int pch_uart_get_uartclk(void) + + d = dmi_first_match(pch_uart_dmi_table); + if (d) +- return (int)d->driver_data; ++ return (unsigned long)d->driver_data; + + return DEFAULT_UARTCLK; + } +@@ -449,7 +449,7 @@ static void pch_uart_hal_disable_interru + iowrite8(ier, priv->membase + UART_IER); + } + +-static int pch_uart_hal_set_line(struct eg20t_port *priv, int baud, ++static int pch_uart_hal_set_line(struct eg20t_port *priv, unsigned int baud, + unsigned int parity, unsigned int bits, + unsigned int stb) + { +@@ -484,7 +484,7 @@ static int pch_uart_hal_set_line(struct + lcr |= bits; + lcr |= stb; + +- dev_dbg(priv->port.dev, "%s:baud = %d, div = %04x, lcr = %02x (%lu)\n", ++ dev_dbg(priv->port.dev, "%s:baud = %u, div = %04x, lcr = %02x (%lu)\n", + __func__, baud, div, lcr, jiffies); + iowrite8(PCH_UART_LCR_DLAB, priv->membase + UART_LCR); + iowrite8(dll, priv->membase + PCH_UART_DLL); +@@ -1393,9 +1393,8 @@ static void pch_uart_shutdown(struct uar + static void pch_uart_set_termios(struct uart_port *port, + struct ktermios *termios, struct ktermios *old) + { +- int baud; + int rtn; +- unsigned int parity, bits, stb; ++ unsigned int baud, parity, bits, stb; + struct eg20t_port *priv; + unsigned long flags; + diff --git a/patches.minnowboard/serial-pch_uart-remove-__initdata-annotation-from-dmi_table.patch b/patches.minnowboard/serial-pch_uart-remove-__initdata-annotation-from-dmi_table.patch new file mode 100644 index 00000000000000..c81ff9142e49f8 --- /dev/null +++ b/patches.minnowboard/serial-pch_uart-remove-__initdata-annotation-from-dmi_table.patch @@ -0,0 +1,37 @@ +From 0a09ae98eade956bbc681cb905584effe4a1ed95 Mon Sep 17 00:00:00 2001 +From: Darren Hart <dvhart@linux.intel.com> +Date: Mon, 29 Jul 2013 09:58:14 -0700 +Subject: serial: pch_uart: Remove __initdata annotation from dmi_table + +From: Darren Hart <dvhart@linux.intel.com> + +commit 0a09ae98eade956bbc681cb905584effe4a1ed95 upstream. + +The dmi_table is best accessed from the probe function, which is not +an __init function. Drop the __initdata annotation from the dmi_table +to avoid the section mismatch compiler warnings: + +WARNING: drivers/tty/serial/pch_uart.o(.text+0x4871): Section mismatch +in reference from the function pch_uart_init_port() to the variable +.init.data:pch_uart_dmi_table + +Signed-off-by: Darren Hart <dvhart@linux.intel.com> +Reported-by: kbuild test robot <fengguang.wu@intel.com> +Cc: Jiri Slaby <jslaby@suse.cz> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/tty/serial/pch_uart.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/tty/serial/pch_uart.c ++++ b/drivers/tty/serial/pch_uart.c +@@ -373,7 +373,7 @@ static const struct file_operations port + }; + #endif /* CONFIG_DEBUG_FS */ + +-static struct dmi_system_id __initdata pch_uart_dmi_table[] = { ++static struct dmi_system_id pch_uart_dmi_table[] = { + { + .ident = "CM-iTC", + { @@ -2542,6 +2542,20 @@ patches.zynq/i2c-si570-merge-support-for-si570-clock-generator.patch ############################################################################# +# MinnowBoard patches +# +patches.minnowboard/pch_uart-use-dmi-interface-for-board-detection.patch +patches.minnowboard/serial-pch_uart-remove-__initdata-annotation-from-dmi_table.patch +patches.minnowboard/serial-pch_uart-fix-signed-ness-and-casting-of-uartclk-related-fields.patch +patches.minnowboard/serial-pch_uart-fix-compilation-warning.patch +patches.minnowboard/pch_gbe-convert-pr_-to-netdev_.patch +patches.minnowboard/pch_gbe-use-managed-functions-pcim_-and-devm_.patch +patches.minnowboard/pch_gbe-use-pch_gbe_phy_regs_len-instead-of-32.patch +patches.minnowboard/pci-add-circuitco-vendor-id-and-subsystem-id.patch +patches.minnowboard/pch_gbe-add-minnowboard-support.patch + + +############################################################################# # fixes that go after all of the above # |