00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 FILE_LICENCE ( GPL2_OR_LATER );
00040
00041
00042 #include "etherboot.h"
00043
00044 #include "nic.h"
00045
00046 #include <gpxe/pci.h>
00047 #include <gpxe/ethernet.h>
00048
00049
00050 #ifdef EDEBUG
00051 #define dprintf(x) printf x
00052 #else
00053 #define dprintf(x)
00054 #endif
00055
00056
00057 #define virt_to_le32desc(addr) cpu_to_le32(virt_to_bus(addr))
00058 #define le32desc_to_virt(addr) bus_to_virt(le32_to_cpu(addr))
00059
00060
00061 #define PCI_DM9132_ID 0x91321282
00062 #define PCI_DM9102_ID 0x91021282
00063 #define PCI_DM9100_ID 0x91001282
00064 #define PCI_DM9009_ID 0x90091282
00065
00066 #define DM9102_IO_SIZE 0x80
00067 #define DM9102A_IO_SIZE 0x100
00068 #define TX_MAX_SEND_CNT 0x1
00069 #define TX_DESC_CNT 0x10
00070 #define RX_DESC_CNT 0x20
00071 #define TX_FREE_DESC_CNT (TX_DESC_CNT - 2)
00072 #define TX_WAKE_DESC_CNT (TX_DESC_CNT - 3)
00073 #define DESC_ALL_CNT (TX_DESC_CNT + RX_DESC_CNT)
00074 #define TX_BUF_ALLOC 0x600
00075 #define RX_ALLOC_SIZE 0x620
00076 #define DM910X_RESET 1
00077 #define CR0_DEFAULT 0x00E00000
00078 #define CR6_DEFAULT 0x00080000
00079 #define CR7_DEFAULT 0x180c1
00080 #define CR15_DEFAULT 0x06
00081 #define TDES0_ERR_MASK 0x4302
00082 #define MAX_PACKET_SIZE 1514
00083 #define DMFE_MAX_MULTICAST 14
00084 #define RX_COPY_SIZE 100
00085 #define MAX_CHECK_PACKET 0x8000
00086 #define DM9801_NOISE_FLOOR 8
00087 #define DM9802_NOISE_FLOOR 5
00088
00089 #define DMFE_10MHF 0
00090 #define DMFE_100MHF 1
00091 #define DMFE_10MFD 4
00092 #define DMFE_100MFD 5
00093 #define DMFE_AUTO 8
00094 #define DMFE_1M_HPNA 0x10
00095
00096 #define DMFE_TXTH_72 0x400000
00097 #define DMFE_TXTH_96 0x404000
00098 #define DMFE_TXTH_128 0x0000
00099 #define DMFE_TXTH_256 0x4000
00100 #define DMFE_TXTH_512 0x8000
00101 #define DMFE_TXTH_1K 0xC000
00102
00103 #define DMFE_TIMER_WUT (jiffies + HZ * 1)
00104 #define DMFE_TX_TIMEOUT ((3*HZ)/2)
00105 #define DMFE_TX_KICK (HZ/2)
00106
00107 #define DMFE_DBUG(dbug_now, msg, value) if (dmfe_debug || (dbug_now)) printk(KERN_ERR DRV_NAME ": %s %lx\n", (msg), (long) (value))
00108
00109 #define SHOW_MEDIA_TYPE(mode) printk(KERN_ERR DRV_NAME ": Change Speed to %sMhz %s duplex\n",mode & 1 ?"100":"10", mode & 4 ? "full":"half");
00110
00111
00112
00113 #define CR9_SROM_READ 0x4800
00114 #define CR9_SRCS 0x1
00115 #define CR9_SRCLK 0x2
00116 #define CR9_CRDOUT 0x8
00117 #define SROM_DATA_0 0x0
00118 #define SROM_DATA_1 0x4
00119 #define PHY_DATA_1 0x20000
00120 #define PHY_DATA_0 0x00000
00121 #define MDCLKH 0x10000
00122
00123 #define PHY_POWER_DOWN 0x800
00124
00125 #define SROM_V41_CODE 0x14
00126
00127 #define SROM_CLK_WRITE(data, ioaddr) outl(data|CR9_SROM_READ|CR9_SRCS,ioaddr);udelay(5);outl(data|CR9_SROM_READ|CR9_SRCS|CR9_SRCLK,ioaddr);udelay(5);outl(data|CR9_SROM_READ|CR9_SRCS,ioaddr);udelay(5);
00128
00129 #define __CHK_IO_SIZE(pci_id, dev_rev) ( ((pci_id)==PCI_DM9132_ID) || ((dev_rev) >= 0x02000030) ) ? DM9102A_IO_SIZE: DM9102_IO_SIZE
00130 #define CHK_IO_SIZE(pci_dev, dev_rev) __CHK_IO_SIZE(((pci_dev)->device << 16) | (pci_dev)->vendor, dev_rev)
00131
00132
00133 #define DEVICE net_device
00134
00135
00136 struct tx_desc {
00137 u32 tdes0, tdes1, tdes2, tdes3;
00138 void * tx_buf_ptr;
00139 struct tx_desc * next_tx_desc;
00140 } __attribute__ ((aligned(32)));
00141
00142 struct rx_desc {
00143 u32 rdes0, rdes1, rdes2, rdes3;
00144 void * rx_skb_ptr;
00145 struct rx_desc * next_rx_desc;
00146 } __attribute__ ((aligned(32)));
00147
00148 static struct dmfe_private {
00149 u32 chip_id;
00150 u32 chip_revision;
00151 u32 cr0_data;
00152
00153 u32 cr6_data;
00154 u32 cr7_data;
00155 u32 cr15_data;
00156
00157 u16 HPNA_command;
00158 u16 HPNA_timer;
00159 u16 NIC_capability;
00160 u16 PHY_reg4;
00161
00162 u8 HPNA_present;
00163 u8 chip_type;
00164 u8 media_mode;
00165 u8 op_mode;
00166 u8 phy_addr;
00167 u8 dm910x_chk_mode;
00168
00169
00170 unsigned char srom[128];
00171
00172 u8 cur_tx;
00173 u8 cur_rx;
00174 } dfx;
00175
00176 static struct dmfe_private *db;
00177
00178 enum dmfe_offsets {
00179 DCR0 = 0x00, DCR1 = 0x08, DCR2 = 0x10, DCR3 = 0x18, DCR4 = 0x20,
00180 DCR5 = 0x28, DCR6 = 0x30, DCR7 = 0x38, DCR8 = 0x40, DCR9 = 0x48,
00181 DCR10 = 0x50, DCR11 = 0x58, DCR12 = 0x60, DCR13 = 0x68, DCR14 =
00182 0x70,
00183 DCR15 = 0x78
00184 };
00185
00186 enum dmfe_CR6_bits {
00187 CR6_RXSC = 0x2, CR6_PBF = 0x8, CR6_PM = 0x40, CR6_PAM = 0x80,
00188 CR6_FDM = 0x200, CR6_TXSC = 0x2000, CR6_STI = 0x100000,
00189 CR6_SFT = 0x200000, CR6_RXA = 0x40000000, CR6_NO_PURGE = 0x20000000
00190 };
00191
00192
00193 static struct nic_operations dmfe_operations;
00194
00195 static unsigned char dmfe_media_mode = DMFE_AUTO;
00196 static u32 dmfe_cr6_user_set;
00197
00198
00199 static u8 chkmode = 1;
00200 static u8 HPNA_mode;
00201 static u8 HPNA_rx_cmd;
00202 static u8 HPNA_tx_cmd;
00203 static u8 HPNA_NoiseFloor;
00204 static u8 SF_mode;
00205
00206
00207
00208
00209
00210
00211 struct {
00212 struct tx_desc txd[TX_DESC_CNT] __attribute__ ((aligned(32)));
00213 unsigned char txb[TX_BUF_ALLOC * TX_DESC_CNT]
00214 __attribute__ ((aligned(32)));
00215 struct rx_desc rxd[RX_DESC_CNT] __attribute__ ((aligned(32)));
00216 unsigned char rxb[RX_ALLOC_SIZE * RX_DESC_CNT]
00217 __attribute__ ((aligned(32)));
00218 } dmfe_bufs __shared;
00219 #define txd dmfe_bufs.txd
00220 #define txb dmfe_bufs.txb
00221 #define rxd dmfe_bufs.rxd
00222 #define rxb dmfe_bufs.rxb
00223
00224
00225 static long int BASE;
00226
00227 static u16 read_srom_word(long ioaddr, int offset);
00228 static void dmfe_init_dm910x(struct nic *nic);
00229 static void dmfe_descriptor_init(struct nic *, unsigned long ioaddr);
00230 static void update_cr6(u32, unsigned long);
00231 static void send_filter_frame(struct nic *nic);
00232 static void dm9132_id_table(struct nic *nic);
00233
00234 static u16 phy_read(unsigned long, u8, u8, u32);
00235 static void phy_write(unsigned long, u8, u8, u16, u32);
00236 static void phy_write_1bit(unsigned long, u32);
00237 static u16 phy_read_1bit(unsigned long);
00238 static void dmfe_set_phyxcer(struct nic *nic);
00239
00240 static void dmfe_parse_srom(struct nic *nic);
00241 static void dmfe_program_DM9801(struct nic *nic, int);
00242 static void dmfe_program_DM9802(struct nic *nic);
00243
00244 static void dmfe_reset(struct nic *nic)
00245 {
00246
00247 db->cr6_data = CR6_DEFAULT | dmfe_cr6_user_set;
00248
00249 db->NIC_capability = 0xf;
00250 db->PHY_reg4 = 0x1e0;
00251
00252
00253 if (!chkmode || (db->chip_id == PCI_DM9132_ID) ||
00254 (db->chip_revision >= 0x02000030)) {
00255 db->cr6_data |= DMFE_TXTH_256;
00256 db->cr0_data = CR0_DEFAULT;
00257 db->dm910x_chk_mode = 4;
00258 } else {
00259 db->cr6_data |= CR6_SFT;
00260 db->cr0_data = 0;
00261 db->dm910x_chk_mode = 1;
00262 }
00263
00264 dmfe_init_dm910x(nic);
00265
00266 return;
00267 }
00268
00269
00270
00271
00272
00273
00274
00275
00276 static void dmfe_init_dm910x(struct nic *nic)
00277 {
00278 unsigned long ioaddr = BASE;
00279
00280
00281 outl(DM910X_RESET, ioaddr + DCR0);
00282 udelay(100);
00283 outl(db->cr0_data, ioaddr + DCR0);
00284 udelay(5);
00285
00286
00287 db->phy_addr = 1;
00288
00289
00290 dmfe_parse_srom(nic);
00291 db->media_mode = dmfe_media_mode;
00292
00293
00294 outl(0x180, ioaddr + DCR12);
00295 if (db->chip_id == PCI_DM9009_ID) {
00296 outl(0x80, ioaddr + DCR12);
00297 mdelay(300);
00298 }
00299 outl(0x0, ioaddr + DCR12);
00300
00301
00302 if (!(db->media_mode & 0x10))
00303 dmfe_set_phyxcer(nic);
00304
00305
00306 if (!(db->media_mode & DMFE_AUTO))
00307 db->op_mode = db->media_mode;
00308
00309
00310 dmfe_descriptor_init(nic, ioaddr);
00311
00312
00313 outl(virt_to_le32desc(&txd[0]), ioaddr + DCR4);
00314
00315
00316 outl(virt_to_le32desc(&rxd[0]), ioaddr + DCR3);
00317
00318
00319 update_cr6(db->cr6_data, ioaddr);
00320
00321
00322 if (db->chip_id == PCI_DM9132_ID) {
00323 dm9132_id_table(nic);
00324 } else {
00325 send_filter_frame(nic);
00326 }
00327
00328
00329 db->cr7_data = CR7_DEFAULT;
00330 outl(db->cr7_data, ioaddr + DCR7);
00331
00332 outl(db->cr15_data, ioaddr + DCR15);
00333
00334 db->cr6_data |= CR6_RXSC | CR6_TXSC | 0x40000;
00335 update_cr6(db->cr6_data, ioaddr);
00336 }
00337 #ifdef EDEBUG
00338 void hex_dump(const char *data, const unsigned int len);
00339 #endif
00340
00341
00342
00343 static int dmfe_poll(struct nic *nic, int retrieve)
00344 {
00345 u32 rdes0;
00346 int entry = db->cur_rx % RX_DESC_CNT;
00347 int rxlen;
00348 rdes0 = le32_to_cpu(rxd[entry].rdes0);
00349 if (rdes0 & 0x80000000)
00350 return 0;
00351
00352 if (!retrieve)
00353 return 1;
00354
00355 if ((rdes0 & 0x300) != 0x300) {
00356
00357 printf("strange Packet\n");
00358 rxd[entry].rdes0 = cpu_to_le32(0x80000000);
00359 return 0;
00360 } else {
00361
00362 rxlen = ((rdes0 >> 16) & 0x3fff) - 4;
00363
00364 if (rdes0 & 0x8000) {
00365 printf("Error\n");
00366 return 0;
00367 }
00368 if (!(rdes0 & 0x8000) ||
00369 ((db->cr6_data & CR6_PM) && (rxlen > 6))) {
00370 if (db->dm910x_chk_mode & 1)
00371 printf("Silly check mode\n");
00372
00373 nic->packetlen = rxlen;
00374 memcpy(nic->packet, rxb + (entry * RX_ALLOC_SIZE),
00375 nic->packetlen);
00376 }
00377 }
00378 rxd[entry].rdes0 = cpu_to_le32(0x80000000);
00379 db->cur_rx++;
00380 return 1;
00381 }
00382
00383 static void dmfe_irq(struct nic *nic __unused, irq_action_t action __unused)
00384 {
00385 switch ( action ) {
00386 case DISABLE :
00387 break;
00388 case ENABLE :
00389 break;
00390 case FORCE :
00391 break;
00392 }
00393 }
00394
00395
00396
00397
00398 static void dmfe_transmit(struct nic *nic,
00399 const char *dest,
00400 unsigned int type,
00401 unsigned int size,
00402 const char *packet)
00403 {
00404 u16 nstype;
00405 u8 *ptxb;
00406
00407 ptxb = &txb[db->cur_tx];
00408
00409
00410 outl(0, BASE + DCR7);
00411 memcpy(ptxb, dest, ETH_ALEN);
00412 memcpy(ptxb + ETH_ALEN, nic->node_addr, ETH_ALEN);
00413 nstype = htons((u16) type);
00414 memcpy(ptxb + 2 * ETH_ALEN, (u8 *) & nstype, 2);
00415 memcpy(ptxb + ETH_HLEN, packet, size);
00416
00417 size += ETH_HLEN;
00418 while (size < ETH_ZLEN)
00419 ptxb[size++] = '\0';
00420
00421
00422 txd[db->cur_tx].tdes1 = cpu_to_le32(0xe1000000 | size);
00423 txd[db->cur_tx].tdes0 = cpu_to_le32(0x80000000);
00424
00425
00426 outl(0x1, BASE + DCR1);
00427 outl(db->cr7_data, BASE + DCR7);
00428
00429
00430 db->cur_tx++;
00431 db->cur_tx = db->cur_tx % TX_DESC_CNT;
00432 }
00433
00434
00435
00436
00437 static void dmfe_disable ( struct nic *nic __unused ) {
00438
00439 outl(DM910X_RESET, BASE + DCR0);
00440 udelay(5);
00441 phy_write(BASE, db->phy_addr, 0, 0x8000, db->chip_id);
00442
00443 }
00444
00445
00446
00447
00448
00449 #define board_found 1
00450 #define valid_link 0
00451 static int dmfe_probe ( struct nic *nic, struct pci_device *pci ) {
00452
00453 uint32_t dev_rev, pci_pmr;
00454 int i;
00455
00456 if (pci->ioaddr == 0)
00457 return 0;
00458
00459 BASE = pci->ioaddr;
00460 printf("dmfe.c: Found %s Vendor=0x%hX Device=0x%hX\n",
00461 pci->driver_name, pci->vendor, pci->device);
00462
00463
00464 pci_read_config_dword(pci, PCI_REVISION_ID, &dev_rev);
00465 dprintf(("Revision %lX\n", dev_rev));
00466
00467
00468 db = &dfx;
00469
00470 db->chip_id = ((u32) pci->device << 16) | pci->vendor;
00471 BASE = pci_bar_start(pci, PCI_BASE_ADDRESS_0);
00472 db->chip_revision = dev_rev;
00473
00474 pci_read_config_dword(pci, 0x50, &pci_pmr);
00475 pci_pmr &= 0x70000;
00476 if ((pci_pmr == 0x10000) && (dev_rev == 0x02000031))
00477 db->chip_type = 1;
00478 else
00479 db->chip_type = 0;
00480
00481 dprintf(("Chip type : %d\n", db->chip_type));
00482
00483
00484 for (i = 0; i < 64; i++)
00485 ((u16 *) db->srom)[i] = cpu_to_le16(read_srom_word(BASE, i));
00486
00487
00488 for (i = 0; i < 6; i++)
00489 nic->node_addr[i] = db->srom[20 + i];
00490
00491
00492 DBG ( "%s: %s at ioaddr %4.4lx\n", pci->driver_name, eth_ntoa ( nic->node_addr ), BASE );
00493
00494
00495 adjust_pci_device(pci);
00496
00497 dmfe_reset(nic);
00498
00499 nic->irqno = 0;
00500 nic->ioaddr = pci->ioaddr;
00501
00502
00503 nic->nic_op = &dmfe_operations;
00504
00505 return 1;
00506 }
00507
00508
00509
00510
00511
00512
00513 static void dmfe_descriptor_init(struct nic *nic __unused, unsigned long ioaddr)
00514 {
00515 int i;
00516 db->cur_tx = 0;
00517 db->cur_rx = 0;
00518
00519
00520 outl(virt_to_le32desc(&txd[0]), ioaddr + DCR4);
00521
00522
00523 outl(virt_to_le32desc(&rxd[0]), ioaddr + DCR3);
00524
00525
00526 for (i = 0; i < TX_DESC_CNT; i++) {
00527 txd[i].tx_buf_ptr = &txb[i];
00528 txd[i].tdes0 = cpu_to_le32(0);
00529 txd[i].tdes1 = cpu_to_le32(0x81000000);
00530 txd[i].tdes2 = cpu_to_le32(virt_to_bus(&txb[i]));
00531 txd[i].tdes3 = cpu_to_le32(virt_to_bus(&txd[i + 1]));
00532 txd[i].next_tx_desc = &txd[i + 1];
00533 }
00534
00535 txd[i - 1].tdes3 = virt_to_le32desc(&txd[0]);
00536 txd[i - 1].next_tx_desc = &txd[0];
00537
00538
00539 for (i = 0; i < RX_DESC_CNT; i++) {
00540 rxd[i].rx_skb_ptr = &rxb[i * RX_ALLOC_SIZE];
00541 rxd[i].rdes0 = cpu_to_le32(0x80000000);
00542 rxd[i].rdes1 = cpu_to_le32(0x01000600);
00543 rxd[i].rdes2 =
00544 cpu_to_le32(virt_to_bus(&rxb[i * RX_ALLOC_SIZE]));
00545 rxd[i].rdes3 = cpu_to_le32(virt_to_bus(&rxd[i + 1]));
00546 rxd[i].next_rx_desc = &rxd[i + 1];
00547 }
00548
00549 rxd[i - 1].rdes3 = cpu_to_le32(virt_to_bus(&rxd[0]));
00550 rxd[i - 1].next_rx_desc = &rxd[0];
00551
00552 }
00553
00554
00555
00556
00557
00558
00559 static void update_cr6(u32 cr6_data, unsigned long ioaddr)
00560 {
00561 u32 cr6_tmp;
00562
00563 cr6_tmp = cr6_data & ~0x2002;
00564 outl(cr6_tmp, ioaddr + DCR6);
00565 udelay(5);
00566 outl(cr6_data, ioaddr + DCR6);
00567 udelay(5);
00568 }
00569
00570
00571
00572
00573
00574
00575
00576 static void dm9132_id_table(struct nic *nic __unused)
00577 {
00578 #ifdef LINUX
00579 u16 *addrptr;
00580 u8 dmi_addr[8];
00581 unsigned long ioaddr = BASE + 0xc0;
00582 u32 hash_val;
00583 u16 i, hash_table[4];
00584 #endif
00585 dprintf(("dm9132_id_table\n"));
00586
00587 printf("FIXME: This function is broken. If you have this card contact "
00588 "Timothy Legge at the etherboot-user list\n");
00589
00590 #ifdef LINUX
00591
00592
00593
00594 addrptr = (u16 *) nic->node_addr;
00595 outw(addrptr[0], ioaddr);
00596 ioaddr += 4;
00597 outw(addrptr[1], ioaddr);
00598 ioaddr += 4;
00599 outw(addrptr[2], ioaddr);
00600 ioaddr += 4;
00601
00602
00603 for (i = 0; i < 4; i++)
00604 hash_table[i] = 0x0;
00605
00606
00607 hash_table[3] = 0x8000;
00608
00609
00610 for (mcptr = mc_list, i = 0; i < mc_cnt; i++, mcptr = mcptr->next) {
00611 hash_val = cal_CRC((char *) mcptr->dmi_addr, 6, 0) & 0x3f;
00612 hash_table[hash_val / 16] |= (u16) 1 << (hash_val % 16);
00613 }
00614
00615
00616 for (i = 0; i < 4; i++, ioaddr += 4)
00617 outw(hash_table[i], ioaddr);
00618 #endif
00619 }
00620
00621
00622
00623
00624
00625
00626
00627 static void send_filter_frame(struct nic *nic)
00628 {
00629
00630 u8 *ptxb;
00631 int i;
00632
00633 dprintf(("send_filter_frame\n"));
00634
00635 ptxb = &txb[db->cur_tx];
00636
00637
00638
00639 for (i = 0; i < 192; i++)
00640 ptxb[i] = 0xFF;
00641 ptxb[0] = nic->node_addr[0];
00642 ptxb[1] = nic->node_addr[1];
00643 ptxb[4] = nic->node_addr[2];
00644 ptxb[5] = nic->node_addr[3];
00645 ptxb[8] = nic->node_addr[4];
00646 ptxb[9] = nic->node_addr[5];
00647
00648
00649 txd[db->cur_tx].tdes1 = cpu_to_le32(0x890000c0);
00650 txd[db->cur_tx].tdes0 = cpu_to_le32(0x80000000);
00651 update_cr6(db->cr6_data | 0x2000, BASE);
00652 outl(0x1, BASE + DCR1);
00653 update_cr6(db->cr6_data, BASE);
00654 db->cur_tx++;
00655 }
00656
00657
00658
00659
00660
00661 static u16 read_srom_word(long ioaddr, int offset)
00662 {
00663 int i;
00664 u16 srom_data = 0;
00665 long cr9_ioaddr = ioaddr + DCR9;
00666
00667 outl(CR9_SROM_READ, cr9_ioaddr);
00668 outl(CR9_SROM_READ | CR9_SRCS, cr9_ioaddr);
00669
00670
00671 SROM_CLK_WRITE(SROM_DATA_1, cr9_ioaddr);
00672 SROM_CLK_WRITE(SROM_DATA_1, cr9_ioaddr);
00673 SROM_CLK_WRITE(SROM_DATA_0, cr9_ioaddr);
00674
00675
00676 for (i = 5; i >= 0; i--) {
00677 srom_data =
00678 (offset & (1 << i)) ? SROM_DATA_1 : SROM_DATA_0;
00679 SROM_CLK_WRITE(srom_data, cr9_ioaddr);
00680 }
00681
00682 outl(CR9_SROM_READ | CR9_SRCS, cr9_ioaddr);
00683
00684 for (i = 16; i > 0; i--) {
00685 outl(CR9_SROM_READ | CR9_SRCS | CR9_SRCLK, cr9_ioaddr);
00686 udelay(5);
00687 srom_data =
00688 (srom_data << 1) | ((inl(cr9_ioaddr) & CR9_CRDOUT) ? 1
00689 : 0);
00690 outl(CR9_SROM_READ | CR9_SRCS, cr9_ioaddr);
00691 udelay(5);
00692 }
00693
00694 outl(CR9_SROM_READ, cr9_ioaddr);
00695 return srom_data;
00696 }
00697
00698
00699
00700
00701
00702
00703 #if 0
00704 static u8 dmfe_sense_speed(struct nic *nic __unused)
00705 {
00706 u8 ErrFlag = 0;
00707 u16 phy_mode;
00708
00709
00710 update_cr6((db->cr6_data & ~0x40000), BASE);
00711
00712 phy_mode = phy_read(BASE, db->phy_addr, 1, db->chip_id);
00713 phy_mode = phy_read(BASE, db->phy_addr, 1, db->chip_id);
00714
00715 if ((phy_mode & 0x24) == 0x24) {
00716 if (db->chip_id == PCI_DM9132_ID)
00717 phy_mode =
00718 phy_read(BASE, db->phy_addr, 7,
00719 db->chip_id) & 0xf000;
00720 else
00721 phy_mode =
00722 phy_read(BASE, db->phy_addr, 17,
00723 db->chip_id) & 0xf000;
00724
00725 switch (phy_mode) {
00726 case 0x1000:
00727 db->op_mode = DMFE_10MHF;
00728 break;
00729 case 0x2000:
00730 db->op_mode = DMFE_10MFD;
00731 break;
00732 case 0x4000:
00733 db->op_mode = DMFE_100MHF;
00734 break;
00735 case 0x8000:
00736 db->op_mode = DMFE_100MFD;
00737 break;
00738 default:
00739 db->op_mode = DMFE_10MHF;
00740 ErrFlag = 1;
00741 break;
00742 }
00743 } else {
00744 db->op_mode = DMFE_10MHF;
00745
00746 ErrFlag = 1;
00747 }
00748
00749 return ErrFlag;
00750 }
00751 #endif
00752
00753
00754
00755
00756
00757
00758
00759 static void dmfe_set_phyxcer(struct nic *nic __unused)
00760 {
00761 u16 phy_reg;
00762
00763
00764 db->cr6_data &= ~0x40000;
00765 update_cr6(db->cr6_data, BASE);
00766
00767
00768 if (db->chip_id == PCI_DM9009_ID) {
00769 phy_reg =
00770 phy_read(BASE, db->phy_addr, 18,
00771 db->chip_id) & ~0x1000;
00772 phy_write(BASE, db->phy_addr, 18, phy_reg, db->chip_id);
00773 }
00774
00775
00776 phy_reg = phy_read(BASE, db->phy_addr, 4, db->chip_id) & ~0x01e0;
00777
00778 if (db->media_mode & DMFE_AUTO) {
00779
00780 phy_reg |= db->PHY_reg4;
00781 } else {
00782
00783 switch (db->media_mode) {
00784 case DMFE_10MHF:
00785 phy_reg |= 0x20;
00786 break;
00787 case DMFE_10MFD:
00788 phy_reg |= 0x40;
00789 break;
00790 case DMFE_100MHF:
00791 phy_reg |= 0x80;
00792 break;
00793 case DMFE_100MFD:
00794 phy_reg |= 0x100;
00795 break;
00796 }
00797 if (db->chip_id == PCI_DM9009_ID)
00798 phy_reg &= 0x61;
00799 }
00800
00801
00802 if (!(phy_reg & 0x01e0)) {
00803 phy_reg |= db->PHY_reg4;
00804 db->media_mode |= DMFE_AUTO;
00805 }
00806 phy_write(BASE, db->phy_addr, 4, phy_reg, db->chip_id);
00807
00808
00809 if (db->chip_type && (db->chip_id == PCI_DM9102_ID))
00810 phy_write(BASE, db->phy_addr, 0, 0x1800, db->chip_id);
00811 if (!db->chip_type)
00812 phy_write(BASE, db->phy_addr, 0, 0x1200, db->chip_id);
00813 }
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823 #if 0
00824 static void dmfe_process_mode(struct nic *nic __unused)
00825 {
00826 u16 phy_reg;
00827
00828
00829 if (db->op_mode & 0x4)
00830 db->cr6_data |= CR6_FDM;
00831 else
00832 db->cr6_data &= ~CR6_FDM;
00833
00834
00835 if (db->op_mode & 0x10)
00836 db->cr6_data |= 0x40000;
00837 else
00838 db->cr6_data &= ~0x40000;
00839
00840 update_cr6(db->cr6_data, BASE);
00841
00842
00843 if (!(db->media_mode & 0x18)) {
00844
00845 phy_reg = phy_read(BASE, db->phy_addr, 6, db->chip_id);
00846 if (!(phy_reg & 0x1)) {
00847
00848 phy_reg = 0x0;
00849 switch (db->op_mode) {
00850 case DMFE_10MHF:
00851 phy_reg = 0x0;
00852 break;
00853 case DMFE_10MFD:
00854 phy_reg = 0x100;
00855 break;
00856 case DMFE_100MHF:
00857 phy_reg = 0x2000;
00858 break;
00859 case DMFE_100MFD:
00860 phy_reg = 0x2100;
00861 break;
00862 }
00863 phy_write(BASE, db->phy_addr, 0, phy_reg,
00864 db->chip_id);
00865 if (db->chip_type
00866 && (db->chip_id == PCI_DM9102_ID))
00867 mdelay(20);
00868 phy_write(BASE, db->phy_addr, 0, phy_reg,
00869 db->chip_id);
00870 }
00871 }
00872 }
00873 #endif
00874
00875
00876
00877
00878
00879 static void phy_write(unsigned long iobase, u8 phy_addr, u8 offset,
00880 u16 phy_data, u32 chip_id)
00881 {
00882 u16 i;
00883 unsigned long ioaddr;
00884
00885 if (chip_id == PCI_DM9132_ID) {
00886 ioaddr = iobase + 0x80 + offset * 4;
00887 outw(phy_data, ioaddr);
00888 } else {
00889
00890 ioaddr = iobase + DCR9;
00891
00892
00893 for (i = 0; i < 35; i++)
00894 phy_write_1bit(ioaddr, PHY_DATA_1);
00895
00896
00897 phy_write_1bit(ioaddr, PHY_DATA_0);
00898 phy_write_1bit(ioaddr, PHY_DATA_1);
00899
00900
00901 phy_write_1bit(ioaddr, PHY_DATA_0);
00902 phy_write_1bit(ioaddr, PHY_DATA_1);
00903
00904
00905 for (i = 0x10; i > 0; i = i >> 1)
00906 phy_write_1bit(ioaddr,
00907 phy_addr & i ? PHY_DATA_1 :
00908 PHY_DATA_0);
00909
00910
00911 for (i = 0x10; i > 0; i = i >> 1)
00912 phy_write_1bit(ioaddr,
00913 offset & i ? PHY_DATA_1 :
00914 PHY_DATA_0);
00915
00916
00917 phy_write_1bit(ioaddr, PHY_DATA_1);
00918 phy_write_1bit(ioaddr, PHY_DATA_0);
00919
00920
00921 for (i = 0x8000; i > 0; i >>= 1)
00922 phy_write_1bit(ioaddr,
00923 phy_data & i ? PHY_DATA_1 :
00924 PHY_DATA_0);
00925 }
00926 }
00927
00928
00929
00930
00931
00932
00933 static u16 phy_read(unsigned long iobase, u8 phy_addr, u8 offset,
00934 u32 chip_id)
00935 {
00936 int i;
00937 u16 phy_data;
00938 unsigned long ioaddr;
00939
00940 if (chip_id == PCI_DM9132_ID) {
00941
00942 ioaddr = iobase + 0x80 + offset * 4;
00943 phy_data = inw(ioaddr);
00944 } else {
00945
00946 ioaddr = iobase + DCR9;
00947
00948
00949 for (i = 0; i < 35; i++)
00950 phy_write_1bit(ioaddr, PHY_DATA_1);
00951
00952
00953 phy_write_1bit(ioaddr, PHY_DATA_0);
00954 phy_write_1bit(ioaddr, PHY_DATA_1);
00955
00956
00957 phy_write_1bit(ioaddr, PHY_DATA_1);
00958 phy_write_1bit(ioaddr, PHY_DATA_0);
00959
00960
00961 for (i = 0x10; i > 0; i = i >> 1)
00962 phy_write_1bit(ioaddr,
00963 phy_addr & i ? PHY_DATA_1 :
00964 PHY_DATA_0);
00965
00966
00967 for (i = 0x10; i > 0; i = i >> 1)
00968 phy_write_1bit(ioaddr,
00969 offset & i ? PHY_DATA_1 :
00970 PHY_DATA_0);
00971
00972
00973 phy_read_1bit(ioaddr);
00974
00975
00976 for (phy_data = 0, i = 0; i < 16; i++) {
00977 phy_data <<= 1;
00978 phy_data |= phy_read_1bit(ioaddr);
00979 }
00980 }
00981
00982 return phy_data;
00983 }
00984
00985
00986
00987
00988
00989
00990 static void phy_write_1bit(unsigned long ioaddr, u32 phy_data)
00991 {
00992 outl(phy_data, ioaddr);
00993 udelay(1);
00994 outl(phy_data | MDCLKH, ioaddr);
00995 udelay(1);
00996 outl(phy_data, ioaddr);
00997 udelay(1);
00998 }
00999
01000
01001
01002
01003
01004
01005 static u16 phy_read_1bit(unsigned long ioaddr)
01006 {
01007 u16 phy_data;
01008
01009 outl(0x50000, ioaddr);
01010 udelay(1);
01011 phy_data = (inl(ioaddr) >> 19) & 0x1;
01012 outl(0x40000, ioaddr);
01013 udelay(1);
01014
01015 return phy_data;
01016 }
01017
01018
01019
01020
01021
01022
01023 static void dmfe_parse_srom(struct nic *nic)
01024 {
01025 unsigned char *srom = db->srom;
01026 int dmfe_mode, tmp_reg;
01027
01028
01029 db->cr15_data = CR15_DEFAULT;
01030
01031
01032 if (((int) srom[18] & 0xff) == SROM_V41_CODE) {
01033
01034
01035 db->NIC_capability = *(u16 *) (srom + 34);
01036 db->PHY_reg4 = 0;
01037 for (tmp_reg = 1; tmp_reg < 0x10; tmp_reg <<= 1) {
01038 switch (db->NIC_capability & tmp_reg) {
01039 case 0x1:
01040 db->PHY_reg4 |= 0x0020;
01041 break;
01042 case 0x2:
01043 db->PHY_reg4 |= 0x0040;
01044 break;
01045 case 0x4:
01046 db->PHY_reg4 |= 0x0080;
01047 break;
01048 case 0x8:
01049 db->PHY_reg4 |= 0x0100;
01050 break;
01051 }
01052 }
01053
01054
01055 dmfe_mode = *((int *) srom + 34) & *((int *) srom + 36);
01056 switch (dmfe_mode) {
01057 case 0x4:
01058 dmfe_media_mode = DMFE_100MHF;
01059 break;
01060 case 0x2:
01061 dmfe_media_mode = DMFE_10MFD;
01062 break;
01063 case 0x8:
01064 dmfe_media_mode = DMFE_100MFD;
01065 break;
01066 case 0x100:
01067 case 0x200:
01068 dmfe_media_mode = DMFE_1M_HPNA;
01069 break;
01070 }
01071
01072
01073
01074 if ((SF_mode & 0x1) || (srom[43] & 0x80))
01075 db->cr15_data |= 0x40;
01076
01077
01078 if ((SF_mode & 0x2) || (srom[40] & 0x1))
01079 db->cr15_data |= 0x400;
01080
01081
01082 if ((SF_mode & 0x4) || (srom[40] & 0xe))
01083 db->cr15_data |= 0x9800;
01084 }
01085
01086
01087 db->HPNA_command = 1;
01088
01089
01090 if (HPNA_rx_cmd == 0)
01091 db->HPNA_command |= 0x8000;
01092
01093
01094 if (HPNA_tx_cmd == 1)
01095 switch (HPNA_mode) {
01096 case 0:
01097 db->HPNA_command |= 0x0904;
01098 break;
01099 case 1:
01100 db->HPNA_command |= 0x0a00;
01101 break;
01102 case 2:
01103 db->HPNA_command |= 0x0506;
01104 break;
01105 case 3:
01106 db->HPNA_command |= 0x0602;
01107 break;
01108 } else
01109 switch (HPNA_mode) {
01110 case 0:
01111 db->HPNA_command |= 0x0004;
01112 break;
01113 case 1:
01114 db->HPNA_command |= 0x0000;
01115 break;
01116 case 2:
01117 db->HPNA_command |= 0x0006;
01118 break;
01119 case 3:
01120 db->HPNA_command |= 0x0002;
01121 break;
01122 }
01123
01124
01125 db->HPNA_present = 0;
01126 update_cr6(db->cr6_data | 0x40000, BASE);
01127 tmp_reg = phy_read(BASE, db->phy_addr, 3, db->chip_id);
01128 if ((tmp_reg & 0xfff0) == 0xb900) {
01129
01130 db->HPNA_timer = 8;
01131 if (phy_read(BASE, db->phy_addr, 31, db->chip_id) ==
01132 0x4404) {
01133
01134 db->HPNA_present = 1;
01135 dmfe_program_DM9801(nic, tmp_reg);
01136 } else {
01137
01138 db->HPNA_present = 2;
01139 dmfe_program_DM9802(nic);
01140 }
01141 }
01142
01143 }
01144
01145
01146
01147
01148
01149 static void dmfe_program_DM9801(struct nic *nic __unused, int HPNA_rev)
01150 {
01151 u32 reg17, reg25;
01152
01153 if (!HPNA_NoiseFloor)
01154 HPNA_NoiseFloor = DM9801_NOISE_FLOOR;
01155 switch (HPNA_rev) {
01156 case 0xb900:
01157 db->HPNA_command |= 0x1000;
01158 reg25 = phy_read(BASE, db->phy_addr, 24, db->chip_id);
01159 reg25 = ((reg25 + HPNA_NoiseFloor) & 0xff) | 0xf000;
01160 reg17 = phy_read(BASE, db->phy_addr, 17, db->chip_id);
01161 break;
01162 case 0xb901:
01163 reg25 = phy_read(BASE, db->phy_addr, 25, db->chip_id);
01164 reg25 = (reg25 & 0xff00) + HPNA_NoiseFloor;
01165 reg17 = phy_read(BASE, db->phy_addr, 17, db->chip_id);
01166 reg17 = (reg17 & 0xfff0) + HPNA_NoiseFloor + 3;
01167 break;
01168 case 0xb902:
01169 case 0xb903:
01170 default:
01171 db->HPNA_command |= 0x1000;
01172 reg25 = phy_read(BASE, db->phy_addr, 25, db->chip_id);
01173 reg25 = (reg25 & 0xff00) + HPNA_NoiseFloor - 5;
01174 reg17 = phy_read(BASE, db->phy_addr, 17, db->chip_id);
01175 reg17 = (reg17 & 0xfff0) + HPNA_NoiseFloor;
01176 break;
01177 }
01178 phy_write(BASE, db->phy_addr, 16, db->HPNA_command, db->chip_id);
01179 phy_write(BASE, db->phy_addr, 17, reg17, db->chip_id);
01180 phy_write(BASE, db->phy_addr, 25, reg25, db->chip_id);
01181 }
01182
01183
01184
01185
01186
01187
01188 static void dmfe_program_DM9802(struct nic *nic __unused)
01189 {
01190 u32 phy_reg;
01191
01192 if (!HPNA_NoiseFloor)
01193 HPNA_NoiseFloor = DM9802_NOISE_FLOOR;
01194 phy_write(BASE, db->phy_addr, 16, db->HPNA_command, db->chip_id);
01195 phy_reg = phy_read(BASE, db->phy_addr, 25, db->chip_id);
01196 phy_reg = (phy_reg & 0xff00) + HPNA_NoiseFloor;
01197 phy_write(BASE, db->phy_addr, 25, phy_reg, db->chip_id);
01198 }
01199
01200 static struct nic_operations dmfe_operations = {
01201 .connect = dummy_connect,
01202 .poll = dmfe_poll,
01203 .transmit = dmfe_transmit,
01204 .irq = dmfe_irq,
01205
01206 };
01207
01208 static struct pci_device_id dmfe_nics[] = {
01209 PCI_ROM(0x1282, 0x9100, "dmfe9100", "Davicom 9100", 0),
01210 PCI_ROM(0x1282, 0x9102, "dmfe9102", "Davicom 9102", 0),
01211 PCI_ROM(0x1282, 0x9009, "dmfe9009", "Davicom 9009", 0),
01212 PCI_ROM(0x1282, 0x9132, "dmfe9132", "Davicom 9132", 0),
01213 };
01214
01215 PCI_DRIVER ( dmfe_driver, dmfe_nics, PCI_NO_CLASS );
01216
01217 DRIVER ( "DMFE/PCI", nic_driver, pci_driver, dmfe_driver,
01218 dmfe_probe, dmfe_disable );
01219
01220
01221
01222
01223
01224
01225
01226