Merge with /home/shaggy/git/linus-clean/
[linux-2.6-block.git] / drivers / net / ixp2000 / pm3386.c
index 267b6bd5f79f714dfd15c5327bb8b644665f4fdc..5c7ab7564053af12a291f2be7875329cb6ac6e1d 100644 (file)
@@ -89,7 +89,37 @@ static void pm3386_port_reg_write(int port, int _reg, int spacing, u16 value)
 
 void pm3386_reset(void)
 {
-       /* @@@ Implement me.  */
+       u8 mac[3][6];
+
+       /* Save programmed MAC addresses.  */
+       pm3386_get_mac(0, mac[0]);
+       pm3386_get_mac(1, mac[1]);
+       pm3386_get_mac(2, mac[2]);
+
+       /* Assert analog and digital reset.  */
+       pm3386_reg_write(0, 0x002, 0x0060);
+       pm3386_reg_write(1, 0x002, 0x0060);
+       mdelay(1);
+
+       /* Deassert analog reset.  */
+       pm3386_reg_write(0, 0x002, 0x0062);
+       pm3386_reg_write(1, 0x002, 0x0062);
+       mdelay(10);
+
+       /* Deassert digital reset.  */
+       pm3386_reg_write(0, 0x002, 0x0063);
+       pm3386_reg_write(1, 0x002, 0x0063);
+       mdelay(10);
+
+       /* Restore programmed MAC addresses.  */
+       pm3386_set_mac(0, mac[0]);
+       pm3386_set_mac(1, mac[1]);
+       pm3386_set_mac(2, mac[2]);
+
+       /* Disable carrier on all ports.  */
+       pm3386_set_carrier(0, 0);
+       pm3386_set_carrier(1, 0);
+       pm3386_set_carrier(2, 0);
 }
 
 static u16 swaph(u16 x)
@@ -215,6 +245,13 @@ void pm3386_get_mac(int port, u8 *mac)
        mac[5] = (temp >> 8) & 0xff;
 }
 
+void pm3386_set_mac(int port, u8 *mac)
+{
+       pm3386_port_reg_write(port, 0x308, 0x100, (mac[1] << 8) | mac[0]);
+       pm3386_port_reg_write(port, 0x309, 0x100, (mac[3] << 8) | mac[2]);
+       pm3386_port_reg_write(port, 0x30a, 0x100, (mac[5] << 8) | mac[4]);
+}
+
 static u32 pm3386_get_stat(int port, u16 base)
 {
        u32 value;
@@ -243,6 +280,11 @@ void pm3386_get_stats(int port, struct net_device_stats *stats)
        /* @@@ Add other stats.  */
 }
 
+void pm3386_set_carrier(int port, int state)
+{
+       pm3386_port_reg_write(port, 0x703, 0x10, state ? 0x1001 : 0x0000);
+}
+
 int pm3386_is_link_up(int port)
 {
        u16 temp;