13 #include <linux/pci.h>
14 #include <linux/slab.h>
17 #include <asm/unaligned.h>
30 {
"Asante", 0, 0, 0x94, {0x1e00, 0x0000, 0x0800, 0x0100, 0x018c,
31 0x0000, 0x0000, 0xe078, 0x0001, 0x0050, 0x0018 }},
32 {
"SMC9332DST", 0, 0, 0xC0, { 0x1e00, 0x0000, 0x0800, 0x041f,
37 {
"Cogent EM100", 0, 0, 0x92, { 0x1e00, 0x0000, 0x0800, 0x063f,
44 {
"Maxtech NX-110", 0, 0, 0xE8, { 0x1e00, 0x0000, 0x0800, 0x0513,
50 {
"Accton EN1207", 0, 0, 0xE8, { 0x1e00, 0x0000, 0x0800, 0x051F,
57 {
"NetWinder", 0x00, 0x10, 0x57,
61 { 0x1e00, 0x0000, 0x000b, 0x8f01, 0x0103, 0x0300, 0x0821, 0x000, 0x0001, 0x0000, 0x01e1 }
63 {
"Cobalt Microserver", 0, 0x10, 0xE0, {0x1e00,
109 static unsigned char leafdata[] =
127 tp->
mtable->defaultmedia = 0x800;
128 tp->
mtable->leafcount = 1;
129 tp->
mtable->csr12dir = 0x3f;
130 tp->
mtable->has_nonmii = 0;
131 tp->
mtable->has_reset = 0;
134 tp->
mtable->mleaf[0].type = 1;
135 tp->
mtable->mleaf[0].media = 11;
136 tp->
mtable->mleaf[0].leafdata = &leafdata[0];
153 static unsigned char *last_ee_data;
154 static int controller_index;
156 unsigned char *ee_data = tp->
eeprom;
162 for (i = 0; i < 8; i ++)
163 if (ee_data[i] != ee_data[16+i])
166 if (ee_data[0] == 0xff) {
167 if (last_mediatable) {
169 pr_info(
"%s: Controller %d of multiport board\n",
170 dev->
name, controller_index);
171 tp->
mtable = last_mediatable;
172 ee_data = last_ee_data;
173 goto subsequent_board;
175 pr_info(
"%s: Missing EEPROM, this interface may not work correctly!\n",
180 for (i = 0; eeprom_fixups[
i].name; i++) {
181 if (dev->
dev_addr[0] == eeprom_fixups[i].addr0 &&
182 dev->
dev_addr[1] == eeprom_fixups[i].addr1 &&
183 dev->
dev_addr[2] == eeprom_fixups[i].addr2) {
184 if (dev->
dev_addr[2] == 0xE8 && ee_data[0x1a] == 0x55)
186 memcpy(ee_data + 26, eeprom_fixups[i].newtable,
187 sizeof(eeprom_fixups[i].newtable));
188 pr_info(
"%s: Old format EEPROM on '%s' board. Using substitute media control info\n",
189 dev->
name, eeprom_fixups[i].name);
193 if (eeprom_fixups[i].
name ==
NULL) {
194 pr_info(
"%s: Old style EEPROM with no media selection information\n",
200 controller_index = 0;
201 if (ee_data[19] > 1) {
202 last_ee_data = ee_data;
206 if (ee_data[27] == 0) {
207 tulip_build_fake_mediatable(tp);
209 unsigned char *
p = (
void *)ee_data + ee_data[27];
210 unsigned char csr12dir = 0;
211 int count, new_advertise = 0;
223 pr_warn(
"%s: no phy info, aborting mtable build\n",
233 last_mediatable = tp->
mtable = mtable;
240 pr_info(
"%s: EEPROM default media type %s\n",
242 media & 0x0800 ?
"Autosense"
244 for (i = 0; i <
count; i++) {
247 if ((p[0] & 0x80) == 0) {
249 leaf->
media = p[0] & 0x3f;
251 if ((p[2] & 0x61) == 0x01)
258 leaf->
media = p[2] & 0x0f;
265 p += (p[0] & 0x3f) + 1;
267 }
else if (p[1] & 1) {
268 int gpr_len, reset_len;
273 reset_len=p[4+gpr_len]*2;
274 new_advertise |=
get_u16(&p[7+gpr_len+reset_len]);
281 switch (leaf->
media) {
282 case 0: new_advertise |= 0x0020;
break;
283 case 4: new_advertise |= 0x0040;
break;
284 case 3: new_advertise |= 0x0080;
break;
285 case 5: new_advertise |= 0x0100;
break;
286 case 6: new_advertise |= 0x0200;
break;
288 if (p[1] == 2 && leaf->
media == 0) {
302 p += (p[0] & 0x3f) + 1;
306 pr_info(
"%s: MII interface PHY %d, setup/reset sequences %d/%d long, capabilities %02x %02x\n",
308 bp[0], bp[1], bp[2 + bp[1]*2],
309 bp[5 + bp[2 + bp[1]*2]*2],
310 bp[4 + bp[2 + bp[1]*2]*2]);
312 pr_info(
"%s: Index #%d - Media %s (#%d) described by a %s (%d) block\n",
325 #define EE_SHIFT_CLK 0x02
327 #define EE_DATA_WRITE 0x04
328 #define EE_WRITE_0 0x01
329 #define EE_WRITE_1 0x05
330 #define EE_DATA_READ 0x08
331 #define EE_ENB (0x4800 | EE_CS)
336 #define eeprom_delay() ioread32(ee_addr)
339 #define EE_READ_CMD (6)
348 int read_cmd = location | (
EE_READ_CMD << addr_len);
353 if (location > (1 << addr_len) - 1)
360 for (i = 4 + addr_len; i >= 0; i--) {
371 for (i = 16; i > 0; i--) {