Просмотр исходного кода

[smsc95xx] Allow for multiple methods for obtaining the MAC address

The SMSC95xx devices tend to be used in embedded systems with a
variety of ad-hoc mechanisms for storing the MAC address.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 8 лет назад
Родитель
Сommit
82e03764d8
1 измененных файлов: 56 добавлений и 11 удалений
  1. 56
    11
      src/drivers/net/smsc95xx.c

+ 56
- 11
src/drivers/net/smsc95xx.c Просмотреть файл

249
 	return 0;
249
 	return 0;
250
 }
250
 }
251
 
251
 
252
+/******************************************************************************
253
+ *
254
+ * MAC address
255
+ *
256
+ ******************************************************************************
257
+ */
258
+
259
+/**
260
+ * Fetch MAC address from EEPROM
261
+ *
262
+ * @v smsc95xx		SMSC95xx device
263
+ * @v hw_addr		Hardware address to fill in
264
+ * @ret rc		Return status code
265
+ */
266
+static int smsc95xx_fetch_mac_eeprom ( struct smsc95xx_device *smsc95xx,
267
+				       uint8_t *hw_addr ) {
268
+	int rc;
269
+
270
+	/* Read MAC address from EEPROM */
271
+	if ( ( rc = smsc95xx_eeprom_read ( smsc95xx, SMSC95XX_EEPROM_MAC,
272
+					   hw_addr, ETH_ALEN ) ) != 0 )
273
+		return rc;
274
+
275
+	/* Check that EEPROM is physically present */
276
+	if ( ! is_valid_ether_addr ( hw_addr ) ) {
277
+		DBGC ( smsc95xx, "SMSC95XX %p has no EEPROM (%s)\n",
278
+		       smsc95xx, eth_ntoa ( hw_addr ) );
279
+		return -ENODEV;
280
+	}
281
+
282
+	return 0;
283
+}
284
+
285
+/**
286
+ * Fetch MAC address
287
+ *
288
+ * @v smsc95xx		SMSC95xx device
289
+ * @v hw_addr		Hardware address to fill in
290
+ * @ret rc		Return status code
291
+ */
292
+static int smsc95xx_fetch_mac ( struct smsc95xx_device *smsc95xx,
293
+				uint8_t *hw_addr ) {
294
+	int rc;
295
+
296
+	/* Read MAC address from EEPROM, if present */
297
+	if ( ( rc = smsc95xx_fetch_mac_eeprom ( smsc95xx, hw_addr ) ) == 0 )
298
+		return 0;
299
+
300
+	/* Otherwise, generate a random MAC address */
301
+	eth_random_addr ( hw_addr );
302
+	return 0;
303
+}
304
+
252
 /******************************************************************************
305
 /******************************************************************************
253
  *
306
  *
254
  * MII access
307
  * MII access
980
 		goto err_reset;
1033
 		goto err_reset;
981
 
1034
 
982
 	/* Read MAC address */
1035
 	/* Read MAC address */
983
-	if ( ( rc = smsc95xx_eeprom_read ( smsc95xx, SMSC95XX_EEPROM_MAC,
984
-					   netdev->hw_addr, ETH_ALEN ) ) != 0 )
985
-		goto err_eeprom_read;
986
-
987
-	/* Generate MAC address if EEPROM is not present */
988
-	if ( ! is_valid_ether_addr ( netdev->hw_addr ) ) {
989
-		DBGC ( smsc95xx, "SMSC95XX %p has no EEPROM (%s)\n",
990
-		       smsc95xx, eth_ntoa ( netdev->hw_addr ) );
991
-		eth_random_addr ( netdev->hw_addr );
992
-	}
1036
+	if ( ( rc = smsc95xx_fetch_mac ( smsc95xx, netdev->hw_addr ) ) != 0 )
1037
+		goto err_fetch_mac;
993
 
1038
 
994
 	/* Register network device */
1039
 	/* Register network device */
995
 	if ( ( rc = register_netdev ( netdev ) ) != 0 )
1040
 	if ( ( rc = register_netdev ( netdev ) ) != 0 )
1000
 
1045
 
1001
 	unregister_netdev ( netdev );
1046
 	unregister_netdev ( netdev );
1002
  err_register:
1047
  err_register:
1003
- err_eeprom_read:
1048
+ err_fetch_mac:
1004
  err_reset:
1049
  err_reset:
1005
  err_describe:
1050
  err_describe:
1006
 	netdev_nullify ( netdev );
1051
 	netdev_nullify ( netdev );

Загрузка…
Отмена
Сохранить