cxgb3: Remove t3_seeprom_read and use VPD API
Using the VPD API allows to simplify the code and completely get rid of t3_seeprom_read(). Note that we don't have to use pci_read_vpd_any() here because a VPD quirk sets dev->vpd.len to the full EEPROM size. Tested with a T320 card. Link: https://lore.kernel.org/r/68ef15bb-b6bf-40ad-160c-aaa72c4a70f8@gmail.com Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
3331325c63
commit
48225f1878
@ -676,7 +676,6 @@ void t3_link_changed(struct adapter *adapter, int port_id);
|
||||
void t3_link_fault(struct adapter *adapter, int port_id);
|
||||
int t3_link_start(struct cphy *phy, struct cmac *mac, struct link_config *lc);
|
||||
const struct adapter_info *t3_get_adapter_info(unsigned int board_id);
|
||||
int t3_seeprom_read(struct adapter *adapter, u32 addr, __le32 *data);
|
||||
int t3_seeprom_write(struct adapter *adapter, u32 addr, __le32 data);
|
||||
int t3_seeprom_wp(struct adapter *adapter, int enable);
|
||||
int t3_get_tp_version(struct adapter *adapter, u32 *vers);
|
||||
|
@ -2036,20 +2036,16 @@ static int get_eeprom(struct net_device *dev, struct ethtool_eeprom *e,
|
||||
{
|
||||
struct port_info *pi = netdev_priv(dev);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
int i, err = 0;
|
||||
|
||||
u8 *buf = kmalloc(EEPROMSIZE, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
int cnt;
|
||||
|
||||
e->magic = EEPROM_MAGIC;
|
||||
for (i = e->offset & ~3; !err && i < e->offset + e->len; i += 4)
|
||||
err = t3_seeprom_read(adapter, i, (__le32 *) & buf[i]);
|
||||
cnt = pci_read_vpd(adapter->pdev, e->offset, e->len, data);
|
||||
if (cnt < 0)
|
||||
return cnt;
|
||||
|
||||
if (!err)
|
||||
memcpy(data, buf + e->offset, e->len);
|
||||
kfree(buf);
|
||||
return err;
|
||||
e->len = cnt;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
|
||||
@ -2072,12 +2068,9 @@ static int set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
|
||||
buf = kmalloc(aligned_len, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
err = t3_seeprom_read(adapter, aligned_offset, (__le32 *) buf);
|
||||
if (!err && aligned_len > 4)
|
||||
err = t3_seeprom_read(adapter,
|
||||
aligned_offset + aligned_len - 4,
|
||||
(__le32 *) & buf[aligned_len - 4]);
|
||||
if (err)
|
||||
err = pci_read_vpd(adapter->pdev, aligned_offset, aligned_len,
|
||||
buf);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
memcpy(buf + (eeprom->offset & 3), data, eeprom->len);
|
||||
} else
|
||||
|
@ -599,42 +599,6 @@ struct t3_vpd {
|
||||
#define EEPROM_STAT_ADDR 0x4000
|
||||
#define VPD_BASE 0xc00
|
||||
|
||||
/**
|
||||
* t3_seeprom_read - read a VPD EEPROM location
|
||||
* @adapter: adapter to read
|
||||
* @addr: EEPROM address
|
||||
* @data: where to store the read data
|
||||
*
|
||||
* Read a 32-bit word from a location in VPD EEPROM using the card's PCI
|
||||
* VPD ROM capability. A zero is written to the flag bit when the
|
||||
* address is written to the control register. The hardware device will
|
||||
* set the flag to 1 when 4 bytes have been read into the data register.
|
||||
*/
|
||||
int t3_seeprom_read(struct adapter *adapter, u32 addr, __le32 *data)
|
||||
{
|
||||
u16 val;
|
||||
int attempts = EEPROM_MAX_POLL;
|
||||
u32 v;
|
||||
unsigned int base = adapter->params.pci.vpd_cap_addr;
|
||||
|
||||
if ((addr >= EEPROMSIZE && addr != EEPROM_STAT_ADDR) || (addr & 3))
|
||||
return -EINVAL;
|
||||
|
||||
pci_write_config_word(adapter->pdev, base + PCI_VPD_ADDR, addr);
|
||||
do {
|
||||
udelay(10);
|
||||
pci_read_config_word(adapter->pdev, base + PCI_VPD_ADDR, &val);
|
||||
} while (!(val & PCI_VPD_ADDR_F) && --attempts);
|
||||
|
||||
if (!(val & PCI_VPD_ADDR_F)) {
|
||||
CH_ERR(adapter, "reading EEPROM address 0x%x failed\n", addr);
|
||||
return -EIO;
|
||||
}
|
||||
pci_read_config_dword(adapter->pdev, base + PCI_VPD_DATA, &v);
|
||||
*data = cpu_to_le32(v);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* t3_seeprom_write - write a VPD EEPROM location
|
||||
* @adapter: adapter to write
|
||||
@ -708,24 +672,22 @@ static int vpdstrtou16(char *s, u8 len, unsigned int base, u16 *val)
|
||||
*/
|
||||
static int get_vpd_params(struct adapter *adapter, struct vpd_params *p)
|
||||
{
|
||||
int i, addr, ret;
|
||||
struct t3_vpd vpd;
|
||||
u8 base_val = 0;
|
||||
int addr, ret;
|
||||
|
||||
/*
|
||||
* Card information is normally at VPD_BASE but some early cards had
|
||||
* it at 0.
|
||||
*/
|
||||
ret = t3_seeprom_read(adapter, VPD_BASE, (__le32 *)&vpd);
|
||||
if (ret)
|
||||
ret = pci_read_vpd(adapter->pdev, VPD_BASE, 1, &base_val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
addr = vpd.id_tag == 0x82 ? VPD_BASE : 0;
|
||||
addr = base_val == PCI_VPD_LRDT_ID_STRING ? VPD_BASE : 0;
|
||||
|
||||
for (i = 0; i < sizeof(vpd); i += 4) {
|
||||
ret = t3_seeprom_read(adapter, addr + i,
|
||||
(__le32 *)((u8 *)&vpd + i));
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = pci_read_vpd(adapter->pdev, addr, sizeof(vpd), &vpd);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = vpdstrtouint(vpd.cclk_data, vpd.cclk_len, 10, &p->cclk);
|
||||
if (ret)
|
||||
|
Loading…
x
Reference in New Issue
Block a user