Skip to content

Commit f30e25a

Browse files
petkomanolovdavem330
authored andcommitted
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 <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent a93bdcb commit f30e25a

File tree

1 file changed

+27
-8
lines changed

1 file changed

+27
-8
lines changed

drivers/net/usb/pegasus.c

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -360,28 +360,47 @@ static int write_eprom_word(pegasus_t *pegasus, __u8 index, __u16 data)
360360
}
361361
#endif /* PEGASUS_WRITE_EEPROM */
362362

363-
static inline void get_node_id(pegasus_t *pegasus, __u8 *id)
363+
static inline int get_node_id(pegasus_t *pegasus, u8 *id)
364364
{
365-
int i;
366-
__u16 w16;
365+
int i, ret;
366+
u16 w16;
367367

368368
for (i = 0; i < 3; i++) {
369-
read_eprom_word(pegasus, i, &w16);
369+
ret = read_eprom_word(pegasus, i, &w16);
370+
if (ret < 0)
371+
return ret;
370372
((__le16 *) id)[i] = cpu_to_le16(w16);
371373
}
374+
375+
return 0;
372376
}
373377

374378
static void set_ethernet_addr(pegasus_t *pegasus)
375379
{
376-
__u8 node_id[6];
380+
int ret;
381+
u8 node_id[6];
377382

378383
if (pegasus->features & PEGASUS_II) {
379-
get_registers(pegasus, 0x10, sizeof(node_id), node_id);
384+
ret = get_registers(pegasus, 0x10, sizeof(node_id), node_id);
385+
if (ret < 0)
386+
goto err;
380387
} else {
381-
get_node_id(pegasus, node_id);
382-
set_registers(pegasus, EthID, sizeof(node_id), node_id);
388+
ret = get_node_id(pegasus, node_id);
389+
if (ret < 0)
390+
goto err;
391+
ret = set_registers(pegasus, EthID, sizeof(node_id), node_id);
392+
if (ret < 0)
393+
goto err;
383394
}
395+
384396
memcpy(pegasus->net->dev_addr, node_id, sizeof(node_id));
397+
398+
return;
399+
err:
400+
eth_hw_addr_random(pegasus->net);
401+
dev_info(&pegasus->intf->dev, "software assigned MAC address.\n");
402+
403+
return;
385404
}
386405

387406
static inline int reset_mac(pegasus_t *pegasus)

0 commit comments

Comments
 (0)