tg3: Read VPD with pci_vpd_alloc()
Use pci_vpd_alloc() to dynamically allocate a properly sized buffer and read the full VPD data into it. This simplifies the code, and we no longer have to make assumptions about VPD size. Link: https://lore.kernel.org/r/bd3cd19c-b74f-9704-5786-476bf35ab5de@gmail.com Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
Родитель
37838aa437
Коммит
f240e15097
|
@ -12791,7 +12791,7 @@ static void tg3_get_ethtool_stats(struct net_device *dev,
|
||||||
memset(tmp_stats, 0, sizeof(struct tg3_ethtool_stats));
|
memset(tmp_stats, 0, sizeof(struct tg3_ethtool_stats));
|
||||||
}
|
}
|
||||||
|
|
||||||
static __be32 *tg3_vpd_readblock(struct tg3 *tp, u32 *vpdlen)
|
static __be32 *tg3_vpd_readblock(struct tg3 *tp, unsigned int *vpdlen)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
__be32 *buf;
|
__be32 *buf;
|
||||||
|
@ -12825,15 +12825,11 @@ static __be32 *tg3_vpd_readblock(struct tg3 *tp, u32 *vpdlen)
|
||||||
offset = TG3_NVM_VPD_OFF;
|
offset = TG3_NVM_VPD_OFF;
|
||||||
len = TG3_NVM_VPD_LEN;
|
len = TG3_NVM_VPD_LEN;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
len = TG3_NVM_PCI_VPD_MAX_LEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf = kmalloc(len, GFP_KERNEL);
|
buf = kmalloc(len, GFP_KERNEL);
|
||||||
if (buf == NULL)
|
if (!buf)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (magic == TG3_EEPROM_MAGIC) {
|
|
||||||
for (i = 0; i < len; i += 4) {
|
for (i = 0; i < len; i += 4) {
|
||||||
/* The data is in little-endian format in NVRAM.
|
/* The data is in little-endian format in NVRAM.
|
||||||
* Use the big-endian read routines to preserve
|
* Use the big-endian read routines to preserve
|
||||||
|
@ -12844,12 +12840,9 @@ static __be32 *tg3_vpd_readblock(struct tg3 *tp, u32 *vpdlen)
|
||||||
}
|
}
|
||||||
*vpdlen = len;
|
*vpdlen = len;
|
||||||
} else {
|
} else {
|
||||||
ssize_t cnt;
|
buf = pci_vpd_alloc(tp->pdev, vpdlen);
|
||||||
|
if (IS_ERR(buf))
|
||||||
cnt = pci_read_vpd(tp->pdev, 0, len, (u8 *)buf);
|
return NULL;
|
||||||
if (cnt < 0)
|
|
||||||
goto error;
|
|
||||||
*vpdlen = cnt;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
|
@ -12871,9 +12864,10 @@ error:
|
||||||
|
|
||||||
static int tg3_test_nvram(struct tg3 *tp)
|
static int tg3_test_nvram(struct tg3 *tp)
|
||||||
{
|
{
|
||||||
u32 csum, magic, len;
|
u32 csum, magic;
|
||||||
__be32 *buf;
|
__be32 *buf;
|
||||||
int i, j, k, err = 0, size;
|
int i, j, k, err = 0, size;
|
||||||
|
unsigned int len;
|
||||||
|
|
||||||
if (tg3_flag(tp, NO_NVRAM))
|
if (tg3_flag(tp, NO_NVRAM))
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -15621,8 +15615,7 @@ skip_phy_reset:
|
||||||
static void tg3_read_vpd(struct tg3 *tp)
|
static void tg3_read_vpd(struct tg3 *tp)
|
||||||
{
|
{
|
||||||
u8 *vpd_data;
|
u8 *vpd_data;
|
||||||
unsigned int block_end, rosize, len;
|
unsigned int block_end, rosize, len, vpdlen;
|
||||||
u32 vpdlen;
|
|
||||||
int j, i = 0;
|
int j, i = 0;
|
||||||
|
|
||||||
vpd_data = (u8 *)tg3_vpd_readblock(tp, &vpdlen);
|
vpd_data = (u8 *)tg3_vpd_readblock(tp, &vpdlen);
|
||||||
|
|
|
@ -2101,7 +2101,6 @@
|
||||||
/* Hardware Legacy NVRAM layout */
|
/* Hardware Legacy NVRAM layout */
|
||||||
#define TG3_NVM_VPD_OFF 0x100
|
#define TG3_NVM_VPD_OFF 0x100
|
||||||
#define TG3_NVM_VPD_LEN 256
|
#define TG3_NVM_VPD_LEN 256
|
||||||
#define TG3_NVM_PCI_VPD_MAX_LEN 512
|
|
||||||
|
|
||||||
/* Hardware Selfboot NVRAM layout */
|
/* Hardware Selfboot NVRAM layout */
|
||||||
#define TG3_NVM_HWSB_CFG1 0x00000004
|
#define TG3_NVM_HWSB_CFG1 0x00000004
|
||||||
|
|
Загрузка…
Ссылка в новой задаче