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:
Heiner Kallweit 2021-08-18 21:04:37 +02:00 коммит произвёл Bjorn Helgaas
Родитель 37838aa437
Коммит f240e15097
2 изменённых файлов: 10 добавлений и 18 удалений

Просмотреть файл

@ -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