00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 FILE_LICENCE ( GPL2_OR_LATER );
00025
00026 #include "atl1e.h"
00027
00028
00029 #define TX_DESC_COUNT 32
00030 #define RX_MEM_SIZE 8192
00031 #define MAX_FRAME_SIZE 1500
00032
00033
00034 #define PREAMBLE_LEN 7
00035 #define RX_JUMBO_THRESH ((MAX_FRAME_SIZE + ETH_HLEN + \
00036 VLAN_HLEN + ETH_FCS_LEN + 7) >> 3)
00037 #define IMT_VAL 100
00038 #define ICT_VAL 50000
00039 #define SMB_TIMER 200000
00040 #define RRD_THRESH 1
00041 #define TPD_BURST 5
00042 #define TPD_THRESH (TX_DESC_COUNT / 2)
00043 #define RX_COUNT_DOWN 4
00044 #define TX_COUNT_DOWN (IMT_VAL * 4 / 3)
00045 #define DMAR_DLY_CNT 15
00046 #define DMAW_DLY_CNT 4
00047
00048 #define PCI_DEVICE_ID_ATTANSIC_L1E 0x1026
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 static struct pci_device_id atl1e_pci_tbl[] = {
00060 PCI_ROM(0x1969, 0x1026, "atl1e_26", "Attansic L1E 0x1026", 0),
00061 PCI_ROM(0x1969, 0x1066, "atl1e_66", "Attansic L1E 0x1066", 0),
00062 };
00063
00064 static void atl1e_setup_mac_ctrl(struct atl1e_adapter *adapter);
00065
00066 static const u16
00067 atl1e_rx_page_vld_regs[AT_PAGE_NUM_PER_QUEUE] =
00068 {
00069 REG_HOST_RXF0_PAGE0_VLD, REG_HOST_RXF0_PAGE1_VLD
00070 };
00071
00072 static const u16
00073 atl1e_rx_page_lo_addr_regs[AT_PAGE_NUM_PER_QUEUE] =
00074 {
00075 REG_HOST_RXF0_PAGE0_LO, REG_HOST_RXF0_PAGE1_LO
00076 };
00077
00078 static const u16
00079 atl1e_rx_page_write_offset_regs[AT_PAGE_NUM_PER_QUEUE] =
00080 {
00081 REG_HOST_RXF0_MB0_LO, REG_HOST_RXF0_MB1_LO
00082 };
00083
00084 static const u16 atl1e_pay_load_size[] = {
00085 128, 256, 512, 1024, 2048, 4096,
00086 };
00087
00088
00089
00090
00091
00092 static inline void atl1e_irq_enable(struct atl1e_adapter *adapter)
00093 {
00094 AT_WRITE_REG(&adapter->hw, REG_ISR, 0);
00095 AT_WRITE_REG(&adapter->hw, REG_IMR, IMR_NORMAL_MASK);
00096 AT_WRITE_FLUSH(&adapter->hw);
00097 }
00098
00099
00100
00101
00102
00103 static inline void atl1e_irq_disable(struct atl1e_adapter *adapter)
00104 {
00105 AT_WRITE_REG(&adapter->hw, REG_IMR, 0);
00106 AT_WRITE_FLUSH(&adapter->hw);
00107 }
00108
00109
00110
00111
00112
00113 static inline void atl1e_irq_reset(struct atl1e_adapter *adapter)
00114 {
00115 AT_WRITE_REG(&adapter->hw, REG_ISR, 0);
00116 AT_WRITE_REG(&adapter->hw, REG_IMR, 0);
00117 AT_WRITE_FLUSH(&adapter->hw);
00118 }
00119
00120 static void atl1e_reset(struct atl1e_adapter *adapter)
00121 {
00122 atl1e_down(adapter);
00123 atl1e_up(adapter);
00124 }
00125
00126 static int atl1e_check_link(struct atl1e_adapter *adapter)
00127 {
00128 struct atl1e_hw *hw = &adapter->hw;
00129 struct net_device *netdev = adapter->netdev;
00130 int err = 0;
00131 u16 speed, duplex, phy_data;
00132
00133
00134 atl1e_read_phy_reg(hw, MII_BMSR, &phy_data);
00135 atl1e_read_phy_reg(hw, MII_BMSR, &phy_data);
00136
00137 if ((phy_data & BMSR_LSTATUS) == 0) {
00138
00139 if (netdev_link_ok(netdev)) {
00140 u32 value;
00141
00142 value = AT_READ_REG(hw, REG_MAC_CTRL);
00143 value &= ~MAC_CTRL_RX_EN;
00144 AT_WRITE_REG(hw, REG_MAC_CTRL, value);
00145 adapter->link_speed = SPEED_0;
00146
00147 DBG("atl1e: %s link is down\n", netdev->name);
00148 netdev_link_down(netdev);
00149 }
00150 } else {
00151
00152 err = atl1e_get_speed_and_duplex(hw, &speed, &duplex);
00153 if (err)
00154 return err;
00155
00156
00157 if (adapter->link_speed != speed ||
00158 adapter->link_duplex != duplex) {
00159 adapter->link_speed = speed;
00160 adapter->link_duplex = duplex;
00161 atl1e_setup_mac_ctrl(adapter);
00162
00163 DBG("atl1e: %s link is up, %d Mbps, %s duplex\n",
00164 netdev->name, adapter->link_speed,
00165 adapter->link_duplex == FULL_DUPLEX ?
00166 "full" : "half");
00167 netdev_link_up(netdev);
00168 }
00169 }
00170 return 0;
00171 }
00172
00173 static int atl1e_mdio_read(struct net_device *netdev, int phy_id __unused,
00174 int reg_num)
00175 {
00176 struct atl1e_adapter *adapter = netdev_priv(netdev);
00177 u16 result;
00178
00179 atl1e_read_phy_reg(&adapter->hw, reg_num & MDIO_REG_ADDR_MASK, &result);
00180 return result;
00181 }
00182
00183 static void atl1e_mdio_write(struct net_device *netdev, int phy_id __unused,
00184 int reg_num, int val)
00185 {
00186 struct atl1e_adapter *adapter = netdev_priv(netdev);
00187
00188 atl1e_write_phy_reg(&adapter->hw, reg_num & MDIO_REG_ADDR_MASK, val);
00189 }
00190
00191 static void atl1e_setup_pcicmd(struct pci_device *pdev)
00192 {
00193 u16 cmd;
00194
00195 pci_read_config_word(pdev, PCI_COMMAND, &cmd);
00196 cmd |= (PCI_COMMAND_MEM | PCI_COMMAND_MASTER);
00197 pci_write_config_word(pdev, PCI_COMMAND, cmd);
00198
00199
00200
00201
00202
00203
00204 pci_write_config_dword(pdev, REG_PM_CTRLSTAT, 0);
00205 mdelay(1);
00206 }
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 static int atl1e_sw_init(struct atl1e_adapter *adapter)
00217 {
00218 struct atl1e_hw *hw = &adapter->hw;
00219 struct pci_device *pdev = adapter->pdev;
00220 u32 phy_status_data = 0;
00221 u8 rev_id = 0;
00222
00223 adapter->link_speed = SPEED_0;
00224 adapter->link_duplex = FULL_DUPLEX;
00225
00226
00227 pci_read_config_byte(pdev, PCI_REVISION_ID, &rev_id);
00228
00229 phy_status_data = AT_READ_REG(hw, REG_PHY_STATUS);
00230
00231 if (rev_id >= 0xF0) {
00232 hw->nic_type = athr_l2e_revB;
00233 } else {
00234 if (phy_status_data & PHY_STATUS_100M)
00235 hw->nic_type = athr_l1e;
00236 else
00237 hw->nic_type = athr_l2e_revA;
00238 }
00239
00240 phy_status_data = AT_READ_REG(hw, REG_PHY_STATUS);
00241
00242 hw->emi_ca = !!(phy_status_data & PHY_STATUS_EMI_CA);
00243
00244 hw->phy_configured = 0;
00245
00246
00247
00248 hw->dmar_block = atl1e_dma_req_1024;
00249 hw->dmaw_block = atl1e_dma_req_1024;
00250
00251 netdev_link_down(adapter->netdev);
00252
00253 return 0;
00254 }
00255
00256
00257
00258
00259
00260 static void atl1e_clean_tx_ring(struct atl1e_adapter *adapter)
00261 {
00262 struct atl1e_tx_ring *tx_ring = (struct atl1e_tx_ring *)
00263 &adapter->tx_ring;
00264 struct atl1e_tx_buffer *tx_buffer = NULL;
00265 u16 index, ring_count = tx_ring->count;
00266
00267 if (tx_ring->desc == NULL || tx_ring->tx_buffer == NULL)
00268 return;
00269
00270 for (index = 0; index < ring_count; index++) {
00271 tx_buffer = &tx_ring->tx_buffer[index];
00272 if (tx_buffer->iob) {
00273 netdev_tx_complete(adapter->netdev, tx_buffer->iob);
00274 tx_buffer->dma = 0;
00275 tx_buffer->iob = NULL;
00276 }
00277 }
00278
00279
00280 memset(tx_ring->desc, 0, sizeof(struct atl1e_tpd_desc) *
00281 ring_count);
00282 memset(tx_ring->tx_buffer, 0, sizeof(struct atl1e_tx_buffer) *
00283 ring_count);
00284 }
00285
00286
00287
00288
00289
00290 static void atl1e_clean_rx_ring(struct atl1e_adapter *adapter)
00291 {
00292 struct atl1e_rx_ring *rx_ring =
00293 (struct atl1e_rx_ring *)&adapter->rx_ring;
00294 struct atl1e_rx_page_desc *rx_page_desc = &rx_ring->rx_page_desc;
00295 u16 j;
00296
00297 if (adapter->ring_vir_addr == NULL)
00298 return;
00299
00300
00301 for (j = 0; j < AT_PAGE_NUM_PER_QUEUE; j++) {
00302 if (rx_page_desc->rx_page[j].addr != NULL) {
00303 memset(rx_page_desc->rx_page[j].addr, 0,
00304 rx_ring->real_page_size);
00305 }
00306 }
00307 }
00308
00309 static void atl1e_cal_ring_size(struct atl1e_adapter *adapter, u32 *ring_size)
00310 {
00311 *ring_size = ((u32)(adapter->tx_ring.count *
00312 sizeof(struct atl1e_tpd_desc) + 7
00313
00314 + adapter->rx_ring.real_page_size * AT_PAGE_NUM_PER_QUEUE
00315 + 31
00316
00317 + (1 + AT_PAGE_NUM_PER_QUEUE) *
00318 sizeof(u32) + 3));
00319
00320 }
00321
00322 static void atl1e_init_ring_resources(struct atl1e_adapter *adapter)
00323 {
00324 struct atl1e_tx_ring *tx_ring = NULL;
00325 struct atl1e_rx_ring *rx_ring = NULL;
00326
00327 tx_ring = &adapter->tx_ring;
00328 rx_ring = &adapter->rx_ring;
00329
00330 rx_ring->real_page_size = adapter->rx_ring.page_size
00331 + MAX_FRAME_SIZE
00332 + ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN;
00333 rx_ring->real_page_size = (rx_ring->real_page_size + 31) & ~31;
00334 atl1e_cal_ring_size(adapter, &adapter->ring_size);
00335
00336 adapter->ring_vir_addr = NULL;
00337 adapter->rx_ring.desc = NULL;
00338
00339 return;
00340 }
00341
00342
00343
00344
00345 static void atl1e_init_ring_ptrs(struct atl1e_adapter *adapter)
00346 {
00347 struct atl1e_tx_ring *tx_ring = NULL;
00348 struct atl1e_rx_ring *rx_ring = NULL;
00349 struct atl1e_rx_page_desc *rx_page_desc = NULL;
00350 int j;
00351
00352 tx_ring = &adapter->tx_ring;
00353 rx_ring = &adapter->rx_ring;
00354 rx_page_desc = &rx_ring->rx_page_desc;
00355
00356 tx_ring->next_to_use = 0;
00357 tx_ring->next_to_clean = 0;
00358
00359 rx_page_desc->rx_using = 0;
00360 rx_page_desc->rx_nxseq = 0;
00361 for (j = 0; j < AT_PAGE_NUM_PER_QUEUE; j++) {
00362 *rx_page_desc->rx_page[j].write_offset_addr = 0;
00363 rx_page_desc->rx_page[j].read_offset = 0;
00364 }
00365 }
00366
00367
00368
00369
00370
00371
00372
00373 static void atl1e_free_ring_resources(struct atl1e_adapter *adapter)
00374 {
00375 atl1e_clean_tx_ring(adapter);
00376 atl1e_clean_rx_ring(adapter);
00377
00378 if (adapter->ring_vir_addr) {
00379 free_dma(adapter->ring_vir_addr, adapter->ring_size);
00380 adapter->ring_vir_addr = NULL;
00381 adapter->ring_dma = 0;
00382 }
00383
00384 if (adapter->tx_ring.tx_buffer) {
00385 free(adapter->tx_ring.tx_buffer);
00386 adapter->tx_ring.tx_buffer = NULL;
00387 }
00388 }
00389
00390
00391
00392
00393
00394
00395
00396 static int atl1e_setup_ring_resources(struct atl1e_adapter *adapter)
00397 {
00398 struct atl1e_tx_ring *tx_ring;
00399 struct atl1e_rx_ring *rx_ring;
00400 struct atl1e_rx_page_desc *rx_page_desc;
00401 int size, j;
00402 u32 offset = 0;
00403 int err = 0;
00404
00405 if (adapter->ring_vir_addr != NULL)
00406 return 0;
00407
00408 tx_ring = &adapter->tx_ring;
00409 rx_ring = &adapter->rx_ring;
00410
00411
00412
00413 size = adapter->ring_size;
00414 adapter->ring_vir_addr = malloc_dma(adapter->ring_size, 32);
00415
00416 if (adapter->ring_vir_addr == NULL) {
00417 DBG("atl1e: out of memory allocating %d bytes for %s ring\n",
00418 adapter->ring_size, adapter->netdev->name);
00419 return -ENOMEM;
00420 }
00421
00422 adapter->ring_dma = virt_to_bus(adapter->ring_vir_addr);
00423 memset(adapter->ring_vir_addr, 0, adapter->ring_size);
00424
00425 rx_page_desc = &rx_ring->rx_page_desc;
00426
00427
00428 tx_ring->dma = (adapter->ring_dma + 7) & ~7;
00429 offset = tx_ring->dma - adapter->ring_dma;
00430 tx_ring->desc = (struct atl1e_tpd_desc *)
00431 (adapter->ring_vir_addr + offset);
00432 size = sizeof(struct atl1e_tx_buffer) * (tx_ring->count);
00433 tx_ring->tx_buffer = zalloc(size);
00434 if (tx_ring->tx_buffer == NULL) {
00435 DBG("atl1e: out of memory allocating %d bytes for %s txbuf\n",
00436 size, adapter->netdev->name);
00437 err = -ENOMEM;
00438 goto failed;
00439 }
00440
00441
00442 offset += (sizeof(struct atl1e_tpd_desc) * tx_ring->count);
00443 offset = (offset + 31) & ~31;
00444
00445 for (j = 0; j < AT_PAGE_NUM_PER_QUEUE; j++) {
00446 rx_page_desc->rx_page[j].dma =
00447 adapter->ring_dma + offset;
00448 rx_page_desc->rx_page[j].addr =
00449 adapter->ring_vir_addr + offset;
00450 offset += rx_ring->real_page_size;
00451 }
00452
00453
00454 tx_ring->cmb_dma = adapter->ring_dma + offset;
00455 tx_ring->cmb = (u32 *)(adapter->ring_vir_addr + offset);
00456 offset += sizeof(u32);
00457
00458 for (j = 0; j < AT_PAGE_NUM_PER_QUEUE; j++) {
00459 rx_page_desc->rx_page[j].write_offset_dma =
00460 adapter->ring_dma + offset;
00461 rx_page_desc->rx_page[j].write_offset_addr =
00462 adapter->ring_vir_addr + offset;
00463 offset += sizeof(u32);
00464 }
00465
00466 if (offset > adapter->ring_size) {
00467 DBG("atl1e: ring miscalculation! need %d > %d bytes\n",
00468 offset, adapter->ring_size);
00469 err = -EINVAL;
00470 goto failed;
00471 }
00472
00473 return 0;
00474 failed:
00475 atl1e_free_ring_resources(adapter);
00476 return err;
00477 }
00478
00479 static inline void atl1e_configure_des_ring(const struct atl1e_adapter *adapter)
00480 {
00481
00482 struct atl1e_hw *hw = (struct atl1e_hw *)&adapter->hw;
00483 struct atl1e_rx_ring *rx_ring =
00484 (struct atl1e_rx_ring *)&adapter->rx_ring;
00485 struct atl1e_tx_ring *tx_ring =
00486 (struct atl1e_tx_ring *)&adapter->tx_ring;
00487 struct atl1e_rx_page_desc *rx_page_desc = NULL;
00488 int j;
00489
00490 AT_WRITE_REG(hw, REG_DESC_BASE_ADDR_HI, 0);
00491 AT_WRITE_REG(hw, REG_TPD_BASE_ADDR_LO, tx_ring->dma);
00492 AT_WRITE_REG(hw, REG_TPD_RING_SIZE, (u16)(tx_ring->count));
00493 AT_WRITE_REG(hw, REG_HOST_TX_CMB_LO, tx_ring->cmb_dma);
00494
00495 rx_page_desc = &rx_ring->rx_page_desc;
00496
00497
00498 AT_WRITE_REG(hw, REG_RXF0_BASE_ADDR_HI, 0);
00499
00500 for (j = 0; j < AT_PAGE_NUM_PER_QUEUE; j++) {
00501 u32 page_phy_addr;
00502 u32 offset_phy_addr;
00503
00504 page_phy_addr = rx_page_desc->rx_page[j].dma;
00505 offset_phy_addr = rx_page_desc->rx_page[j].write_offset_dma;
00506
00507 AT_WRITE_REG(hw, atl1e_rx_page_lo_addr_regs[j], page_phy_addr);
00508 AT_WRITE_REG(hw, atl1e_rx_page_write_offset_regs[j],
00509 offset_phy_addr);
00510 AT_WRITE_REGB(hw, atl1e_rx_page_vld_regs[j], 1);
00511 }
00512
00513
00514 AT_WRITE_REG(hw, REG_HOST_RXFPAGE_SIZE, rx_ring->page_size);
00515
00516 AT_WRITE_REG(hw, REG_LOAD_PTR, 1);
00517
00518 return;
00519 }
00520
00521 static inline void atl1e_configure_tx(struct atl1e_adapter *adapter)
00522 {
00523 struct atl1e_hw *hw = (struct atl1e_hw *)&adapter->hw;
00524 u32 dev_ctrl_data = 0;
00525 u32 max_pay_load = 0;
00526 u32 jumbo_thresh = 0;
00527 u32 extra_size = 0;
00528
00529
00530 if (hw->nic_type != athr_l2e_revB) {
00531 extra_size = ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN;
00532 jumbo_thresh = MAX_FRAME_SIZE + extra_size;
00533 AT_WRITE_REG(hw, REG_TX_EARLY_TH, (jumbo_thresh + 7) >> 3);
00534 }
00535
00536 dev_ctrl_data = AT_READ_REG(hw, REG_DEVICE_CTRL);
00537
00538 max_pay_load = ((dev_ctrl_data >> DEVICE_CTRL_MAX_PAYLOAD_SHIFT)) &
00539 DEVICE_CTRL_MAX_PAYLOAD_MASK;
00540 if (max_pay_load < hw->dmaw_block)
00541 hw->dmaw_block = max_pay_load;
00542
00543 max_pay_load = ((dev_ctrl_data >> DEVICE_CTRL_MAX_RREQ_SZ_SHIFT)) &
00544 DEVICE_CTRL_MAX_RREQ_SZ_MASK;
00545 if (max_pay_load < hw->dmar_block)
00546 hw->dmar_block = max_pay_load;
00547
00548 if (hw->nic_type != athr_l2e_revB)
00549 AT_WRITE_REGW(hw, REG_TXQ_CTRL + 2,
00550 atl1e_pay_load_size[hw->dmar_block]);
00551
00552 AT_WRITE_REGW(hw, REG_TXQ_CTRL,
00553 ((TPD_BURST & TXQ_CTRL_NUM_TPD_BURST_MASK)
00554 << TXQ_CTRL_NUM_TPD_BURST_SHIFT)
00555 | TXQ_CTRL_ENH_MODE | TXQ_CTRL_EN);
00556 return;
00557 }
00558
00559 static inline void atl1e_configure_rx(struct atl1e_adapter *adapter)
00560 {
00561 struct atl1e_hw *hw = (struct atl1e_hw *)&adapter->hw;
00562 u32 rxf_len = 0;
00563 u32 rxf_low = 0;
00564 u32 rxf_high = 0;
00565 u32 rxf_thresh_data = 0;
00566 u32 rxq_ctrl_data = 0;
00567
00568 if (hw->nic_type != athr_l2e_revB) {
00569 AT_WRITE_REGW(hw, REG_RXQ_JMBOSZ_RRDTIM,
00570 (u16)((RX_JUMBO_THRESH & RXQ_JMBOSZ_TH_MASK) <<
00571 RXQ_JMBOSZ_TH_SHIFT |
00572 (1 & RXQ_JMBO_LKAH_MASK) <<
00573 RXQ_JMBO_LKAH_SHIFT));
00574
00575 rxf_len = AT_READ_REG(hw, REG_SRAM_RXF_LEN);
00576 rxf_high = rxf_len * 4 / 5;
00577 rxf_low = rxf_len / 5;
00578 rxf_thresh_data = ((rxf_high & RXQ_RXF_PAUSE_TH_HI_MASK)
00579 << RXQ_RXF_PAUSE_TH_HI_SHIFT) |
00580 ((rxf_low & RXQ_RXF_PAUSE_TH_LO_MASK)
00581 << RXQ_RXF_PAUSE_TH_LO_SHIFT);
00582
00583 AT_WRITE_REG(hw, REG_RXQ_RXF_PAUSE_THRESH, rxf_thresh_data);
00584 }
00585
00586
00587 AT_WRITE_REG(hw, REG_IDT_TABLE, 0);
00588 AT_WRITE_REG(hw, REG_BASE_CPU_NUMBER, 0);
00589
00590 rxq_ctrl_data |= RXQ_CTRL_PBA_ALIGN_32 |
00591 RXQ_CTRL_CUT_THRU_EN | RXQ_CTRL_EN;
00592
00593 AT_WRITE_REG(hw, REG_RXQ_CTRL, rxq_ctrl_data);
00594 return;
00595 }
00596
00597 static inline void atl1e_configure_dma(struct atl1e_adapter *adapter)
00598 {
00599 struct atl1e_hw *hw = &adapter->hw;
00600 u32 dma_ctrl_data = 0;
00601
00602 dma_ctrl_data = DMA_CTRL_RXCMB_EN;
00603 dma_ctrl_data |= (((u32)hw->dmar_block) & DMA_CTRL_DMAR_BURST_LEN_MASK)
00604 << DMA_CTRL_DMAR_BURST_LEN_SHIFT;
00605 dma_ctrl_data |= (((u32)hw->dmaw_block) & DMA_CTRL_DMAW_BURST_LEN_MASK)
00606 << DMA_CTRL_DMAW_BURST_LEN_SHIFT;
00607 dma_ctrl_data |= DMA_CTRL_DMAR_REQ_PRI | DMA_CTRL_DMAR_OUT_ORDER;
00608 dma_ctrl_data |= (DMAR_DLY_CNT & DMA_CTRL_DMAR_DLY_CNT_MASK)
00609 << DMA_CTRL_DMAR_DLY_CNT_SHIFT;
00610 dma_ctrl_data |= (DMAW_DLY_CNT & DMA_CTRL_DMAW_DLY_CNT_MASK)
00611 << DMA_CTRL_DMAW_DLY_CNT_SHIFT;
00612
00613 AT_WRITE_REG(hw, REG_DMA_CTRL, dma_ctrl_data);
00614 return;
00615 }
00616
00617 static void atl1e_setup_mac_ctrl(struct atl1e_adapter *adapter)
00618 {
00619 u32 value;
00620 struct atl1e_hw *hw = &adapter->hw;
00621
00622
00623 value = MAC_CTRL_TX_EN |
00624 MAC_CTRL_RX_EN ;
00625
00626 if (FULL_DUPLEX == adapter->link_duplex)
00627 value |= MAC_CTRL_DUPLX;
00628
00629 value |= ((u32)((SPEED_1000 == adapter->link_speed) ?
00630 MAC_CTRL_SPEED_1000 : MAC_CTRL_SPEED_10_100) <<
00631 MAC_CTRL_SPEED_SHIFT);
00632 value |= (MAC_CTRL_TX_FLOW | MAC_CTRL_RX_FLOW);
00633
00634 value |= (MAC_CTRL_ADD_CRC | MAC_CTRL_PAD);
00635 value |= ((PREAMBLE_LEN & MAC_CTRL_PRMLEN_MASK) << MAC_CTRL_PRMLEN_SHIFT);
00636
00637 value |= MAC_CTRL_BC_EN;
00638 value |= MAC_CTRL_MC_ALL_EN;
00639
00640 AT_WRITE_REG(hw, REG_MAC_CTRL, value);
00641 }
00642
00643
00644
00645
00646
00647
00648
00649 static int atl1e_configure(struct atl1e_adapter *adapter)
00650 {
00651 struct atl1e_hw *hw = &adapter->hw;
00652 u32 intr_status_data = 0;
00653
00654
00655 AT_WRITE_REG(hw, REG_ISR, ~0);
00656
00657
00658 atl1e_hw_set_mac_addr(hw);
00659
00660
00661 AT_WRITE_REG(hw, REG_RX_HASH_TABLE, 0);
00662 AT_WRITE_REG_ARRAY(hw, REG_RX_HASH_TABLE, 1, 0);
00663
00664
00665 AT_WRITE_REG(hw, REG_WOL_CTRL, 0);
00666
00667
00668
00669
00670 atl1e_configure_des_ring(adapter);
00671
00672
00673 AT_WRITE_REGW(hw, REG_IRQ_MODU_TIMER_INIT, IMT_VAL);
00674 AT_WRITE_REGW(hw, REG_IRQ_MODU_TIMER2_INIT, IMT_VAL);
00675 AT_WRITE_REG(hw, REG_MASTER_CTRL, MASTER_CTRL_LED_MODE |
00676 MASTER_CTRL_ITIMER_EN | MASTER_CTRL_ITIMER2_EN);
00677
00678
00679 AT_WRITE_REGW(hw, REG_TRIG_RRD_THRESH, RRD_THRESH);
00680 AT_WRITE_REGW(hw, REG_TRIG_TPD_THRESH, TPD_THRESH);
00681 AT_WRITE_REGW(hw, REG_TRIG_RXTIMER, RX_COUNT_DOWN);
00682 AT_WRITE_REGW(hw, REG_TRIG_TXTIMER, TX_COUNT_DOWN);
00683
00684
00685 AT_WRITE_REGW(hw, REG_CMBDISDMA_TIMER, ICT_VAL);
00686
00687
00688 AT_WRITE_REG(hw, REG_MTU, MAX_FRAME_SIZE + ETH_HLEN +
00689 VLAN_HLEN + ETH_FCS_LEN);
00690
00691
00692 atl1e_configure_tx(adapter);
00693
00694
00695 atl1e_configure_rx(adapter);
00696
00697
00698 atl1e_configure_dma(adapter);
00699
00700
00701 AT_WRITE_REG(hw, REG_SMB_STAT_TIMER, SMB_TIMER);
00702
00703 intr_status_data = AT_READ_REG(hw, REG_ISR);
00704 if ((intr_status_data & ISR_PHY_LINKDOWN) != 0) {
00705 DBG("atl1e: configure failed, PCIE phy link down\n");
00706 return -1;
00707 }
00708
00709 AT_WRITE_REG(hw, REG_ISR, 0x7fffffff);
00710 return 0;
00711 }
00712
00713 static inline void atl1e_clear_phy_int(struct atl1e_adapter *adapter)
00714 {
00715 u16 phy_data;
00716
00717 atl1e_read_phy_reg(&adapter->hw, MII_INT_STATUS, &phy_data);
00718 }
00719
00720 static int atl1e_clean_tx_irq(struct atl1e_adapter *adapter)
00721 {
00722 struct atl1e_tx_ring *tx_ring = (struct atl1e_tx_ring *)
00723 &adapter->tx_ring;
00724 struct atl1e_tx_buffer *tx_buffer = NULL;
00725 u16 hw_next_to_clean = AT_READ_REGW(&adapter->hw, REG_TPD_CONS_IDX);
00726 u16 next_to_clean = tx_ring->next_to_clean;
00727
00728 while (next_to_clean != hw_next_to_clean) {
00729 tx_buffer = &tx_ring->tx_buffer[next_to_clean];
00730
00731 tx_buffer->dma = 0;
00732 if (tx_buffer->iob) {
00733 netdev_tx_complete(adapter->netdev, tx_buffer->iob);
00734 tx_buffer->iob = NULL;
00735 }
00736
00737 if (++next_to_clean == tx_ring->count)
00738 next_to_clean = 0;
00739 }
00740
00741 tx_ring->next_to_clean = next_to_clean;
00742
00743 return 1;
00744 }
00745
00746 static struct atl1e_rx_page *atl1e_get_rx_page(struct atl1e_adapter *adapter)
00747 {
00748 struct atl1e_rx_page_desc *rx_page_desc =
00749 (struct atl1e_rx_page_desc *) &adapter->rx_ring.rx_page_desc;
00750 u8 rx_using = rx_page_desc->rx_using;
00751
00752 return (struct atl1e_rx_page *)&(rx_page_desc->rx_page[rx_using]);
00753 }
00754
00755 static void atl1e_clean_rx_irq(struct atl1e_adapter *adapter)
00756 {
00757 struct net_device *netdev = adapter->netdev;
00758 struct atl1e_rx_ring *rx_ring = (struct atl1e_rx_ring *)
00759 &adapter->rx_ring;
00760 struct atl1e_rx_page_desc *rx_page_desc =
00761 (struct atl1e_rx_page_desc *) &rx_ring->rx_page_desc;
00762 struct io_buffer *iob = NULL;
00763 struct atl1e_rx_page *rx_page = atl1e_get_rx_page(adapter);
00764 u32 packet_size, write_offset;
00765 struct atl1e_recv_ret_status *prrs;
00766
00767 write_offset = *(rx_page->write_offset_addr);
00768 if (rx_page->read_offset >= write_offset)
00769 return;
00770
00771 do {
00772
00773 prrs = (struct atl1e_recv_ret_status *) (rx_page->addr +
00774 rx_page->read_offset);
00775
00776 if (prrs->seq_num != rx_page_desc->rx_nxseq) {
00777 DBG("atl1e %s: RX sequence number error (%d != %d)\n",
00778 netdev->name, prrs->seq_num,
00779 rx_page_desc->rx_nxseq);
00780 rx_page_desc->rx_nxseq++;
00781 goto fatal_err;
00782 }
00783
00784 rx_page_desc->rx_nxseq++;
00785
00786
00787 if (prrs->pkt_flag & RRS_IS_ERR_FRAME) {
00788 if (prrs->err_flag & (RRS_ERR_BAD_CRC |
00789 RRS_ERR_DRIBBLE | RRS_ERR_CODE |
00790 RRS_ERR_TRUNC)) {
00791
00792
00793 netdev_rx_err(netdev, NULL, EIO);
00794 goto skip_pkt;
00795 }
00796 }
00797
00798 packet_size = ((prrs->word1 >> RRS_PKT_SIZE_SHIFT) &
00799 RRS_PKT_SIZE_MASK) - ETH_FCS_LEN;
00800 iob = alloc_iob(packet_size + NET_IP_ALIGN);
00801 if (iob == NULL) {
00802 DBG("atl1e %s: dropping packet under memory pressure\n",
00803 netdev->name);
00804 goto skip_pkt;
00805 }
00806 iob_reserve(iob, NET_IP_ALIGN);
00807 memcpy(iob->data, (u8 *)(prrs + 1), packet_size);
00808 iob_put(iob, packet_size);
00809
00810 netdev_rx(netdev, iob);
00811
00812 skip_pkt:
00813
00814 rx_page->read_offset +=
00815 (((u32)((prrs->word1 >> RRS_PKT_SIZE_SHIFT) &
00816 RRS_PKT_SIZE_MASK) +
00817 sizeof(struct atl1e_recv_ret_status) + 31) &
00818 0xFFFFFFE0);
00819
00820 if (rx_page->read_offset >= rx_ring->page_size) {
00821
00822 u16 reg_addr;
00823 u8 rx_using;
00824
00825 rx_page->read_offset =
00826 *(rx_page->write_offset_addr) = 0;
00827 rx_using = rx_page_desc->rx_using;
00828 reg_addr =
00829 atl1e_rx_page_vld_regs[rx_using];
00830 AT_WRITE_REGB(&adapter->hw, reg_addr, 1);
00831 rx_page_desc->rx_using ^= 1;
00832 rx_page = atl1e_get_rx_page(adapter);
00833 }
00834 write_offset = *(rx_page->write_offset_addr);
00835 } while (rx_page->read_offset < write_offset);
00836
00837 return;
00838
00839 fatal_err:
00840 if (!netdev_link_ok(adapter->netdev))
00841 atl1e_reset(adapter);
00842 }
00843
00844
00845
00846
00847
00848 static void atl1e_poll(struct net_device *netdev)
00849 {
00850 struct atl1e_adapter *adapter = netdev_priv(netdev);
00851 struct atl1e_hw *hw = &adapter->hw;
00852 int max_ints = 64;
00853 u32 status;
00854
00855 do {
00856 status = AT_READ_REG(hw, REG_ISR);
00857 if ((status & IMR_NORMAL_MASK) == 0)
00858 break;
00859
00860
00861 if (status & ISR_GPHY)
00862 atl1e_clear_phy_int(adapter);
00863
00864 AT_WRITE_REG(hw, REG_ISR, status | ISR_DIS_INT);
00865
00866
00867 if (status & ISR_PHY_LINKDOWN) {
00868 DBG("atl1e: PCI-E PHY link down: %x\n", status);
00869 if (netdev_link_ok(adapter->netdev)) {
00870
00871 atl1e_irq_reset(adapter);
00872 atl1e_reset(adapter);
00873 break;
00874 }
00875 }
00876
00877
00878 if (status & (ISR_DMAR_TO_RST | ISR_DMAW_TO_RST)) {
00879 DBG("atl1e: PCI-E DMA RW error: %x\n", status);
00880 atl1e_irq_reset(adapter);
00881 atl1e_reset(adapter);
00882 break;
00883 }
00884
00885
00886 if (status & (ISR_GPHY | ISR_MANUAL)) {
00887 atl1e_check_link(adapter);
00888 break;
00889 }
00890
00891
00892 if (status & ISR_TX_EVENT)
00893 atl1e_clean_tx_irq(adapter);
00894
00895 if (status & ISR_RX_EVENT)
00896 atl1e_clean_rx_irq(adapter);
00897 } while (--max_ints > 0);
00898
00899
00900 AT_WRITE_REG(&adapter->hw, REG_ISR, 0);
00901
00902 return;
00903 }
00904
00905 static inline u16 atl1e_tpd_avail(struct atl1e_adapter *adapter)
00906 {
00907 struct atl1e_tx_ring *tx_ring = &adapter->tx_ring;
00908 u16 next_to_use = 0;
00909 u16 next_to_clean = 0;
00910
00911 next_to_clean = tx_ring->next_to_clean;
00912 next_to_use = tx_ring->next_to_use;
00913
00914 return (u16)(next_to_clean > next_to_use) ?
00915 (next_to_clean - next_to_use - 1) :
00916 (tx_ring->count + next_to_clean - next_to_use - 1);
00917 }
00918
00919
00920
00921
00922
00923
00924 static struct atl1e_tpd_desc *atl1e_get_tpd(struct atl1e_adapter *adapter)
00925 {
00926 struct atl1e_tx_ring *tx_ring = &adapter->tx_ring;
00927 u16 next_to_use = 0;
00928
00929 next_to_use = tx_ring->next_to_use;
00930 if (++tx_ring->next_to_use == tx_ring->count)
00931 tx_ring->next_to_use = 0;
00932
00933 memset(&tx_ring->desc[next_to_use], 0, sizeof(struct atl1e_tpd_desc));
00934 return (struct atl1e_tpd_desc *)&tx_ring->desc[next_to_use];
00935 }
00936
00937 static struct atl1e_tx_buffer *
00938 atl1e_get_tx_buffer(struct atl1e_adapter *adapter, struct atl1e_tpd_desc *tpd)
00939 {
00940 struct atl1e_tx_ring *tx_ring = &adapter->tx_ring;
00941
00942 return &tx_ring->tx_buffer[tpd - tx_ring->desc];
00943 }
00944
00945 static void atl1e_tx_map(struct atl1e_adapter *adapter,
00946 struct io_buffer *iob, struct atl1e_tpd_desc *tpd)
00947 {
00948 struct atl1e_tx_buffer *tx_buffer = NULL;
00949 u16 buf_len = iob_len(iob);
00950
00951 tx_buffer = atl1e_get_tx_buffer(adapter, tpd);
00952 tx_buffer->iob = iob;
00953 tx_buffer->length = buf_len;
00954 tx_buffer->dma = virt_to_bus(iob->data);
00955 tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
00956 tpd->word2 = ((tpd->word2 & ~TPD_BUFLEN_MASK) |
00957 ((cpu_to_le32(buf_len) & TPD_BUFLEN_MASK) <<
00958 TPD_BUFLEN_SHIFT));
00959 tpd->word3 |= 1 << TPD_EOP_SHIFT;
00960 }
00961
00962 static void atl1e_tx_queue(struct atl1e_adapter *adapter, u16 count __unused,
00963 struct atl1e_tpd_desc *tpd __unused)
00964 {
00965 struct atl1e_tx_ring *tx_ring = &adapter->tx_ring;
00966 wmb();
00967 AT_WRITE_REG(&adapter->hw, REG_MB_TPD_PROD_IDX, tx_ring->next_to_use);
00968 }
00969
00970 static int atl1e_xmit_frame(struct net_device *netdev, struct io_buffer *iob)
00971 {
00972 struct atl1e_adapter *adapter = netdev_priv(netdev);
00973 u16 tpd_req = 1;
00974 struct atl1e_tpd_desc *tpd;
00975
00976 if (!netdev_link_ok(netdev)) {
00977 return -EINVAL;
00978 }
00979
00980 if (atl1e_tpd_avail(adapter) < tpd_req) {
00981 return -EBUSY;
00982 }
00983
00984 tpd = atl1e_get_tpd(adapter);
00985
00986 atl1e_tx_map(adapter, iob, tpd);
00987 atl1e_tx_queue(adapter, tpd_req, tpd);
00988
00989 return 0;
00990 }
00991
00992 int atl1e_up(struct atl1e_adapter *adapter)
00993 {
00994 struct net_device *netdev = adapter->netdev;
00995 int err = 0;
00996 u32 val;
00997
00998
00999 err = atl1e_init_hw(&adapter->hw);
01000 if (err) {
01001 return -EIO;
01002 }
01003 atl1e_init_ring_ptrs(adapter);
01004
01005 memcpy(adapter->hw.mac_addr, netdev->ll_addr, ETH_ALEN);
01006
01007 if (atl1e_configure(adapter) != 0) {
01008 return -EIO;
01009 }
01010
01011 atl1e_irq_disable(adapter);
01012
01013 val = AT_READ_REG(&adapter->hw, REG_MASTER_CTRL);
01014 AT_WRITE_REG(&adapter->hw, REG_MASTER_CTRL,
01015 val | MASTER_CTRL_MANUAL_INT);
01016
01017 return err;
01018 }
01019
01020 void atl1e_irq(struct net_device *netdev, int enable)
01021 {
01022 struct atl1e_adapter *adapter = netdev_priv(netdev);
01023
01024 if (enable)
01025 atl1e_irq_enable(adapter);
01026 else
01027 atl1e_irq_disable(adapter);
01028 }
01029
01030 void atl1e_down(struct atl1e_adapter *adapter)
01031 {
01032 struct net_device *netdev = adapter->netdev;
01033
01034
01035 atl1e_reset_hw(&adapter->hw);
01036 mdelay(1);
01037
01038 netdev_link_down(netdev);
01039 adapter->link_speed = SPEED_0;
01040 adapter->link_duplex = -1;
01041
01042 atl1e_clean_tx_ring(adapter);
01043 atl1e_clean_rx_ring(adapter);
01044 }
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058 static int atl1e_open(struct net_device *netdev)
01059 {
01060 struct atl1e_adapter *adapter = netdev_priv(netdev);
01061 int err;
01062
01063
01064 atl1e_init_ring_resources(adapter);
01065 err = atl1e_setup_ring_resources(adapter);
01066 if (err)
01067 return err;
01068
01069 err = atl1e_up(adapter);
01070 if (err)
01071 goto err_up;
01072
01073 return 0;
01074
01075 err_up:
01076 atl1e_free_ring_resources(adapter);
01077 atl1e_reset_hw(&adapter->hw);
01078
01079 return err;
01080 }
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093 static void atl1e_close(struct net_device *netdev)
01094 {
01095 struct atl1e_adapter *adapter = netdev_priv(netdev);
01096
01097 atl1e_down(adapter);
01098 atl1e_free_ring_resources(adapter);
01099 }
01100
01101 static struct net_device_operations atl1e_netdev_ops = {
01102 .open = atl1e_open,
01103 .close = atl1e_close,
01104 .transmit = atl1e_xmit_frame,
01105 .poll = atl1e_poll,
01106 .irq = atl1e_irq,
01107 };
01108
01109 static void atl1e_init_netdev(struct net_device *netdev, struct pci_device *pdev)
01110 {
01111 netdev_init(netdev, &atl1e_netdev_ops);
01112
01113 netdev->dev = &pdev->dev;
01114 pci_set_drvdata(pdev, netdev);
01115 }
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128 static int atl1e_probe(struct pci_device *pdev,
01129 const struct pci_device_id *ent __unused)
01130 {
01131 struct net_device *netdev;
01132 struct atl1e_adapter *adapter = NULL;
01133 static int cards_found;
01134
01135 int err = 0;
01136
01137 adjust_pci_device(pdev);
01138
01139 netdev = alloc_etherdev(sizeof(struct atl1e_adapter));
01140 if (netdev == NULL) {
01141 err = -ENOMEM;
01142 DBG("atl1e: out of memory allocating net_device\n");
01143 goto err;
01144 }
01145
01146 atl1e_init_netdev(netdev, pdev);
01147
01148 adapter = netdev_priv(netdev);
01149 adapter->bd_number = cards_found;
01150 adapter->netdev = netdev;
01151 adapter->pdev = pdev;
01152 adapter->hw.adapter = adapter;
01153 if (!pdev->membase) {
01154 err = -EIO;
01155 DBG("atl1e: cannot map device registers\n");
01156 goto err_free_netdev;
01157 }
01158 adapter->hw.hw_addr = bus_to_virt(pdev->membase);
01159
01160
01161 adapter->mii.dev = netdev;
01162 adapter->mii.mdio_read = atl1e_mdio_read;
01163 adapter->mii.mdio_write = atl1e_mdio_write;
01164 adapter->mii.phy_id_mask = 0x1f;
01165 adapter->mii.reg_num_mask = MDIO_REG_ADDR_MASK;
01166
01167
01168 adapter->tx_ring.count = TX_DESC_COUNT;
01169 adapter->rx_ring.page_size = RX_MEM_SIZE;
01170
01171 atl1e_setup_pcicmd(pdev);
01172
01173
01174 err = atl1e_sw_init(adapter);
01175 if (err) {
01176 DBG("atl1e: private data init failed\n");
01177 goto err_free_netdev;
01178 }
01179
01180
01181 atl1e_phy_init(&adapter->hw);
01182
01183
01184
01185 err = atl1e_reset_hw(&adapter->hw);
01186 if (err) {
01187 err = -EIO;
01188 goto err_free_netdev;
01189 }
01190
01191
01192
01193 atl1e_restart_autoneg(&adapter->hw);
01194
01195 if (atl1e_read_mac_addr(&adapter->hw) != 0) {
01196 DBG("atl1e: cannot read MAC address from EEPROM\n");
01197 err = -EIO;
01198 goto err_free_netdev;
01199 }
01200
01201 memcpy(netdev->hw_addr, adapter->hw.perm_mac_addr, ETH_ALEN);
01202 memcpy(netdev->ll_addr, adapter->hw.mac_addr, ETH_ALEN);
01203 DBG("atl1e: Attansic L1E Ethernet controller on %s, "
01204 "%02x:%02x:%02x:%02x:%02x:%02x\n", adapter->netdev->name,
01205 adapter->hw.mac_addr[0], adapter->hw.mac_addr[1],
01206 adapter->hw.mac_addr[2], adapter->hw.mac_addr[3],
01207 adapter->hw.mac_addr[4], adapter->hw.mac_addr[5]);
01208
01209 err = register_netdev(netdev);
01210 if (err) {
01211 DBG("atl1e: cannot register network device\n");
01212 goto err_free_netdev;
01213 }
01214
01215 netdev_link_down(netdev);
01216
01217 cards_found++;
01218 return 0;
01219
01220 err_free_netdev:
01221 netdev_nullify(netdev);
01222 netdev_put(netdev);
01223 err:
01224 return err;
01225 }
01226
01227
01228
01229
01230
01231
01232
01233
01234
01235
01236 static void atl1e_remove(struct pci_device *pdev)
01237 {
01238 struct net_device *netdev = pci_get_drvdata(pdev);
01239 struct atl1e_adapter *adapter = netdev_priv(netdev);
01240
01241 unregister_netdev(netdev);
01242 atl1e_free_ring_resources(adapter);
01243 atl1e_force_ps(&adapter->hw);
01244 netdev_nullify(netdev);
01245 netdev_put(netdev);
01246 }
01247
01248 struct pci_driver atl1e_driver __pci_driver = {
01249 .ids = atl1e_pci_tbl,
01250 .id_count = (sizeof(atl1e_pci_tbl) / sizeof(atl1e_pci_tbl[0])),
01251 .probe = atl1e_probe,
01252 .remove = atl1e_remove,
01253 };
01254
01255
01256
01257
01258
01259
01260
01261 int atl1e_check_eeprom_exist(struct atl1e_hw *hw)
01262 {
01263 u32 value;
01264
01265 value = AT_READ_REG(hw, REG_SPI_FLASH_CTRL);
01266 if (value & SPI_FLASH_CTRL_EN_VPD) {
01267 value &= ~SPI_FLASH_CTRL_EN_VPD;
01268 AT_WRITE_REG(hw, REG_SPI_FLASH_CTRL, value);
01269 }
01270 value = AT_READ_REGW(hw, REG_PCIE_CAP_LIST);
01271 return ((value & 0xFF00) == 0x6C00) ? 0 : 1;
01272 }
01273
01274 void atl1e_hw_set_mac_addr(struct atl1e_hw *hw)
01275 {
01276 u32 value;
01277
01278
01279
01280
01281
01282 value = (((u32)hw->mac_addr[2]) << 24) |
01283 (((u32)hw->mac_addr[3]) << 16) |
01284 (((u32)hw->mac_addr[4]) << 8) |
01285 (((u32)hw->mac_addr[5])) ;
01286 AT_WRITE_REG_ARRAY(hw, REG_MAC_STA_ADDR, 0, value);
01287
01288 value = (((u32)hw->mac_addr[0]) << 8) |
01289 (((u32)hw->mac_addr[1])) ;
01290 AT_WRITE_REG_ARRAY(hw, REG_MAC_STA_ADDR, 1, value);
01291 }
01292
01293
01294
01295
01296
01297 static int atl1e_get_permanent_address(struct atl1e_hw *hw)
01298 {
01299 union {
01300 u32 dword[2];
01301 u8 byte[8];
01302 } hw_addr;
01303 u32 i;
01304 u32 twsi_ctrl_data;
01305 u8 eth_addr[ETH_ALEN];
01306
01307 if (!atl1e_check_eeprom_exist(hw)) {
01308
01309 twsi_ctrl_data = AT_READ_REG(hw, REG_TWSI_CTRL);
01310 twsi_ctrl_data |= TWSI_CTRL_SW_LDSTART;
01311 AT_WRITE_REG(hw, REG_TWSI_CTRL, twsi_ctrl_data);
01312 for (i = 0; i < AT_TWSI_EEPROM_TIMEOUT; i++) {
01313 mdelay(10);
01314 twsi_ctrl_data = AT_READ_REG(hw, REG_TWSI_CTRL);
01315 if ((twsi_ctrl_data & TWSI_CTRL_SW_LDSTART) == 0)
01316 break;
01317 }
01318 if (i >= AT_TWSI_EEPROM_TIMEOUT)
01319 return AT_ERR_TIMEOUT;
01320 }
01321
01322
01323 hw_addr.dword[0] = AT_READ_REG(hw, REG_MAC_STA_ADDR);
01324 hw_addr.dword[1] = AT_READ_REG(hw, REG_MAC_STA_ADDR + 4);
01325 for (i = 0; i < ETH_ALEN; i++) {
01326 eth_addr[ETH_ALEN - i - 1] = hw_addr.byte[i];
01327 }
01328
01329 memcpy(hw->perm_mac_addr, eth_addr, ETH_ALEN);
01330 return 0;
01331 }
01332
01333 void atl1e_force_ps(struct atl1e_hw *hw)
01334 {
01335 AT_WRITE_REGW(hw, REG_GPHY_CTRL,
01336 GPHY_CTRL_PW_WOL_DIS | GPHY_CTRL_EXT_RESET);
01337 }
01338
01339
01340
01341
01342
01343
01344 int atl1e_read_mac_addr(struct atl1e_hw *hw)
01345 {
01346 int err = 0;
01347
01348 err = atl1e_get_permanent_address(hw);
01349 if (err)
01350 return AT_ERR_EEPROM;
01351 memcpy(hw->mac_addr, hw->perm_mac_addr, sizeof(hw->perm_mac_addr));
01352 return 0;
01353 }
01354
01355
01356
01357
01358
01359
01360 int atl1e_read_phy_reg(struct atl1e_hw *hw, u16 reg_addr, u16 *phy_data)
01361 {
01362 u32 val;
01363 int i;
01364
01365 val = ((u32)(reg_addr & MDIO_REG_ADDR_MASK)) << MDIO_REG_ADDR_SHIFT |
01366 MDIO_START | MDIO_SUP_PREAMBLE | MDIO_RW |
01367 MDIO_CLK_25_4 << MDIO_CLK_SEL_SHIFT;
01368
01369 AT_WRITE_REG(hw, REG_MDIO_CTRL, val);
01370
01371 wmb();
01372
01373 for (i = 0; i < MDIO_WAIT_TIMES; i++) {
01374 udelay(2);
01375 val = AT_READ_REG(hw, REG_MDIO_CTRL);
01376 if (!(val & (MDIO_START | MDIO_BUSY)))
01377 break;
01378 wmb();
01379 }
01380 if (!(val & (MDIO_START | MDIO_BUSY))) {
01381 *phy_data = (u16)val;
01382 return 0;
01383 }
01384
01385 return AT_ERR_PHY;
01386 }
01387
01388
01389
01390
01391
01392
01393
01394 int atl1e_write_phy_reg(struct atl1e_hw *hw, u32 reg_addr, u16 phy_data)
01395 {
01396 int i;
01397 u32 val;
01398
01399 val = ((u32)(phy_data & MDIO_DATA_MASK)) << MDIO_DATA_SHIFT |
01400 (reg_addr&MDIO_REG_ADDR_MASK) << MDIO_REG_ADDR_SHIFT |
01401 MDIO_SUP_PREAMBLE |
01402 MDIO_START |
01403 MDIO_CLK_25_4 << MDIO_CLK_SEL_SHIFT;
01404
01405 AT_WRITE_REG(hw, REG_MDIO_CTRL, val);
01406 wmb();
01407
01408 for (i = 0; i < MDIO_WAIT_TIMES; i++) {
01409 udelay(2);
01410 val = AT_READ_REG(hw, REG_MDIO_CTRL);
01411 if (!(val & (MDIO_START | MDIO_BUSY)))
01412 break;
01413 wmb();
01414 }
01415
01416 if (!(val & (MDIO_START | MDIO_BUSY)))
01417 return 0;
01418
01419 return AT_ERR_PHY;
01420 }
01421
01422
01423
01424
01425 static void atl1e_init_pcie(struct atl1e_hw *hw)
01426 {
01427 u32 value;
01428
01429
01430
01431
01432
01433
01434 value = AT_READ_REG(hw, 0x1008);
01435 value |= 0x8000;
01436 AT_WRITE_REG(hw, 0x1008, value);
01437 }
01438
01439
01440
01441
01442
01443 static int atl1e_phy_setup_autoneg_adv(struct atl1e_hw *hw)
01444 {
01445 s32 ret_val;
01446 u16 mii_autoneg_adv_reg;
01447 u16 mii_1000t_ctrl_reg;
01448
01449 if (0 != hw->mii_autoneg_adv_reg)
01450 return 0;
01451
01452 mii_autoneg_adv_reg = MII_AR_DEFAULT_CAP_MASK;
01453 mii_1000t_ctrl_reg = MII_AT001_CR_1000T_DEFAULT_CAP_MASK;
01454
01455
01456
01457
01458
01459
01460 mii_autoneg_adv_reg &= ~MII_AR_SPEED_MASK;
01461 mii_1000t_ctrl_reg &= ~MII_AT001_CR_1000T_SPEED_MASK;
01462
01463
01464 mii_autoneg_adv_reg |= (MII_AR_10T_HD_CAPS |
01465 MII_AR_10T_FD_CAPS |
01466 MII_AR_100TX_HD_CAPS |
01467 MII_AR_100TX_FD_CAPS);
01468 if (hw->nic_type == athr_l1e) {
01469 mii_1000t_ctrl_reg |= MII_AT001_CR_1000T_FD_CAPS;
01470 }
01471
01472
01473 mii_autoneg_adv_reg |= (MII_AR_ASM_DIR | MII_AR_PAUSE);
01474
01475 hw->mii_autoneg_adv_reg = mii_autoneg_adv_reg;
01476 hw->mii_1000t_ctrl_reg = mii_1000t_ctrl_reg;
01477
01478 ret_val = atl1e_write_phy_reg(hw, MII_ADVERTISE, mii_autoneg_adv_reg);
01479 if (ret_val)
01480 return ret_val;
01481
01482 if (hw->nic_type == athr_l1e || hw->nic_type == athr_l2e_revA) {
01483 ret_val = atl1e_write_phy_reg(hw, MII_AT001_CR,
01484 mii_1000t_ctrl_reg);
01485 if (ret_val)
01486 return ret_val;
01487 }
01488
01489 return 0;
01490 }
01491
01492
01493
01494
01495
01496
01497
01498
01499
01500 int atl1e_phy_commit(struct atl1e_hw *hw)
01501 {
01502 int ret_val;
01503 u16 phy_data;
01504
01505 phy_data = MII_CR_RESET | MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG;
01506
01507 ret_val = atl1e_write_phy_reg(hw, MII_BMCR, phy_data);
01508 if (ret_val) {
01509 u32 val;
01510 int i;
01511
01512
01513
01514 for (i = 0; i < 25; i++) {
01515 mdelay(1);
01516 val = AT_READ_REG(hw, REG_MDIO_CTRL);
01517 if (!(val & (MDIO_START | MDIO_BUSY)))
01518 break;
01519 }
01520
01521 if (0 != (val & (MDIO_START | MDIO_BUSY))) {
01522 DBG("atl1e: PCI-E link down for at least 25ms\n");
01523 return ret_val;
01524 }
01525
01526 DBG("atl1e: PCI-E link up after %d ms\n", i);
01527 }
01528 return 0;
01529 }
01530
01531 int atl1e_phy_init(struct atl1e_hw *hw)
01532 {
01533 s32 ret_val;
01534 u16 phy_val;
01535
01536 if (hw->phy_configured) {
01537 if (hw->re_autoneg) {
01538 hw->re_autoneg = 0;
01539 return atl1e_restart_autoneg(hw);
01540 }
01541 return 0;
01542 }
01543
01544
01545 AT_WRITE_REGW(hw, REG_GPHY_CTRL, GPHY_CTRL_DEFAULT);
01546 mdelay(2);
01547 AT_WRITE_REGW(hw, REG_GPHY_CTRL, GPHY_CTRL_DEFAULT |
01548 GPHY_CTRL_EXT_RESET);
01549 mdelay(2);
01550
01551
01552
01553 ret_val = atl1e_write_phy_reg(hw, MII_DBG_ADDR, 0xB);
01554 if (ret_val)
01555 return ret_val;
01556 ret_val = atl1e_write_phy_reg(hw, MII_DBG_DATA, 0xBC00);
01557 if (ret_val)
01558 return ret_val;
01559
01560 ret_val = atl1e_write_phy_reg(hw, MII_DBG_ADDR, 0);
01561 if (ret_val)
01562 return ret_val;
01563 phy_val = 0x02ef;
01564
01565
01566 ret_val = atl1e_write_phy_reg(hw, MII_DBG_DATA, phy_val);
01567 if (ret_val)
01568 return ret_val;
01569
01570 ret_val = atl1e_write_phy_reg(hw, MII_DBG_ADDR, 0x12);
01571 if (ret_val)
01572 return ret_val;
01573 ret_val = atl1e_write_phy_reg(hw, MII_DBG_DATA, 0x4C04);
01574 if (ret_val)
01575 return ret_val;
01576
01577 ret_val = atl1e_write_phy_reg(hw, MII_DBG_ADDR, 0x4);
01578 if (ret_val)
01579 return ret_val;
01580 ret_val = atl1e_write_phy_reg(hw, MII_DBG_DATA, 0x8BBB);
01581 if (ret_val)
01582 return ret_val;
01583
01584 ret_val = atl1e_write_phy_reg(hw, MII_DBG_ADDR, 0x5);
01585 if (ret_val)
01586 return ret_val;
01587 ret_val = atl1e_write_phy_reg(hw, MII_DBG_DATA, 0x2C46);
01588 if (ret_val)
01589 return ret_val;
01590
01591 mdelay(1);
01592
01593
01594 ret_val = atl1e_write_phy_reg(hw, MII_INT_CTRL, 0xC00);
01595 if (ret_val) {
01596 DBG("atl1e: Error enable PHY linkChange Interrupt\n");
01597 return ret_val;
01598 }
01599
01600 ret_val = atl1e_phy_setup_autoneg_adv(hw);
01601 if (ret_val) {
01602 DBG("atl1e: Error Setting up Auto-Negotiation\n");
01603 return ret_val;
01604 }
01605
01606 DBG("atl1e: Restarting Auto-Neg");
01607 ret_val = atl1e_phy_commit(hw);
01608 if (ret_val) {
01609 DBG("atl1e: Error Resetting the phy");
01610 return ret_val;
01611 }
01612
01613 hw->phy_configured = 1;
01614
01615 return 0;
01616 }
01617
01618
01619
01620
01621
01622
01623 int atl1e_reset_hw(struct atl1e_hw *hw)
01624 {
01625 struct atl1e_adapter *adapter = hw->adapter;
01626 struct pci_device *pdev = adapter->pdev;
01627 int timeout = 0;
01628 u32 idle_status_data = 0;
01629 u16 pci_cfg_cmd_word = 0;
01630
01631
01632 pci_read_config_word(pdev, PCI_COMMAND, &pci_cfg_cmd_word);
01633 if ((pci_cfg_cmd_word & (PCI_COMMAND_IO | PCI_COMMAND_MEM |
01634 PCI_COMMAND_MASTER))
01635 != (PCI_COMMAND_IO | PCI_COMMAND_MEM |
01636 PCI_COMMAND_MASTER)) {
01637 pci_cfg_cmd_word |= (PCI_COMMAND_IO | PCI_COMMAND_MEM |
01638 PCI_COMMAND_MASTER);
01639 pci_write_config_word(pdev, PCI_COMMAND, pci_cfg_cmd_word);
01640 }
01641
01642
01643
01644
01645
01646
01647
01648 AT_WRITE_REG(hw, REG_MASTER_CTRL,
01649 MASTER_CTRL_LED_MODE | MASTER_CTRL_SOFT_RST);
01650 wmb();
01651 mdelay(1);
01652
01653
01654 for (timeout = 0; timeout < AT_HW_MAX_IDLE_DELAY; timeout++) {
01655 idle_status_data = AT_READ_REG(hw, REG_IDLE_STATUS);
01656 if (idle_status_data == 0)
01657 break;
01658 mdelay(1);
01659 }
01660
01661 if (timeout >= AT_HW_MAX_IDLE_DELAY) {
01662 DBG("atl1e: MAC reset timeout\n");
01663 return AT_ERR_TIMEOUT;
01664 }
01665
01666 return 0;
01667 }
01668
01669
01670
01671
01672
01673
01674
01675
01676
01677
01678
01679 int atl1e_init_hw(struct atl1e_hw *hw)
01680 {
01681 s32 ret_val = 0;
01682
01683 atl1e_init_pcie(hw);
01684
01685
01686
01687 AT_WRITE_REG(hw, REG_RX_HASH_TABLE, 0);
01688 AT_WRITE_REG_ARRAY(hw, REG_RX_HASH_TABLE, 1, 0);
01689
01690 ret_val = atl1e_phy_init(hw);
01691
01692 return ret_val;
01693 }
01694
01695
01696
01697
01698
01699
01700
01701
01702 int atl1e_get_speed_and_duplex(struct atl1e_hw *hw, u16 *speed, u16 *duplex)
01703 {
01704 int err;
01705 u16 phy_data;
01706
01707
01708 err = atl1e_read_phy_reg(hw, MII_AT001_PSSR, &phy_data);
01709 if (err)
01710 return err;
01711
01712 if (!(phy_data & MII_AT001_PSSR_SPD_DPLX_RESOLVED))
01713 return AT_ERR_PHY_RES;
01714
01715 switch (phy_data & MII_AT001_PSSR_SPEED) {
01716 case MII_AT001_PSSR_1000MBS:
01717 *speed = SPEED_1000;
01718 break;
01719 case MII_AT001_PSSR_100MBS:
01720 *speed = SPEED_100;
01721 break;
01722 case MII_AT001_PSSR_10MBS:
01723 *speed = SPEED_10;
01724 break;
01725 default:
01726 return AT_ERR_PHY_SPEED;
01727 break;
01728 }
01729
01730 if (phy_data & MII_AT001_PSSR_DPLX)
01731 *duplex = FULL_DUPLEX;
01732 else
01733 *duplex = HALF_DUPLEX;
01734
01735 return 0;
01736 }
01737
01738 int atl1e_restart_autoneg(struct atl1e_hw *hw)
01739 {
01740 int err = 0;
01741
01742 err = atl1e_write_phy_reg(hw, MII_ADVERTISE, hw->mii_autoneg_adv_reg);
01743 if (err)
01744 return err;
01745
01746 if (hw->nic_type == athr_l1e || hw->nic_type == athr_l2e_revA) {
01747 err = atl1e_write_phy_reg(hw, MII_AT001_CR,
01748 hw->mii_1000t_ctrl_reg);
01749 if (err)
01750 return err;
01751 }
01752
01753 err = atl1e_write_phy_reg(hw, MII_BMCR,
01754 MII_CR_RESET | MII_CR_AUTO_NEG_EN |
01755 MII_CR_RESTART_AUTO_NEG);
01756 return err;
01757 }
01758