00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <linux/module.h>
00019
00020 #include <linux/config.h>
00021 #include <linux/kernel.h>
00022 #include <linux/sched.h>
00023 #include <linux/types.h>
00024 #include <linux/fcntl.h>
00025 #include <linux/interrupt.h>
00026 #include <linux/netdevice.h>
00027 #include <linux/etherdevice.h>
00028 #include <linux/delay.h>
00029 #include <linux/string.h>
00030 #include <linux/timer.h>
00031 #include <linux/init.h>
00032 #include <linux/pci.h>
00033 #include <asm/prom.h>
00034 #include <asm/io.h>
00035 #include <asm/pgtable.h>
00036 #include <asm/feature.h>
00037 #include <asm/keylargo.h>
00038 #ifdef CONFIG_PMAC_PBOOK
00039 #include <asm/adb.h>
00040 #include <asm/pmu.h>
00041 #include <asm/irq.h>
00042 #endif
00043
00044 #include "gmac.h"
00045
00046 #define DEBUG_PHY
00047
00048
00049 #define GMAC_VERSION "v1.3k2"
00050
00051 static unsigned char dummy_buf[RX_BUF_ALLOC_SIZE + RX_OFFSET + GMAC_BUFFER_ALIGN];
00052 static struct device *gmacs = NULL;
00053
00054
00055 static int mii_read(struct gmac *gm, int phy, int r);
00056 static int mii_write(struct gmac *gm, int phy, int r, int v);
00057 static void mii_poll_start(struct gmac *gm);
00058 static void mii_poll_stop(struct gmac *gm);
00059 static void mii_interrupt(struct gmac *gm);
00060 static int mii_lookup_and_reset(struct gmac *gm);
00061 static void mii_setup_phy(struct gmac *gm);
00062 static int mii_do_reset_phy(struct gmac *gm, int phy_addr);
00063 static void mii_init_BCM5400(struct gmac *gm);
00064
00065 static void gmac_set_power(struct gmac *gm, int power_up);
00066 static int gmac_powerup_and_reset(struct device *dev);
00067 static void gmac_set_gigabit_mode(struct gmac *gm, int gigabit);
00068 static void gmac_set_duplex_mode(struct gmac *gm, int full_duplex);
00069 static void gmac_mac_init(struct gmac *gm, unsigned char *mac_addr);
00070 static void gmac_init_rings(struct gmac *gm, int from_irq);
00071 static void gmac_start_dma(struct gmac *gm);
00072 static void gmac_stop_dma(struct gmac *gm);
00073 static void gmac_set_multicast(struct device *dev);
00074 static int gmac_open(struct device *dev);
00075 static int gmac_close(struct device *dev);
00076 static void gmac_tx_timeout(struct device *dev);
00077 static int gmac_xmit_start(struct sk_buff *skb, struct device *dev);
00078 static void gmac_tx_cleanup(struct device *dev, int force_cleanup);
00079 static void gmac_receive(struct device *dev);
00080 static void gmac_interrupt(int irq, void *dev_id, struct pt_regs *regs);
00081 static struct net_device_stats *gmac_stats(struct device *dev);
00082 int gmac_probe(struct device *dev);
00083
00084 extern int pci_device_loc(struct device_node *dev, unsigned char *bus_ptr,
00085 unsigned char *devfn_ptr);
00086
00087 #ifdef CONFIG_PMAC_PBOOK
00088 int gmac_sleep_notify(struct pmu_sleep_notifier *self, int when);
00089 static struct pmu_sleep_notifier gmac_sleep_notifier = {
00090 gmac_sleep_notify, SLEEP_LEVEL_NET,
00091 };
00092 #endif
00093
00094
00095 static int
00096 mii_read(struct gmac *gm, int phy, int r)
00097 {
00098 int timeout;
00099
00100 GM_OUT(GM_MIF_FRAME_CTL_DATA,
00101 (0x01 << GM_MIF_FRAME_START_SHIFT) |
00102 (0x02 << GM_MIF_FRAME_OPCODE_SHIFT) |
00103 GM_MIF_FRAME_TURNAROUND_HI |
00104 (phy << GM_MIF_FRAME_PHY_ADDR_SHIFT) |
00105 (r << GM_MIF_FRAME_REG_ADDR_SHIFT));
00106
00107 for (timeout = 1000; timeout > 0; --timeout) {
00108 udelay(20);
00109 if (GM_IN(GM_MIF_FRAME_CTL_DATA) & GM_MIF_FRAME_TURNAROUND_LO)
00110 return GM_IN(GM_MIF_FRAME_CTL_DATA) & GM_MIF_FRAME_DATA_MASK;
00111 }
00112 return -1;
00113 }
00114
00115 static int
00116 mii_write(struct gmac *gm, int phy, int r, int v)
00117 {
00118 int timeout;
00119
00120 GM_OUT(GM_MIF_FRAME_CTL_DATA,
00121 (0x01 << GM_MIF_FRAME_START_SHIFT) |
00122 (0x01 << GM_MIF_FRAME_OPCODE_SHIFT) |
00123 GM_MIF_FRAME_TURNAROUND_HI |
00124 (phy << GM_MIF_FRAME_PHY_ADDR_SHIFT) |
00125 (r << GM_MIF_FRAME_REG_ADDR_SHIFT) |
00126 (v & GM_MIF_FRAME_DATA_MASK));
00127
00128 for (timeout = 1000; timeout > 0; --timeout) {
00129 udelay(20);
00130 if (GM_IN(GM_MIF_FRAME_CTL_DATA) & GM_MIF_FRAME_TURNAROUND_LO)
00131 return 0;
00132 }
00133 return -1;
00134 }
00135
00136 static void
00137 mii_poll_start(struct gmac *gm)
00138 {
00139 unsigned int tmp;
00140
00141
00142 tmp = GM_IN(GM_MIF_CFG);
00143 tmp &= ~(GM_MIF_CFGPR_MASK | GM_MIF_CFGPD_MASK);
00144 tmp |= ((gm->phy_addr & 0x1f) << GM_MIF_CFGPD_SHIFT);
00145 tmp |= (MII_SR << GM_MIF_CFGPR_SHIFT);
00146 tmp |= GM_MIF_CFGPE;
00147 GM_OUT(GM_MIF_CFG, tmp);
00148
00149
00150 udelay(GM_MIF_POLL_DELAY);
00151
00152 GM_OUT(GM_MIF_IRQ_MASK, 0xffc0);
00153 }
00154
00155 static void
00156 mii_poll_stop(struct gmac *gm)
00157 {
00158 GM_OUT(GM_MIF_IRQ_MASK, 0xffff);
00159 GM_BIC(GM_MIF_CFG, GM_MIF_CFGPE);
00160 udelay(GM_MIF_POLL_DELAY);
00161 }
00162
00163
00164 static int phy_BCM5400_link_table[8][3] = {
00165 { 0, 0, 0 },
00166 { 0, 0, 0 },
00167 { 1, 0, 0 },
00168 { 0, 1, 0 },
00169 { 0, 1, 0 },
00170 { 1, 1, 0 },
00171 { 1, 0, 1 },
00172 { 1, 0, 1 },
00173 };
00174
00175 static void
00176 mii_interrupt(struct gmac *gm)
00177 {
00178 int phy_status;
00179 int lpar_ability;
00180
00181 mii_poll_stop(gm);
00182
00183
00184 mii_poll_start(gm);
00185
00186
00187 phy_status = mii_read(gm, gm->phy_addr, MII_SR);
00188 if ((phy_status ^ gm->phy_status) & (MII_SR_ASSC | MII_SR_LKS)) {
00189 int full_duplex = 0;
00190 int link_100 = 0;
00191 int gigabit = 0;
00192 #ifdef DEBUG_PHY
00193 printk("Link state change, phy_status: 0x%04x\n", phy_status);
00194 #endif
00195 gm->phy_status = phy_status;
00196
00197 lpar_ability = mii_read(gm, gm->phy_addr, MII_ANLPA);
00198 if (lpar_ability & MII_ANLPA_PAUS)
00199 GM_BIS(GM_MAC_CTRL_CONFIG, GM_MAC_CTRL_CONF_SND_PAUSE_EN);
00200 else
00201 GM_BIC(GM_MAC_CTRL_CONFIG, GM_MAC_CTRL_CONF_SND_PAUSE_EN);
00202
00203
00204 if ((phy_status & MII_SR_LKS) && (phy_status & MII_SR_ASSC)) {
00205 int restart = 0;
00206 if (gm->phy_type == PHY_B5201) {
00207 int aux_stat = mii_read(gm, gm->phy_addr, MII_BCM5201_AUXCTLSTATUS);
00208 #ifdef DEBUG_PHY
00209 printk(" Link up ! BCM5201 aux_stat: 0x%04x\n", aux_stat);
00210 #endif
00211 full_duplex = ((aux_stat & MII_BCM5201_AUXCTLSTATUS_DUPLEX) != 0);
00212 link_100 = ((aux_stat & MII_BCM5201_AUXCTLSTATUS_SPEED) != 0);
00213 } else if (gm->phy_type == PHY_B5400) {
00214 int aux_stat = mii_read(gm, gm->phy_addr, MII_BCM5400_AUXSTATUS);
00215 int link = (aux_stat & MII_BCM5400_AUXSTATUS_LINKMODE_MASK) >>
00216 MII_BCM5400_AUXSTATUS_LINKMODE_SHIFT;
00217 #ifdef DEBUG_PHY
00218 printk(" Link up ! BCM5400 aux_stat: 0x%04x (link mode: %d)\n",
00219 aux_stat, link);
00220 #endif
00221 full_duplex = phy_BCM5400_link_table[link][0];
00222 link_100 = phy_BCM5400_link_table[link][1];
00223 gigabit = phy_BCM5400_link_table[link][2];
00224 } else if (gm->phy_type == PHY_LXT971) {
00225 int stat2 = mii_read(gm, gm->phy_addr, MII_LXT971_STATUS2);
00226 #ifdef DEBUG_PHY
00227 printk(" Link up ! LXT971 stat2: 0x%04x\n", stat2);
00228 #endif
00229 full_duplex = ((stat2 & MII_LXT971_STATUS2_FULLDUPLEX) != 0);
00230 link_100 = ((stat2 & MII_LXT971_STATUS2_SPEED) != 0);
00231 }
00232 #ifdef DEBUG_PHY
00233 printk(" full_duplex: %d, speed: %s\n", full_duplex,
00234 gigabit ? "1000" : (link_100 ? "100" : "10"));
00235 #endif
00236 if (gigabit != gm->gigabit) {
00237 gm->gigabit = gigabit;
00238 gmac_set_gigabit_mode(gm, gm->gigabit);
00239 restart = 1;
00240 }
00241 if (full_duplex != gm->full_duplex) {
00242 gm->full_duplex = full_duplex;
00243 gmac_set_duplex_mode(gm, gm->full_duplex);
00244 restart = 1;
00245 }
00246 if (restart)
00247 gmac_start_dma(gm);
00248 } else if (!(phy_status & MII_SR_LKS)) {
00249 #ifdef DEBUG_PHY
00250 printk(" Link down !\n");
00251 #endif
00252 }
00253 }
00254 }
00255
00256 static int
00257 mii_do_reset_phy(struct gmac *gm, int phy_addr)
00258 {
00259 int mii_control, timeout;
00260
00261 mii_control = mii_read(gm, phy_addr, MII_CR);
00262 mii_write(gm, phy_addr, MII_CR, mii_control | MII_CR_RST);
00263 mdelay(10);
00264 for (timeout = 100; timeout > 0; --timeout) {
00265 mii_control = mii_read(gm, phy_addr, MII_CR);
00266 if (mii_control == -1) {
00267 printk(KERN_ERR "%s PHY died after reset !\n",
00268 gm->dev->name);
00269 return 1;
00270 }
00271 if ((mii_control & MII_CR_RST) == 0)
00272 break;
00273 mdelay(10);
00274 }
00275 if (mii_control & MII_CR_RST) {
00276 printk(KERN_ERR "%s PHY reset timeout !\n", gm->dev->name);
00277 return 1;
00278 }
00279 mii_write(gm, phy_addr, MII_CR, mii_control & ~MII_CR_ISOL);
00280 return 0;
00281 }
00282
00283 static void
00284 mii_init_BCM5400(struct gmac *gm)
00285 {
00286 int data;
00287
00288 data = mii_read(gm, gm->phy_addr, MII_BCM5400_AUXCONTROL);
00289 data |= MII_BCM5400_AUXCONTROL_PWR10BASET;
00290 mii_write(gm, gm->phy_addr, MII_BCM5400_AUXCONTROL, data);
00291
00292 data = mii_read(gm, gm->phy_addr, MII_BCM5400_GB_CONTROL);
00293 data |= MII_BCM5400_GB_CONTROL_FULLDUPLEXCAP;
00294 mii_write(gm, gm->phy_addr, MII_BCM5400_GB_CONTROL, data);
00295
00296 mdelay(10);
00297 mii_do_reset_phy(gm, 0x1f);
00298
00299 data = mii_read(gm, 0x1f, MII_BCM5201_MULTIPHY);
00300 data |= MII_BCM5201_MULTIPHY_SERIALMODE;
00301 mii_write(gm, 0x1f, MII_BCM5201_MULTIPHY, data);
00302
00303 data = mii_read(gm, gm->phy_addr, MII_BCM5400_AUXCONTROL);
00304 data &= ~MII_BCM5400_AUXCONTROL_PWR10BASET;
00305 mii_write(gm, gm->phy_addr, MII_BCM5400_AUXCONTROL, data);
00306 }
00307
00308 static int
00309 mii_lookup_and_reset(struct gmac *gm)
00310 {
00311 int i, mii_status, mii_control;
00312
00313 gm->phy_addr = -1;
00314 gm->phy_type = PHY_UNKNOWN;
00315
00316
00317 feature_set_gmac_phy_reset(gm->of_node, KL_GPIO_ETH_PHY_RESET_ASSERT);
00318 mdelay(10);
00319 feature_set_gmac_phy_reset(gm->of_node, KL_GPIO_ETH_PHY_RESET_RELEASE);
00320 mdelay(10);
00321
00322
00323 for(i=0; i<32; i++) {
00324 mii_control = mii_read(gm, i, MII_CR);
00325 mii_status = mii_read(gm, i, MII_SR);
00326 if (mii_control != -1 && mii_status != -1 &&
00327 (mii_control != 0xffff || mii_status != 0xffff))
00328 break;
00329 }
00330 gm->phy_addr = i;
00331 if (gm->phy_addr > 31)
00332 return 0;
00333
00334
00335 if (mii_do_reset_phy(gm, gm->phy_addr))
00336 goto fail;
00337
00338
00339 gm->phy_id = (mii_read(gm, gm->phy_addr, MII_ID0) << 16) |
00340 mii_read(gm, gm->phy_addr, MII_ID1);
00341 #ifdef DEBUG_PHY
00342 printk("%s PHY ID: 0x%08x\n", gm->dev->name, gm->phy_id);
00343 #endif
00344 if ((gm->phy_id & MII_BCM5400_MASK) == MII_BCM5400_ID) {
00345 gm->phy_type = PHY_B5400;
00346 printk(KERN_ERR "%s Found Broadcom BCM5400 PHY (Gigabit)\n",
00347 gm->dev->name);
00348 mii_init_BCM5400(gm);
00349 } else if ((gm->phy_id & MII_BCM5201_MASK) == MII_BCM5201_ID) {
00350 gm->phy_type = PHY_B5201;
00351 printk(KERN_INFO "%s Found Broadcom BCM5201 PHY\n", gm->dev->name);
00352 } else if ((gm->phy_id & MII_LXT971_MASK) == MII_LXT971_ID) {
00353 gm->phy_type = PHY_LXT971;
00354 printk(KERN_INFO "%s Found LevelOne LX971 PHY\n", gm->dev->name);
00355 } else {
00356 printk(KERN_ERR "%s: Warning ! Unknown PHY ID 0x%08x !\n",
00357 gm->dev->name, gm->phy_id);
00358 }
00359
00360 return 1;
00361
00362 fail:
00363 gm->phy_addr = -1;
00364 return 0;
00365 }
00366
00367
00368
00369
00370 static void
00371 mii_setup_phy(struct gmac *gm)
00372 {
00373 int data;
00374
00375
00376 data = mii_read(gm, gm->phy_addr, MII_CR);
00377 mii_write(gm, gm->phy_addr, MII_CR, data & ~MII_CR_ASSE);
00378
00379
00380
00381 data = mii_read(gm, gm->phy_addr, MII_ANA);
00382 data |= MII_ANA_TXAM | MII_ANA_FDAM | MII_ANA_10M;
00383 mii_write(gm, gm->phy_addr, MII_ANA, data);
00384
00385
00386 data = mii_read(gm, gm->phy_addr, MII_CR);
00387 data |= MII_CR_ASSE;
00388 mii_write(gm, gm->phy_addr, MII_CR, data);
00389 data |= MII_CR_RAN;
00390 mii_write(gm, gm->phy_addr, MII_CR, data);
00391 }
00392
00393 static void
00394 gmac_set_power(struct gmac *gm, int power_up)
00395 {
00396 if (power_up) {
00397 feature_set_gmac_power(gm->of_node, 1);
00398 if (gm->pci_devfn != 0xff) {
00399 u16 cmd;
00400
00401
00402 pcibios_read_config_word(gm->pci_bus, gm->pci_devfn,
00403 PCI_COMMAND, &cmd);
00404 cmd |= PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE;
00405 pcibios_write_config_word(gm->pci_bus, gm->pci_devfn,
00406 PCI_COMMAND, cmd);
00407 pcibios_write_config_byte(gm->pci_bus, gm->pci_devfn,
00408 PCI_LATENCY_TIMER, 16);
00409 pcibios_write_config_byte(gm->pci_bus, gm->pci_devfn,
00410 PCI_CACHE_LINE_SIZE, 8);
00411 }
00412 } else {
00413
00414 gm->phy_type = 0;
00415 feature_set_gmac_power(gm->of_node, 0);
00416 }
00417 }
00418
00419 static int
00420 gmac_powerup_and_reset(struct device *dev)
00421 {
00422 struct gmac *gm = (struct gmac *) dev->priv;
00423 int timeout;
00424
00425
00426 gmac_set_power(gm, 1);
00427
00428 GM_OUT(GM_RESET, GM_RESET_TX | GM_RESET_RX);
00429 for (timeout = 100; timeout > 0; --timeout) {
00430 mdelay(10);
00431 if ((GM_IN(GM_RESET) & (GM_RESET_TX | GM_RESET_RX)) == 0) {
00432
00433 GM_OUT(GM_IRQ_MASK, 0xffffffff);
00434 return 0;
00435 }
00436 }
00437 printk(KERN_ERR "%s reset failed!\n", dev->name);
00438 gmac_set_power(gm, 0);
00439 return -1;
00440 }
00441
00442
00443 static void
00444 gmac_set_duplex_mode(struct gmac *gm, int full_duplex)
00445 {
00446
00447 GM_BIC(GM_MAC_TX_CONFIG, GM_MAC_TX_CONF_ENABLE);
00448 while(GM_IN(GM_MAC_TX_CONFIG) & GM_MAC_TX_CONF_ENABLE)
00449 ;
00450
00451 if (full_duplex) {
00452 GM_BIS(GM_MAC_TX_CONFIG, GM_MAC_TX_CONF_IGNORE_CARRIER
00453 | GM_MAC_TX_CONF_IGNORE_COLL);
00454 GM_BIC(GM_MAC_XIF_CONFIG, GM_MAC_XIF_CONF_DISABLE_ECHO);
00455 } else {
00456 GM_BIC(GM_MAC_TX_CONFIG, GM_MAC_TX_CONF_IGNORE_CARRIER
00457 | GM_MAC_TX_CONF_IGNORE_COLL);
00458 GM_BIS(GM_MAC_XIF_CONFIG, GM_MAC_XIF_CONF_DISABLE_ECHO);
00459 }
00460 }
00461
00462
00463 static void
00464 gmac_set_gigabit_mode(struct gmac *gm, int gigabit)
00465 {
00466
00467 GM_BIC(GM_MAC_TX_CONFIG, GM_MAC_TX_CONF_ENABLE);
00468 while(GM_IN(GM_MAC_TX_CONFIG) & GM_MAC_TX_CONF_ENABLE)
00469 ;
00470
00471 if (gigabit) {
00472 GM_BIS(GM_MAC_XIF_CONFIG, GM_MAC_XIF_CONF_GMII_MODE);
00473 } else {
00474 GM_BIC(GM_MAC_XIF_CONFIG, GM_MAC_XIF_CONF_GMII_MODE);
00475 }
00476 }
00477
00478 static void
00479 gmac_mac_init(struct gmac *gm, unsigned char *mac_addr)
00480 {
00481 int i, fifo_size;
00482
00483
00484 GM_OUT(GM_MAC_RANDOM_SEED, mac_addr[5] | (mac_addr[4] << 8));
00485
00486
00487 GM_OUT(GM_PCS_DATAPATH_MODE, GM_PCS_DATAPATH_MII);
00488
00489
00490
00491
00492 GM_OUT(GM_MAC_XIF_CONFIG, GM_MAC_XIF_CONF_TX_MII_OUT_EN
00493 | GM_MAC_XIF_CONF_FULL_DPLX_LED);
00494
00495
00496 GM_OUT(GM_MAC_TX_MASK, 0xffff);
00497 GM_OUT(GM_MAC_RX_MASK, 0xffff);
00498 GM_OUT(GM_MAC_CTRLSTAT_MASK, 0xff);
00499
00500
00501 GM_OUT(GM_MAC_SND_PAUSE, GM_MAC_SND_PAUSE_DEFAULT);
00502 GM_OUT(GM_MAC_CTRL_CONFIG, GM_MAC_CTRL_CONF_RCV_PAUSE_EN);
00503
00504
00505 GM_OUT(GM_GCONF, GM_GCONF_BURST_SZ |
00506 (31 << GM_GCONF_TXDMA_LIMIT_SHIFT) |
00507 (31 << GM_GCONF_RXDMA_LIMIT_SHIFT));
00508 GM_OUT(GM_TX_CONF,
00509 (GM_TX_CONF_FIFO_THR_DEFAULT << GM_TX_CONF_FIFO_THR_SHIFT) |
00510 NTX_CONF);
00511
00512
00513
00514
00515 GM_OUT(GM_RX_CONF,
00516 (RX_OFFSET << GM_RX_CONF_FBYTE_OFF_SHIFT) |
00517 (0x22 << GM_RX_CONF_CHK_START_SHIFT) |
00518 (GM_RX_CONF_DMA_THR_DEFAULT << GM_RX_CONF_DMA_THR_SHIFT) |
00519 NRX_CONF);
00520
00521
00522 GM_OUT(GM_MAC_INTR_PKT_GAP0, GM_MAC_INTR_PKT_GAP0_DEFAULT);
00523 GM_OUT(GM_MAC_INTR_PKT_GAP1, GM_MAC_INTR_PKT_GAP1_DEFAULT);
00524 GM_OUT(GM_MAC_INTR_PKT_GAP2, GM_MAC_INTR_PKT_GAP2_DEFAULT);
00525 GM_OUT(GM_MAC_MIN_FRAME_SIZE, GM_MAC_MIN_FRAME_SIZE_DEFAULT);
00526 GM_OUT(GM_MAC_MAX_FRAME_SIZE, GM_MAC_MAX_FRAME_SIZE_DEFAULT);
00527 GM_OUT(GM_MAC_PREAMBLE_LEN, GM_MAC_PREAMBLE_LEN_DEFAULT);
00528 GM_OUT(GM_MAC_JAM_SIZE, GM_MAC_JAM_SIZE_DEFAULT);
00529 GM_OUT(GM_MAC_ATTEMPT_LIMIT, GM_MAC_ATTEMPT_LIMIT_DEFAULT);
00530 GM_OUT(GM_MAC_SLOT_TIME, GM_MAC_SLOT_TIME_DEFAULT);
00531 GM_OUT(GM_MAC_CONTROL_TYPE, GM_MAC_CONTROL_TYPE_DEFAULT);
00532
00533
00534 GM_OUT(GM_MAC_ADDR_NORMAL0, (mac_addr[4] << 8) + mac_addr[5]);
00535 GM_OUT(GM_MAC_ADDR_NORMAL1, (mac_addr[2] << 8) + mac_addr[3]);
00536 GM_OUT(GM_MAC_ADDR_NORMAL2, (mac_addr[0] << 8) + mac_addr[1]);
00537 GM_OUT(GM_MAC_ADDR_ALT0, 0);
00538 GM_OUT(GM_MAC_ADDR_ALT1, 0);
00539 GM_OUT(GM_MAC_ADDR_ALT2, 0);
00540 GM_OUT(GM_MAC_ADDR_CTRL0, 0x0001);
00541 GM_OUT(GM_MAC_ADDR_CTRL1, 0xc200);
00542 GM_OUT(GM_MAC_ADDR_CTRL2, 0x0180);
00543 GM_OUT(GM_MAC_ADDR_FILTER0, 0);
00544 GM_OUT(GM_MAC_ADDR_FILTER1, 0);
00545 GM_OUT(GM_MAC_ADDR_FILTER2, 0);
00546 GM_OUT(GM_MAC_ADDR_FILTER_MASK1_2, 0);
00547 GM_OUT(GM_MAC_ADDR_FILTER_MASK0, 0);
00548 for (i = 0; i < 27; ++i)
00549 GM_OUT(GM_MAC_ADDR_FILTER_HASH0 + i, 0);
00550
00551
00552 GM_OUT(GM_MAC_COLLISION_CTR, 0);
00553 GM_OUT(GM_MAC_FIRST_COLLISION_CTR, 0);
00554 GM_OUT(GM_MAC_EXCS_COLLISION_CTR, 0);
00555 GM_OUT(GM_MAC_LATE_COLLISION_CTR, 0);
00556 GM_OUT(GM_MAC_DEFER_TIMER_COUNTER, 0);
00557 GM_OUT(GM_MAC_PEAK_ATTEMPTS, 0);
00558 GM_OUT(GM_MAC_RX_FRAME_CTR, 0);
00559 GM_OUT(GM_MAC_RX_LEN_ERR_CTR, 0);
00560 GM_OUT(GM_MAC_RX_ALIGN_ERR_CTR, 0);
00561 GM_OUT(GM_MAC_RX_CRC_ERR_CTR, 0);
00562 GM_OUT(GM_MAC_RX_CODE_VIOLATION_CTR, 0);
00563
00564
00565 GM_OUT(GM_MAC_TX_CONFIG, 0);
00566 GM_OUT(GM_MAC_RX_CONFIG, 0);
00567 gmac_set_duplex_mode(gm, gm->full_duplex);
00568
00569
00570 fifo_size = GM_IN(GM_RX_FIFO_SIZE);
00571 GM_OUT(GM_RX_PTH,
00572 ((fifo_size - ((GM_MAC_MAX_FRAME_SIZE_ALIGN + 8) * 2 / GM_RX_PTH_UNITS))
00573 << GM_RX_PTH_OFF_SHIFT) |
00574 ((fifo_size - ((GM_MAC_MAX_FRAME_SIZE_ALIGN + 8) * 3 / GM_RX_PTH_UNITS))
00575 << GM_RX_PTH_ON_SHIFT));
00576
00577
00578 if (GM_IN(GM_BIF_CFG) & GM_BIF_CFG_M66EN)
00579 GM_OUT(GM_RX_BLANK, (5 << GM_RX_BLANK_INTR_PACKETS_SHIFT)
00580 | (8 << GM_RX_BLANK_INTR_TIME_SHIFT));
00581 else
00582 GM_OUT(GM_RX_BLANK, (5 << GM_RX_BLANK_INTR_PACKETS_SHIFT)
00583 | (4 << GM_RX_BLANK_INTR_TIME_SHIFT));
00584 }
00585
00586 static void
00587 gmac_init_rings(struct gmac *gm, int from_irq)
00588 {
00589 int i;
00590 struct sk_buff *skb;
00591 unsigned char *data;
00592 struct gmac_dma_desc *ring;
00593 int gfp_flags = GFP_KERNEL;
00594
00595 if (from_irq || in_interrupt())
00596 gfp_flags = GFP_ATOMIC;
00597
00598
00599 ring = (struct gmac_dma_desc *) gm->rxring;
00600 memset(ring, 0, NRX * sizeof(struct gmac_dma_desc));
00601 for (i = 0; i < NRX; ++i, ++ring) {
00602 data = dummy_buf;
00603 gm->rx_buff[i] = skb = gmac_alloc_skb(RX_BUF_ALLOC_SIZE, gfp_flags);
00604 if (skb != 0) {
00605 skb->dev = gm->dev;
00606 skb_put(skb, ETH_FRAME_LEN + RX_OFFSET);
00607 skb_reserve(skb, RX_OFFSET);
00608 data = skb->data - RX_OFFSET;
00609 }
00610 st_le32(&ring->lo_addr, virt_to_bus(data));
00611 st_le32(&ring->size, RX_SZ_OWN | ((RX_BUF_ALLOC_SIZE-RX_OFFSET) << RX_SZ_SHIFT));
00612 }
00613
00614
00615 ring = (struct gmac_dma_desc *) gm->txring;
00616 memset(ring, 0, NTX * sizeof(struct gmac_dma_desc));
00617
00618 gm->next_rx = 0;
00619 gm->next_tx = 0;
00620 gm->tx_gone = 0;
00621
00622
00623 mb();
00624 GM_OUT(GM_RX_DESC_HI, 0);
00625 GM_OUT(GM_RX_DESC_LO, virt_to_bus(gm->rxring));
00626 GM_OUT(GM_TX_DESC_HI, 0);
00627 GM_OUT(GM_TX_DESC_LO, virt_to_bus(gm->txring));
00628 }
00629
00630 static void
00631 gmac_start_dma(struct gmac *gm)
00632 {
00633
00634 GM_BIS(GM_TX_CONF, GM_TX_CONF_DMA_EN);
00635 mdelay(20);
00636 GM_BIS(GM_RX_CONF, GM_RX_CONF_DMA_EN);
00637 mdelay(20);
00638 GM_BIS(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_ENABLE);
00639 mdelay(20);
00640 GM_BIS(GM_MAC_TX_CONFIG, GM_MAC_TX_CONF_ENABLE);
00641 mdelay(20);
00642
00643 GM_OUT(GM_RX_KICK, NRX);
00644 GM_BIC(GM_IRQ_MASK, GM_IRQ_TX_INT_ME |
00645 GM_IRQ_TX_ALL |
00646 GM_IRQ_RX_DONE |
00647 GM_IRQ_RX_TAG_ERR |
00648 GM_IRQ_MAC_RX |
00649 GM_IRQ_MIF |
00650 GM_IRQ_BUS_ERROR);
00651 }
00652
00653 static void
00654 gmac_stop_dma(struct gmac *gm)
00655 {
00656
00657 GM_OUT(GM_IRQ_MASK, 0xffffffff);
00658
00659 GM_BIC(GM_TX_CONF, GM_TX_CONF_DMA_EN);
00660 mdelay(20);
00661 GM_BIC(GM_RX_CONF, GM_RX_CONF_DMA_EN);
00662 mdelay(20);
00663 GM_BIC(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_ENABLE);
00664 mdelay(20);
00665 GM_BIC(GM_MAC_TX_CONFIG, GM_MAC_TX_CONF_ENABLE);
00666 mdelay(20);
00667 }
00668
00669 #define CRC_POLY 0xedb88320
00670 static void
00671 gmac_set_multicast(struct device *dev)
00672 {
00673 struct gmac *gm = (struct gmac *) dev->priv;
00674 struct dev_mc_list *dmi = dev->mc_list;
00675 int i,j,k,b;
00676 unsigned long crc;
00677 int multicast_hash = 0;
00678 int multicast_all = 0;
00679 int promisc = 0;
00680
00681
00682 set_bit(0, (void *) &dev->tbusy);
00683
00684 if (dev->flags & IFF_PROMISC)
00685 promisc = 1;
00686 else if ((dev->flags & IFF_ALLMULTI) ) {
00687 multicast_all = 1;
00688 } else {
00689 u16 hash_table[16];
00690
00691 for(i = 0; i < 16; i++)
00692 hash_table[i] = 0;
00693
00694 for (i = 0; i < dev->mc_count; i++) {
00695 crc = ~0;
00696 for (j = 0; j < 6; ++j) {
00697 b = dmi->dmi_addr[j];
00698 for (k = 0; k < 8; ++k) {
00699 if ((crc ^ b) & 1)
00700 crc = (crc >> 1) ^ CRC_POLY;
00701 else
00702 crc >>= 1;
00703 b >>= 1;
00704 }
00705 }
00706 j = crc >> 24;
00707 hash_table[j >> 4] |= 1 << (15 - (j & 0xf));
00708 dmi = dmi->next;
00709 }
00710
00711 for (i = 0; i < 16; i++)
00712 GM_OUT(GM_MAC_ADDR_FILTER_HASH0 + (i*4), hash_table[i]);
00713 GM_BIS(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_HASH_ENABLE);
00714 multicast_hash = 1;
00715 }
00716
00717 if (promisc)
00718 GM_BIS(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_RX_ALL);
00719 else
00720 GM_BIC(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_RX_ALL);
00721
00722 if (multicast_hash)
00723 GM_BIS(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_HASH_ENABLE);
00724 else
00725 GM_BIC(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_HASH_ENABLE);
00726
00727 if (multicast_all)
00728 GM_BIS(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_RX_ALL_MULTI);
00729 else
00730 GM_BIC(GM_MAC_RX_CONFIG, GM_MAC_RX_CONF_RX_ALL_MULTI);
00731
00732
00733 dev->tbusy = 0;
00734 }
00735
00736 static int
00737 gmac_open(struct device *dev)
00738 {
00739 struct gmac *gm = (struct gmac *) dev->priv;
00740
00741 MOD_INC_USE_COUNT;
00742
00743
00744 if (gmac_powerup_and_reset(dev)) {
00745 MOD_DEC_USE_COUNT;
00746 return -EIO;
00747 }
00748
00749
00750 if (request_irq(dev->irq, gmac_interrupt, 0, dev->name, dev)) {
00751 printk(KERN_ERR "%s can't get irq %d\n", dev->name, dev->irq);
00752 MOD_DEC_USE_COUNT;
00753 return -EAGAIN;
00754 }
00755
00756 gm->full_duplex = 0;
00757 gm->phy_status = 0;
00758
00759
00760 if (!mii_lookup_and_reset(gm))
00761 printk(KERN_WARNING "%s WARNING ! Can't find PHY\n", dev->name);
00762
00763
00764 mii_setup_phy(gm);
00765
00766
00767 gmac_init_rings(gm, 0);
00768
00769
00770 gmac_mac_init(gm, dev->dev_addr);
00771
00772
00773 gmac_set_multicast(dev);
00774
00775
00776
00777
00778
00779
00780 mii_interrupt(gm);
00781
00782
00783 gmac_start_dma(gm);
00784
00785 gm->opened = 1;
00786
00787 return 0;
00788 }
00789
00790 static int
00791 gmac_close(struct device *dev)
00792 {
00793 struct gmac *gm = (struct gmac *) dev->priv;
00794 int i;
00795
00796 gm->opened = 0;
00797
00798 gmac_stop_dma(gm);
00799
00800 mii_poll_stop(gm);
00801
00802 free_irq(dev->irq, dev);
00803
00804
00805 gmac_set_power(gm, 0);
00806
00807 for (i = 0; i < NRX; ++i) {
00808 if (gm->rx_buff[i] != 0) {
00809 dev_kfree_skb(gm->rx_buff[i]);
00810 gm->rx_buff[i] = 0;
00811 }
00812 }
00813 for (i = 0; i < NTX; ++i) {
00814 if (gm->tx_buff[i] != 0) {
00815 dev_kfree_skb(gm->tx_buff[i]);
00816 gm->tx_buff[i] = 0;
00817 }
00818 }
00819
00820 MOD_DEC_USE_COUNT;
00821 return 0;
00822 }
00823
00824 #ifdef CONFIG_PMAC_PBOOK
00825 int
00826 gmac_sleep_notify(struct pmu_sleep_notifier *self, int when)
00827 {
00828 struct gmac *gm;
00829 int i;
00830
00831
00832 if (gmacs == NULL)
00833 return PBOOK_SLEEP_OK;
00834
00835 gm = (struct gmac *) gmacs->priv;
00836 if (!gm->opened)
00837 return PBOOK_SLEEP_OK;
00838
00839 switch (when) {
00840 case PBOOK_SLEEP_REQUEST:
00841 break;
00842 case PBOOK_SLEEP_REJECT:
00843 break;
00844 case PBOOK_SLEEP_NOW:
00845 disable_irq(gm->dev->irq);
00846 gm->dev->tbusy = 1;
00847 gmac_stop_dma(gm);
00848 mii_poll_stop(gm);
00849 gmac_set_power(gm, 0);
00850 for (i = 0; i < NRX; ++i) {
00851 if (gm->rx_buff[i] != 0) {
00852 dev_kfree_skb(gm->rx_buff[i]);
00853 gm->rx_buff[i] = 0;
00854 }
00855 }
00856 for (i = 0; i < NTX; ++i) {
00857 if (gm->tx_buff[i] != 0) {
00858 dev_kfree_skb(gm->tx_buff[i]);
00859 gm->tx_buff[i] = 0;
00860 }
00861 }
00862 break;
00863 case PBOOK_WAKE:
00864
00865 gmac_powerup_and_reset(gm->dev);
00866 gm->full_duplex = 0;
00867 gm->phy_status = 0;
00868 mii_lookup_and_reset(gm);
00869 mii_setup_phy(gm);
00870 gmac_init_rings(gm, 0);
00871 gmac_mac_init(gm, gm->dev->dev_addr);
00872 gmac_set_multicast(gm->dev);
00873 mii_interrupt(gm);
00874 gmac_start_dma(gm);
00875 gm->dev->tbusy = 0;
00876 enable_irq(gm->dev->irq);
00877 break;
00878 }
00879 return PBOOK_SLEEP_OK;
00880 }
00881 #endif
00882
00883
00884
00885
00886 static void
00887 gmac_tx_timeout(struct device *dev)
00888 {
00889 struct gmac *gm = (struct gmac *) dev->priv;
00890 int i, timeout;
00891 unsigned long flags;
00892
00893 printk (KERN_ERR "%s: transmit timed out, resetting\n", dev->name);
00894
00895 spin_lock_irqsave(&gm->lock, flags);
00896
00897
00898
00899
00900
00901
00902
00903
00904 gmac_stop_dma(gm);
00905
00906 gmac_tx_cleanup(dev, 1);
00907
00908 for (i = 0; i < NRX; ++i) {
00909 if (gm->rx_buff[i] != 0) {
00910 dev_kfree_skb(gm->rx_buff[i]);
00911 gm->rx_buff[i] = 0;
00912 }
00913 }
00914
00915 GM_OUT(GM_RESET, GM_RESET_TX | GM_RESET_RX);
00916 for (timeout = 100; timeout > 0; --timeout) {
00917 mdelay(10);
00918 if ((GM_IN(GM_RESET) & (GM_RESET_TX | GM_RESET_RX)) == 0) {
00919
00920 GM_OUT(GM_IRQ_MASK, 0xffffffff);
00921 break;
00922 }
00923 }
00924 if (!timeout)
00925 printk(KERN_ERR "%s reset chip failed !\n", dev->name);
00926
00927 gmac_init_rings(gm, 1);
00928
00929 gmac_mac_init(gm, dev->dev_addr);
00930
00931 gmac_set_multicast(dev);
00932
00933 mii_interrupt(gm);
00934
00935 gmac_start_dma(gm);
00936
00937 spin_unlock_irqrestore(&gm->lock, flags);
00938
00939 dev->tbusy = 0;
00940 }
00941
00942
00943 static int
00944 gmac_xmit_start(struct sk_buff *skb, struct device *dev)
00945 {
00946 struct gmac *gm = (struct gmac *) dev->priv;
00947 volatile struct gmac_dma_desc *dp;
00948 int i;
00949 unsigned long flags;
00950
00951
00952 if(test_and_set_bit(0, (void *) &dev->tbusy) != 0) {
00953 int tickssofar = jiffies - dev->trans_start;
00954
00955 if (tickssofar >= 40)
00956 gmac_tx_timeout(dev);
00957 return 1;
00958 }
00959
00960 spin_lock_irqsave(&gm->lock, flags);
00961
00962 i = gm->next_tx;
00963 if (gm->tx_buff[i] != 0) {
00964
00965 spin_unlock_irqrestore(&gm->lock, flags);
00966 return 1;
00967 }
00968 gm->next_tx = (i + 1) & (NTX - 1);
00969 gm->tx_buff[i] = skb;
00970
00971 dp = &gm->txring[i];
00972
00973
00974
00975 dp->flags = TX_FL_INTERRUPT;
00976 dp->hi_addr = 0;
00977 st_le32(&dp->lo_addr, virt_to_bus(skb->data));
00978 mb();
00979 st_le32(&dp->size, TX_SZ_SOP | TX_SZ_EOP | skb->len);
00980 mb();
00981
00982 dev->trans_start = jiffies;
00983 GM_OUT(GM_TX_KICK, gm->next_tx);
00984
00985 dev->tbusy = (gm->tx_buff[gm->next_tx] != 0);
00986
00987 spin_unlock_irqrestore(&gm->lock, flags);
00988
00989 return 0;
00990 }
00991
00992
00993
00994
00995
00996 static void
00997 gmac_tx_cleanup(struct device *dev, int force_cleanup)
00998 {
00999 struct gmac *gm = (struct gmac *) dev->priv;
01000 volatile struct gmac_dma_desc *dp;
01001 struct sk_buff *skb;
01002 int gone, i;
01003
01004 i = gm->tx_gone;
01005 do {
01006 gone = GM_IN(GM_TX_COMP);
01007 skb = gm->tx_buff[i];
01008 if (skb == NULL)
01009 break;
01010 dp = &gm->txring[i];
01011 if (force_cleanup)
01012 ++gm->stats.tx_errors;
01013 else {
01014 ++gm->stats.tx_packets;
01015 gm->stats.tx_bytes += skb->len;
01016 }
01017 gm->tx_buff[i] = NULL;
01018 dev_kfree_skb(skb);
01019 if (++i >= NTX)
01020 i = 0;
01021 } while (force_cleanup || i != gone);
01022 gm->tx_gone = i;
01023
01024 if (!force_cleanup && dev->tbusy &&
01025 (gm->tx_buff[gm->next_tx] == 0))
01026 dev->tbusy = 0;
01027 }
01028
01029 static void
01030 gmac_receive(struct device *dev)
01031 {
01032 struct gmac *gm = (struct gmac *) dev->priv;
01033 int i = gm->next_rx;
01034 volatile struct gmac_dma_desc *dp;
01035 struct sk_buff *skb, *new_skb;
01036 int len, flags, drop, last;
01037 unsigned char *data;
01038 u16 csum;
01039
01040 last = -1;
01041 for (;;) {
01042 dp = &gm->rxring[i];
01043 if (ld_le32(&dp->size) & RX_SZ_OWN)
01044 break;
01045 len = (ld_le32(&dp->size) >> 16) & 0x7fff;
01046 flags = ld_le32(&dp->flags);
01047 skb = gm->rx_buff[i];
01048 drop = 0;
01049 new_skb = NULL;
01050 csum = ld_le32(&dp->size) & RX_SZ_CKSUM_MASK;
01051
01052
01053 if ((len < ETH_ZLEN)||(flags & RX_FL_CRC_ERROR)||(!skb)) {
01054 ++gm->stats.rx_errors;
01055 if (len < ETH_ZLEN)
01056 ++gm->stats.rx_length_errors;
01057 if (flags & RX_FL_CRC_ERROR)
01058 ++gm->stats.rx_crc_errors;
01059 if (!skb) {
01060 ++gm->stats.rx_dropped;
01061 skb = gmac_alloc_skb(RX_BUF_ALLOC_SIZE, GFP_ATOMIC);
01062 if (skb) {
01063 gm->rx_buff[i] = skb;
01064 skb->dev = dev;
01065 skb_put(skb, ETH_FRAME_LEN + RX_OFFSET);
01066 skb_reserve(skb, RX_OFFSET);
01067 }
01068 }
01069 drop = 1;
01070 } else {
01071
01072 if (len > RX_COPY_THRESHOLD) {
01073 new_skb = gmac_alloc_skb(RX_BUF_ALLOC_SIZE, GFP_ATOMIC);
01074 if(!new_skb) {
01075 printk(KERN_INFO "%s: Out of SKBs in Rx, packet dropped !\n",
01076 dev->name);
01077 drop = 1;
01078 ++gm->stats.rx_dropped;
01079 goto finish;
01080 }
01081
01082 gm->rx_buff[i] = new_skb;
01083 new_skb->dev = dev;
01084 skb_put(new_skb, ETH_FRAME_LEN + RX_OFFSET);
01085 skb_reserve(new_skb, RX_OFFSET);
01086 skb_trim(skb, len);
01087 } else {
01088
01089 struct sk_buff *copy_skb = dev_alloc_skb(len + RX_OFFSET);
01090
01091 if(!copy_skb) {
01092 printk(KERN_INFO "%s: Out of SKBs in Rx, packet dropped !\n",
01093 dev->name);
01094 drop = 1;
01095 ++gm->stats.rx_dropped;
01096 goto finish;
01097 }
01098
01099 copy_skb->dev = dev;
01100 skb_reserve(copy_skb, RX_OFFSET);
01101 skb_put(copy_skb, len);
01102 memcpy(copy_skb->data, skb->data, len);
01103
01104 new_skb = skb;
01105 skb = copy_skb;
01106 }
01107 }
01108 finish:
01109
01110 if (drop) {
01111 new_skb = skb;
01112 skb = NULL;
01113 }
01114
01115
01116 data = new_skb ? (new_skb->data - RX_OFFSET) : dummy_buf;
01117 dp->hi_addr = 0;
01118 st_le32(&dp->lo_addr, virt_to_bus(data));
01119 mb();
01120 st_le32(&dp->size, RX_SZ_OWN | ((RX_BUF_ALLOC_SIZE-RX_OFFSET) << RX_SZ_SHIFT));
01121
01122
01123 if (skb) {
01124
01125 if(!(csum ^ 0xffff))
01126 skb->ip_summed = CHECKSUM_UNNECESSARY;
01127 else
01128 skb->ip_summed = CHECKSUM_NONE;
01129 skb->ip_summed = CHECKSUM_NONE;
01130 skb->protocol = eth_type_trans(skb, dev);
01131 netif_rx(skb);
01132 gm->stats.rx_bytes += skb->len;
01133 ++gm->stats.rx_packets;
01134 }
01135
01136 last = i;
01137 if (++i >= NRX)
01138 i = 0;
01139 }
01140 gm->next_rx = i;
01141 if (last >= 0) {
01142 mb();
01143 GM_OUT(GM_RX_KICK, last & 0xfffffffc);
01144 }
01145 }
01146
01147 static void
01148 gmac_interrupt(int irq, void *dev_id, struct pt_regs *regs)
01149 {
01150 struct device *dev = (struct device *) dev_id;
01151 struct gmac *gm = (struct gmac *) dev->priv;
01152 unsigned int status;
01153
01154 if (test_and_set_bit(0, (void*)&dev->interrupt)) {
01155 printk(KERN_ERR "%s: Duplicate entry of the interrupt handler !\n",
01156 dev->name);
01157 dev->interrupt = 0;
01158 return;
01159 }
01160
01161 status = GM_IN(GM_IRQ_STATUS);
01162 if (status & (GM_IRQ_BUS_ERROR | GM_IRQ_MIF))
01163 GM_OUT(GM_IRQ_ACK, status & (GM_IRQ_BUS_ERROR | GM_IRQ_MIF));
01164
01165 if (status & (GM_IRQ_RX_TAG_ERR | GM_IRQ_BUS_ERROR)) {
01166 printk(KERN_ERR "%s: IRQ Error status: 0x%08x\n",
01167 dev->name, status);
01168 }
01169
01170 if (status & GM_IRQ_MIF) {
01171 spin_lock(&gm->lock);
01172 mii_interrupt(gm);
01173 spin_unlock(&gm->lock);
01174 }
01175
01176 if (status & GM_IRQ_RX_DONE) {
01177 spin_lock(&gm->lock);
01178 gmac_receive(dev);
01179 spin_unlock(&gm->lock);
01180 }
01181
01182 if (status & (GM_IRQ_TX_INT_ME | GM_IRQ_TX_ALL)) {
01183 spin_lock(&gm->lock);
01184 gmac_tx_cleanup(dev, 0);
01185 spin_unlock(&gm->lock);
01186 }
01187
01188 dev->interrupt = 0;
01189 }
01190
01191 static struct net_device_stats *
01192 gmac_stats(struct device *dev)
01193 {
01194 struct gmac *gm = (struct gmac *) dev->priv;
01195 struct net_device_stats *stats = &gm->stats;
01196
01197 if (gm && gm->opened) {
01198 stats->rx_crc_errors += GM_IN(GM_MAC_RX_CRC_ERR_CTR);
01199 GM_OUT(GM_MAC_RX_CRC_ERR_CTR, 0);
01200
01201 stats->rx_frame_errors += GM_IN(GM_MAC_RX_ALIGN_ERR_CTR);
01202 GM_OUT(GM_MAC_RX_ALIGN_ERR_CTR, 0);
01203
01204 stats->rx_length_errors += GM_IN(GM_MAC_RX_LEN_ERR_CTR);
01205 GM_OUT(GM_MAC_RX_LEN_ERR_CTR, 0);
01206
01207 stats->tx_aborted_errors += GM_IN(GM_MAC_EXCS_COLLISION_CTR);
01208
01209 stats->collisions +=
01210 (GM_IN(GM_MAC_EXCS_COLLISION_CTR) +
01211 GM_IN(GM_MAC_LATE_COLLISION_CTR));
01212 GM_OUT(GM_MAC_EXCS_COLLISION_CTR, 0);
01213 GM_OUT(GM_MAC_LATE_COLLISION_CTR, 0);
01214 }
01215
01216 return stats;
01217 }
01218
01219 int
01220 gmac_probe(struct device *dev)
01221 {
01222 static int gmacs_found;
01223 static struct device_node *next_gmac;
01224 struct device_node *gmac;
01225 struct gmac *gm;
01226 unsigned long rx_descpage, tx_descpage;
01227 unsigned char *addr;
01228 int i;
01229
01230
01231
01232
01233