static void dwc_ether_halt (struct eth_device *dev) { struct dw_eth_dev *priv = dev->priv; mac_reset(dev); priv->tx_currdescnum = priv->rx_currdescnum = 0; }
static int dw_eth_init(struct eth_device *dev, bd_t *bis) { struct dw_eth_dev *priv = dev->priv; struct eth_mac_regs *mac_p = priv->mac_regs_p; struct eth_dma_regs *dma_p = priv->dma_regs_p; u32 conf; if (priv->phy_configured != 1) configure_phy(dev); /* Print link status only once */ if (!priv->link_printed) { printf("ENET Speed is %d Mbps - %s duplex connection\n", priv->speed, (priv->duplex == HALF) ? "HALF" : "FULL"); priv->link_printed = 1; } /* Reset ethernet hardware */ if (mac_reset(dev) < 0) return -1; /* Resore the HW MAC address as it has been lost during MAC reset */ dw_write_hwaddr(dev); writel(FIXEDBURST | PRIORXTX_41 | BURST_16, &dma_p->busmode); writel(readl(&dma_p->opmode) | FLUSHTXFIFO | STOREFORWARD | TXSECONDFRAME, &dma_p->opmode); conf = FRAMEBURSTENABLE | DISABLERXOWN; if (priv->speed != 1000) conf |= MII_PORTSELECT; if ((priv->interface != PHY_INTERFACE_MODE_MII) && (priv->interface != PHY_INTERFACE_MODE_GMII)) { if (priv->speed == 100) conf |= FES_100; } if (priv->duplex == FULL) conf |= FULLDPLXMODE; writel(conf, &mac_p->conf); descs_init(dev); /* * Start/Enable xfer at dma as well as mac level */ writel(readl(&dma_p->opmode) | RXSTART, &dma_p->opmode); writel(readl(&dma_p->opmode) | TXSTART, &dma_p->opmode); writel(readl(&mac_p->conf) | RXENABLE | TXENABLE, &mac_p->conf); return 0; }
static int dw_eth_init(struct eth_device *dev, bd_t *bis) { struct dw_eth_dev *priv = dev->priv; struct eth_mac_regs *mac_p = priv->mac_regs_p; struct eth_dma_regs *dma_p = priv->dma_regs_p; u32 conf; if (priv->phy_configured != 1) configure_phy(dev); /* Reset ethernet hardware */ if (mac_reset(dev) < 0) return -1; /* Resore the HW MAC address as it has been lost during MAC reset */ dw_write_hwaddr(dev); writel(FIXEDBURST | PRIORXTX_41 | BURST_16, &dma_p->busmode); writel(FLUSHTXFIFO | readl(&dma_p->opmode), &dma_p->opmode); writel(STOREFORWARD | TXSECONDFRAME, &dma_p->opmode); conf = FRAMEBURSTENABLE | DISABLERXOWN; if (priv->speed != SPEED_1000M) conf |= MII_PORTSELECT; if (priv->duplex == FULL_DUPLEX) conf |= FULLDPLXMODE; writel(conf, &mac_p->conf); descs_init(dev); /* * Start/Enable xfer at dma as well as mac level */ writel(readl(&dma_p->opmode) | RXSTART, &dma_p->opmode); writel(readl(&dma_p->opmode) | TXSTART, &dma_p->opmode); writel(readl(&mac_p->conf) | RXENABLE | TXENABLE, &mac_p->conf); return 0; }
static int dwc_ether_init(struct eth_device *dev) { struct dw_eth_dev *priv = dev->priv; struct eth_mac_regs *mac_p = priv->mac_regs_p; struct eth_dma_regs *dma_p = priv->dma_regs_p; if (mac_reset(dev) < 0) return -1; /* HW MAC address is lost during MAC reset */ dev->set_ethaddr(dev, priv->macaddr); writel(FIXEDBURST | PRIORXTX_41 | BURST_16, &dma_p->busmode); writel(FLUSHTXFIFO | readl(&dma_p->opmode), &dma_p->opmode); writel(STOREFORWARD | TXSECONDFRAME, &dma_p->opmode); writel(FRAMEBURSTENABLE | DISABLERXOWN, &mac_p->conf); return 0; }
/** * @brief Resets the MAC layer * * The MLME-RESET.request primitive allows the next higher layer to request * that the MLME performs a reset operation. * * @param m Pointer to the MLME_RESET.request given by the NHLE */ void mlme_reset_request(uint8_t *m) { mlme_reset_req_t *mrr = (mlme_reset_req_t *)BMM_BUFFER_POINTER((buffer_t *)m); /* Wakeup the radio */ mac_trx_wakeup(); /* Start MAC reset functionality */ uint8_t status = mac_reset(mrr->SetDefaultPIB); /* Set radio to sleep if allowed */ mac_sleep_trans(); /* * As this is a mlme_reset request, all the requests, data (whether * direct * or indirect), incoming frames are removed from the queues */ flush_queues(); send_reset_conf((buffer_t *)m, status); } /* mlme_reset_request() */
void mac_bang(int irq, void *vector, struct pt_regs *p) { printk(KERN_INFO "Resetting ...\n"); mac_reset(); }
int main (int argc, char *argv[]) { int r; char **optarg; int run, nomon; unsigned drive; char *cfg; ini_sct_t *sct; cfg = NULL; run = 0; nomon = 0; pce_log_init(); pce_log_add_fp (stderr, 0, MSG_INF); par_cfg = ini_sct_new (NULL); if (par_cfg == NULL) { return (1); } ini_str_init (&par_ini_str); while (1) { r = pce_getopt (argc, argv, &optarg, opts); if (r == GETOPT_DONE) { break; } if (r < 0) { return (1); } switch (r) { case '?': print_help(); return (0); case 'V': print_version(); return (0); case 'b': par_disk_delay_valid |= 1; par_disk_delay[0] = (unsigned) strtoul (optarg[0], NULL, 0); break; case 'B': drive = strtoul (optarg[0], NULL, 0); if ((drive < 1) || (drive >= SONY_DRIVES)) { fprintf (stderr, "%s: bad drive number (%u)\n", argv[0], drive ); return (1); } drive -= 1; par_disk_delay_valid |= 1U << drive; par_disk_delay[drive] = (unsigned) strtoul (optarg[1], NULL, 0); break; case 'c': cfg = optarg[0]; break; case 'd': pce_path_set (optarg[0]); break; case 'i': if (ini_read_str (par_cfg, optarg[0])) { fprintf (stderr, "%s: error parsing ini string (%s)\n", argv[0], optarg[0] ); return (1); } break; case 'I': ini_str_add (&par_ini_str, optarg[0], "\n", NULL); break; case 'l': pce_log_add_fname (optarg[0], MSG_DEB); break; case 'p': ini_str_add (&par_ini_str, "cpu.model = \"", optarg[0], "\"\n" ); break; case 'q': pce_log_set_level (stderr, MSG_ERR); break; case 'r': run = 1; break; case 'R': nomon = 1; break; case 's': ini_str_add (&par_ini_str, "cpu.speed = ", optarg[0], "\n" ); break; case 't': par_terminal = optarg[0]; break; case 'v': pce_log_set_level (stderr, MSG_DEB); break; case 0: fprintf (stderr, "%s: unknown option (%s)\n", argv[0], optarg[0] ); return (1); default: return (1); } } mac_log_banner(); if (pce_load_config (par_cfg, cfg)) { return (1); } sct = ini_next_sct (par_cfg, NULL, "macplus"); if (sct == NULL) { sct = par_cfg; } if (ini_str_eval (&par_ini_str, sct, 1)) { return (1); } atexit (mac_atexit); #ifdef PCE_ENABLE_SDL SDL_Init (0); #endif pce_path_ini (sct); signal (SIGINT, &sig_int); signal (SIGSEGV, &sig_segv); signal (SIGTERM, &sig_term); pce_console_init (stdin, stdout); par_sim = mac_new (sct); mon_init (&par_mon); mon_set_cmd_fct (&par_mon, mac_cmd, par_sim); mon_set_msg_fct (&par_mon, mac_set_msg, par_sim); mon_set_get_mem_fct (&par_mon, par_sim->mem, mem_get_uint8); mon_set_set_mem_fct (&par_mon, par_sim->mem, mem_set_uint8); mon_set_memory_mode (&par_mon, 0); cmd_init (par_sim, cmd_get_sym, cmd_set_sym); mac_cmd_init (par_sim, &par_mon); mac_reset (par_sim); if (nomon) { while (par_sim->brk != PCE_BRK_ABORT) { mac_run (par_sim); } } else if (run) { mac_run (par_sim); if (par_sim->brk != PCE_BRK_ABORT) { pce_puts ("\n"); } } else { pce_puts ("type 'h' for help\n"); } if (par_sim->brk != PCE_BRK_ABORT) { mon_run (&par_mon); } mac_del (par_sim); #ifdef PCE_ENABLE_SDL SDL_Quit(); #endif mon_free (&par_mon); pce_console_done(); pce_log_done(); return (0); }