diff options
| -rw-r--r-- | drivers/net/ixp2000/enp2611.c | 13 | ||||
| -rw-r--r-- | drivers/net/ixp2000/pm3386.c | 30 | ||||
| -rw-r--r-- | drivers/net/ixp2000/pm3386.h | 1 |
3 files changed, 34 insertions, 10 deletions
diff --git a/drivers/net/ixp2000/enp2611.c b/drivers/net/ixp2000/enp2611.c index 6f7dce8eba51..b67f586d7392 100644 --- a/drivers/net/ixp2000/enp2611.c +++ b/drivers/net/ixp2000/enp2611.c | |||
| @@ -149,6 +149,8 @@ static void enp2611_check_link_status(unsigned long __dummy) | |||
| 149 | int status; | 149 | int status; |
| 150 | 150 | ||
| 151 | dev = nds[i]; | 151 | dev = nds[i]; |
| 152 | if (dev == NULL) | ||
| 153 | continue; | ||
| 152 | 154 | ||
| 153 | status = pm3386_is_link_up(i); | 155 | status = pm3386_is_link_up(i); |
| 154 | if (status && !netif_carrier_ok(dev)) { | 156 | if (status && !netif_carrier_ok(dev)) { |
| @@ -191,6 +193,7 @@ static void enp2611_set_port_admin_status(int port, int up) | |||
| 191 | 193 | ||
| 192 | static int __init enp2611_init_module(void) | 194 | static int __init enp2611_init_module(void) |
| 193 | { | 195 | { |
| 196 | int ports; | ||
| 194 | int i; | 197 | int i; |
| 195 | 198 | ||
| 196 | if (!machine_is_enp2611()) | 199 | if (!machine_is_enp2611()) |
| @@ -199,7 +202,8 @@ static int __init enp2611_init_module(void) | |||
| 199 | caleb_reset(); | 202 | caleb_reset(); |
| 200 | pm3386_reset(); | 203 | pm3386_reset(); |
| 201 | 204 | ||
| 202 | for (i = 0; i < 3; i++) { | 205 | ports = pm3386_port_count(); |
| 206 | for (i = 0; i < ports; i++) { | ||
| 203 | nds[i] = ixpdev_alloc(i, sizeof(struct enp2611_ixpdev_priv)); | 207 | nds[i] = ixpdev_alloc(i, sizeof(struct enp2611_ixpdev_priv)); |
| 204 | if (nds[i] == NULL) { | 208 | if (nds[i] == NULL) { |
| 205 | while (--i >= 0) | 209 | while (--i >= 0) |
| @@ -215,9 +219,10 @@ static int __init enp2611_init_module(void) | |||
| 215 | 219 | ||
| 216 | ixp2400_msf_init(&enp2611_msf_parameters); | 220 | ixp2400_msf_init(&enp2611_msf_parameters); |
| 217 | 221 | ||
| 218 | if (ixpdev_init(3, nds, enp2611_set_port_admin_status)) { | 222 | if (ixpdev_init(ports, nds, enp2611_set_port_admin_status)) { |
| 219 | for (i = 0; i < 3; i++) | 223 | for (i = 0; i < ports; i++) |
| 220 | free_netdev(nds[i]); | 224 | if (nds[i]) |
| 225 | free_netdev(nds[i]); | ||
| 221 | return -EINVAL; | 226 | return -EINVAL; |
| 222 | } | 227 | } |
| 223 | 228 | ||
diff --git a/drivers/net/ixp2000/pm3386.c b/drivers/net/ixp2000/pm3386.c index 5c7ab7564053..5224651c9aac 100644 --- a/drivers/net/ixp2000/pm3386.c +++ b/drivers/net/ixp2000/pm3386.c | |||
| @@ -86,40 +86,53 @@ static void pm3386_port_reg_write(int port, int _reg, int spacing, u16 value) | |||
| 86 | pm3386_reg_write(port >> 1, reg, value); | 86 | pm3386_reg_write(port >> 1, reg, value); |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | int pm3386_secondary_present(void) | ||
| 90 | { | ||
| 91 | return pm3386_reg_read(1, 0) == 0x3386; | ||
| 92 | } | ||
| 89 | 93 | ||
| 90 | void pm3386_reset(void) | 94 | void pm3386_reset(void) |
| 91 | { | 95 | { |
| 92 | u8 mac[3][6]; | 96 | u8 mac[3][6]; |
| 97 | int secondary; | ||
| 98 | |||
| 99 | secondary = pm3386_secondary_present(); | ||
| 93 | 100 | ||
| 94 | /* Save programmed MAC addresses. */ | 101 | /* Save programmed MAC addresses. */ |
| 95 | pm3386_get_mac(0, mac[0]); | 102 | pm3386_get_mac(0, mac[0]); |
| 96 | pm3386_get_mac(1, mac[1]); | 103 | pm3386_get_mac(1, mac[1]); |
| 97 | pm3386_get_mac(2, mac[2]); | 104 | if (secondary) |
| 105 | pm3386_get_mac(2, mac[2]); | ||
| 98 | 106 | ||
| 99 | /* Assert analog and digital reset. */ | 107 | /* Assert analog and digital reset. */ |
| 100 | pm3386_reg_write(0, 0x002, 0x0060); | 108 | pm3386_reg_write(0, 0x002, 0x0060); |
| 101 | pm3386_reg_write(1, 0x002, 0x0060); | 109 | if (secondary) |
| 110 | pm3386_reg_write(1, 0x002, 0x0060); | ||
| 102 | mdelay(1); | 111 | mdelay(1); |
| 103 | 112 | ||
| 104 | /* Deassert analog reset. */ | 113 | /* Deassert analog reset. */ |
| 105 | pm3386_reg_write(0, 0x002, 0x0062); | 114 | pm3386_reg_write(0, 0x002, 0x0062); |
| 106 | pm3386_reg_write(1, 0x002, 0x0062); | 115 | if (secondary) |
| 116 | pm3386_reg_write(1, 0x002, 0x0062); | ||
| 107 | mdelay(10); | 117 | mdelay(10); |
| 108 | 118 | ||
| 109 | /* Deassert digital reset. */ | 119 | /* Deassert digital reset. */ |
| 110 | pm3386_reg_write(0, 0x002, 0x0063); | 120 | pm3386_reg_write(0, 0x002, 0x0063); |
| 111 | pm3386_reg_write(1, 0x002, 0x0063); | 121 | if (secondary) |
| 122 | pm3386_reg_write(1, 0x002, 0x0063); | ||
| 112 | mdelay(10); | 123 | mdelay(10); |
| 113 | 124 | ||
| 114 | /* Restore programmed MAC addresses. */ | 125 | /* Restore programmed MAC addresses. */ |
| 115 | pm3386_set_mac(0, mac[0]); | 126 | pm3386_set_mac(0, mac[0]); |
| 116 | pm3386_set_mac(1, mac[1]); | 127 | pm3386_set_mac(1, mac[1]); |
| 117 | pm3386_set_mac(2, mac[2]); | 128 | if (secondary) |
| 129 | pm3386_set_mac(2, mac[2]); | ||
| 118 | 130 | ||
| 119 | /* Disable carrier on all ports. */ | 131 | /* Disable carrier on all ports. */ |
| 120 | pm3386_set_carrier(0, 0); | 132 | pm3386_set_carrier(0, 0); |
| 121 | pm3386_set_carrier(1, 0); | 133 | pm3386_set_carrier(1, 0); |
| 122 | pm3386_set_carrier(2, 0); | 134 | if (secondary) |
| 135 | pm3386_set_carrier(2, 0); | ||
| 123 | } | 136 | } |
| 124 | 137 | ||
| 125 | static u16 swaph(u16 x) | 138 | static u16 swaph(u16 x) |
| @@ -127,6 +140,11 @@ static u16 swaph(u16 x) | |||
| 127 | return ((x << 8) | (x >> 8)) & 0xffff; | 140 | return ((x << 8) | (x >> 8)) & 0xffff; |
| 128 | } | 141 | } |
| 129 | 142 | ||
| 143 | int pm3386_port_count(void) | ||
| 144 | { | ||
| 145 | return 2 + pm3386_secondary_present(); | ||
| 146 | } | ||
| 147 | |||
| 130 | void pm3386_init_port(int port) | 148 | void pm3386_init_port(int port) |
| 131 | { | 149 | { |
| 132 | int pm = port >> 1; | 150 | int pm = port >> 1; |
diff --git a/drivers/net/ixp2000/pm3386.h b/drivers/net/ixp2000/pm3386.h index fe92bb056ac4..cc4183dca911 100644 --- a/drivers/net/ixp2000/pm3386.h +++ b/drivers/net/ixp2000/pm3386.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #define __PM3386_H | 13 | #define __PM3386_H |
| 14 | 14 | ||
| 15 | void pm3386_reset(void); | 15 | void pm3386_reset(void); |
| 16 | int pm3386_port_count(void); | ||
| 16 | void pm3386_init_port(int port); | 17 | void pm3386_init_port(int port); |
| 17 | void pm3386_get_mac(int port, u8 *mac); | 18 | void pm3386_get_mac(int port, u8 *mac); |
| 18 | void pm3386_set_mac(int port, u8 *mac); | 19 | void pm3386_set_mac(int port, u8 *mac); |
