mirror of
https://github.com/torvalds/linux.git
synced 2024-12-03 01:21:28 +00:00
net: usb: pegasus: Proper error handing when setting pegasus' MAC address
v2: If reading the MAC address from eeprom fail don't throw an error, use randomly generated MAC instead. Either way the adapter will soldier on and the return type of set_ethernet_addr() can be reverted to void. v1: Fix a bug in set_ethernet_addr() which does not take into account possible errors (or partial reads) returned by its helpers. This can potentially lead to writing random data into device's MAC address registers. Signed-off-by: Petko Manolov <petko.manolov@konsulko.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a93bdcb94a
commit
f30e25a9d1
@ -360,28 +360,47 @@ fail:
|
||||
}
|
||||
#endif /* PEGASUS_WRITE_EEPROM */
|
||||
|
||||
static inline void get_node_id(pegasus_t *pegasus, __u8 *id)
|
||||
static inline int get_node_id(pegasus_t *pegasus, u8 *id)
|
||||
{
|
||||
int i;
|
||||
__u16 w16;
|
||||
int i, ret;
|
||||
u16 w16;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
read_eprom_word(pegasus, i, &w16);
|
||||
ret = read_eprom_word(pegasus, i, &w16);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
((__le16 *) id)[i] = cpu_to_le16(w16);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void set_ethernet_addr(pegasus_t *pegasus)
|
||||
{
|
||||
__u8 node_id[6];
|
||||
int ret;
|
||||
u8 node_id[6];
|
||||
|
||||
if (pegasus->features & PEGASUS_II) {
|
||||
get_registers(pegasus, 0x10, sizeof(node_id), node_id);
|
||||
ret = get_registers(pegasus, 0x10, sizeof(node_id), node_id);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
} else {
|
||||
get_node_id(pegasus, node_id);
|
||||
set_registers(pegasus, EthID, sizeof(node_id), node_id);
|
||||
ret = get_node_id(pegasus, node_id);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
ret = set_registers(pegasus, EthID, sizeof(node_id), node_id);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
}
|
||||
|
||||
memcpy(pegasus->net->dev_addr, node_id, sizeof(node_id));
|
||||
|
||||
return;
|
||||
err:
|
||||
eth_hw_addr_random(pegasus->net);
|
||||
dev_info(&pegasus->intf->dev, "software assigned MAC address.\n");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static inline int reset_mac(pegasus_t *pegasus)
|
||||
|
Loading…
Reference in New Issue
Block a user