<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">ChangeSet 1.811.1.1, 2002/12/11 00:36:25-08:00, petkan@mastika.dce.bg

[PATCH] set_mac_address is now added to the driver.  thanks to Orjan Friberg &lt;orjan.friberg@axis.com&gt;


diff -Nru a/drivers/usb/rtl8150.c b/drivers/usb/rtl8150.c
--- a/drivers/usb/rtl8150.c	Mon Dec 16 16:34:21 2002
+++ b/drivers/usb/rtl8150.c	Mon Dec 16 16:34:21 2002
@@ -18,15 +18,14 @@
 #include &lt;linux/ethtool.h&gt;
 #include &lt;linux/devfs_fs_kernel.h&gt;
 #include &lt;linux/usb.h&gt;
-#include &lt;linux/init.h&gt;
 #include &lt;asm/uaccess.h&gt;
 
 /* Version Information */
-#define DRIVER_VERSION "v0.4.1 (2002/07/22)"
+#define DRIVER_VERSION "v0.4.2 (2002/09/19)"
 #define DRIVER_AUTHOR "Petko Manolov &lt;petkan@users.sourceforge.net&gt;"
 #define DRIVER_DESC "rtl8150 based usb-ethernet driver"
 
-#define	IRD			0x0120
+#define	IDR			0x0120
 #define	MAR			0x0126
 #define	CR			0x012e
 #define	TCR			0x012f
@@ -46,6 +45,8 @@
 #define	ANLP			0x0146
 #define	AER			0x0148
 
+#define	IDR_EEPROM		0x1202
+
 #define	PHY_READ		0
 #define	PHY_WRITE		0x20
 #define	PHY_GO			0x40
@@ -72,6 +73,8 @@
 #define PRODUCT_ID_RTL8150		0x8150
 #define	PRODUCT_ID_LUAKTX		0x0012
 
+#undef EEPROM_WRITE
+
 /* table of devices that work with this driver */
 static struct usb_device_id rtl8150_table[] = {
 	{USB_DEVICE(VENDOR_ID_REALTEK, PRODUCT_ID_RTL8150)},
@@ -226,10 +229,51 @@
 {
 	u8 node_id[6];
 
-	get_registers(dev, IRD, sizeof(node_id), node_id);
+	get_registers(dev, IDR, sizeof(node_id), node_id);
 	memcpy(dev-&gt;netdev-&gt;dev_addr, node_id, sizeof(node_id));
 }
 
+static int rtl8150_set_mac_address(struct net_device *netdev, void *p)
+{
+	struct sockaddr *addr = p;
+	rtl8150_t *dev;
+	int i;
+
+	if (netif_running(netdev))
+		return -EBUSY;
+	dev = netdev-&gt;priv;
+	if (dev == NULL) {
+		return -ENODEV;
+	}
+	memcpy(netdev-&gt;dev_addr, addr-&gt;sa_data, netdev-&gt;addr_len);
+	dbg("%s: Setting MAC address to ", netdev-&gt;name);
+	for (i = 0; i &lt; 5; i++)
+		printk("%02X:", netdev-&gt;dev_addr[i]);
+	dbg("%02X\n", netdev-&gt;dev_addr[i]);
+	/* Set the IDR registers. */
+	set_registers(dev, IDR, sizeof(netdev-&gt;dev_addr), netdev-&gt;dev_addr);
+#ifdef EEPROM_WRITE
+	{
+	u8 cr;
+	/* Get the CR contents. */
+	get_registers(dev, CR, 1, &amp;cr);
+	/* Set the WEPROM bit (eeprom write enable). */
+	cr |= 0x20;
+	set_registers(dev, CR, 1, &amp;cr);
+	/* Write the MAC address into eeprom. Eeprom writes must be word-sized,
+	   so we need to split them up. */
+	for (i = 0; i * 2 &lt; netdev-&gt;addr_len; i++) {
+		set_registers(dev, IDR_EEPROM + (i * 2), 2, 
+		              netdev-&gt;dev_addr + (i * 2));
+	}
+	/* Clear the WEPROM bit (preventing accidental eeprom writes). */
+	cr &amp;= 0xdf;
+	set_registers(dev, CR, 1, &amp;cr);
+	}
+#endif	
+	return 0;
+}
+
 static int rtl8150_reset(rtl8150_t * dev)
 {
 	u8 data = 0x10;
@@ -667,6 +711,7 @@
 	netdev-&gt;tx_timeout = rtl8150_tx_timeout;
 	netdev-&gt;hard_start_xmit = rtl8150_start_xmit;
 	netdev-&gt;set_multicast_list = rtl8150_set_multicast;
+	netdev-&gt;set_mac_address = rtl8150_set_mac_address;
 	netdev-&gt;get_stats = rtl8150_netdev_stats;
 	netdev-&gt;mtu = RTL8150_MTU;
 	dev-&gt;intr_interval = 100;	/* 100ms */
</pre></body></html>