From patchwork Mon Oct 13 20:13:08 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: stephen hemminger X-Patchwork-Id: 4349 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id 77E4BDDE26 for ; Tue, 14 Oct 2008 08:04:41 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755886AbYJMVEg (ORCPT ); Mon, 13 Oct 2008 17:04:36 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755856AbYJMVEf (ORCPT ); Mon, 13 Oct 2008 17:04:35 -0400 Received: from suva.vyatta.com ([76.74.103.44]:57903 "EHLO suva.vyatta.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755773AbYJMVEe (ORCPT ); Mon, 13 Oct 2008 17:04:34 -0400 Received: from suva.vyatta.com (suva [127.0.0.1]) by suva.vyatta.com (8.13.7/8.13.7) with ESMTP id m9DL3cYk010569; Mon, 13 Oct 2008 14:03:38 -0700 Received: (from shemminger@localhost) by suva.vyatta.com (8.13.7/8.13.7/Submit) id m9DL3bva010568; Mon, 13 Oct 2008 14:03:37 -0700 Message-Id: <20081013201453.165280813@vyatta.com> References: <20081013201302.899587376@vyatta.com> User-Agent: quilt/0.46-1 Date: Mon, 13 Oct 2008 13:13:08 -0700 From: Stephen Hemminger To: David Miller , Jeff Garzik Cc: netdev@vger.kernel.org, linux-pci@vger.kernel.org Subject: [PATCH 6/9] sky2: remove eeprom interface Content-Disposition: inline; filename=sky2-no-eeprom.patch Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The VPD is not really the firmware EEPROM. The real EEPROM is behind an SPI interface, that maybe supported in later version. Programming the VPD through the ethtool interface doesn't work (doesn't really change firmware). Now that the interesting bits are available through the debug interface and raw data is available through sysfs, the old ethtool eeprom interface can go. Signed-off-by: Stephen Hemminger --- a/drivers/net/sky2.c 2008-09-09 11:19:26.000000000 -0700 +++ b/drivers/net/sky2.c 2008-09-09 11:19:30.000000000 -0700 @@ -75,8 +75,6 @@ #define NAPI_WEIGHT 64 #define PHY_RETRIES 1000 -#define SKY2_EEPROM_MAGIC 0x9955aabb - #define RING_NEXT(x,s) (((x)+1) & ((s)-1)) @@ -3722,109 +3720,6 @@ static int sky2_set_tso(struct net_devic return ethtool_op_set_tso(dev, data); } -static int sky2_get_eeprom_len(struct net_device *dev) -{ - struct sky2_port *sky2 = netdev_priv(dev); - struct sky2_hw *hw = sky2->hw; - u16 reg2; - - reg2 = sky2_pci_read16(hw, PCI_DEV_REG2); - return 1 << ( ((reg2 & PCI_VPD_ROM_SZ) >> 14) + 8); -} - -static int sky2_vpd_wait(const struct sky2_hw *hw, int cap, u16 busy) -{ - unsigned long start = jiffies; - - while ( (sky2_pci_read16(hw, cap + PCI_VPD_ADDR) & PCI_VPD_ADDR_F) == busy) { - /* Can take up to 10.6 ms for write */ - if (time_after(jiffies, start + HZ/4)) { - dev_err(&hw->pdev->dev, PFX "VPD cycle timed out"); - return -ETIMEDOUT; - } - mdelay(1); - } - - return 0; -} - -static int sky2_vpd_read(struct sky2_hw *hw, int cap, void *data, - u16 offset, size_t length) -{ - int rc = 0; - - while (length > 0) { - u32 val; - - sky2_pci_write16(hw, cap + PCI_VPD_ADDR, offset); - rc = sky2_vpd_wait(hw, cap, 0); - if (rc) - break; - - val = sky2_pci_read32(hw, cap + PCI_VPD_DATA); - - memcpy(data, &val, min(sizeof(val), length)); - offset += sizeof(u32); - data += sizeof(u32); - length -= sizeof(u32); - } - - return rc; -} - -static int sky2_vpd_write(struct sky2_hw *hw, int cap, const void *data, - u16 offset, unsigned int length) -{ - unsigned int i; - int rc = 0; - - for (i = 0; i < length; i += sizeof(u32)) { - u32 val = *(u32 *)(data + i); - - sky2_pci_write32(hw, cap + PCI_VPD_DATA, val); - sky2_pci_write32(hw, cap + PCI_VPD_ADDR, offset | PCI_VPD_ADDR_F); - - rc = sky2_vpd_wait(hw, cap, PCI_VPD_ADDR_F); - if (rc) - break; - } - return rc; -} - -static int sky2_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, - u8 *data) -{ - struct sky2_port *sky2 = netdev_priv(dev); - int cap = pci_find_capability(sky2->hw->pdev, PCI_CAP_ID_VPD); - - if (!cap) - return -EINVAL; - - eeprom->magic = SKY2_EEPROM_MAGIC; - - return sky2_vpd_read(sky2->hw, cap, data, eeprom->offset, eeprom->len); -} - -static int sky2_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, - u8 *data) -{ - struct sky2_port *sky2 = netdev_priv(dev); - int cap = pci_find_capability(sky2->hw->pdev, PCI_CAP_ID_VPD); - - if (!cap) - return -EINVAL; - - if (eeprom->magic != SKY2_EEPROM_MAGIC) - return -EINVAL; - - /* Partial writes not supported */ - if ((eeprom->offset & 3) || (eeprom->len & 3)) - return -EINVAL; - - return sky2_vpd_write(sky2->hw, cap, data, eeprom->offset, eeprom->len); -} - - static const struct ethtool_ops sky2_ethtool_ops = { .get_settings = sky2_get_settings, .set_settings = sky2_set_settings, @@ -3837,9 +3732,6 @@ static const struct ethtool_ops sky2_eth .get_regs_len = sky2_get_regs_len, .get_regs = sky2_get_regs, .get_link = ethtool_op_get_link, - .get_eeprom_len = sky2_get_eeprom_len, - .get_eeprom = sky2_get_eeprom, - .set_eeprom = sky2_set_eeprom, .set_sg = ethtool_op_set_sg, .set_tx_csum = sky2_set_tx_csum, .set_tso = sky2_set_tso,