static void reset_mac_unlocked(struct net_device *dev) { struct au1000_private *const aup = netdev_priv(dev); int i; hard_stop(dev); *aup->enable = MAC_EN_CLOCK_ENABLE; au_sync_delay(2); *aup->enable = 0; au_sync_delay(2); aup->tx_full = 0; for (i = 0; i < NUM_RX_DMA; i++) { /* reset control bits */ aup->rx_dma_ring[i]->buff_stat &= ~0xf; } for (i = 0; i < NUM_TX_DMA; i++) { /* reset control bits */ aup->tx_dma_ring[i]->buff_stat &= ~0xf; } aup->mac_enabled = 0; }
//Main Function int main() { init_devices(); while(1) { forward(); //both wheels forward _delay_ms(1000); hard_stop(); _delay_ms(300); back(); //both wheels backward _delay_ms(1000); hard_stop(); _delay_ms(300); left(); //Left wheel backward, Right wheel forward _delay_ms(1000); hard_stop(); _delay_ms(300); right(); //Left wheel forward, Right wheel backward _delay_ms(1000); hard_stop(); _delay_ms(300); soft_left(); //Left wheel stationary, Right wheel forward _delay_ms(1000); hard_stop(); _delay_ms(300); soft_right(); //Left wheel forward, Right wheel is stationary _delay_ms(1000); hard_stop(); _delay_ms(300); soft_left_2(); //Left wheel backward, right wheel stationary _delay_ms(1000); hard_stop(); _delay_ms(300); soft_right_2(); //Left wheel stationary, Right wheel backward _delay_ms(1000); hard_stop(); _delay_ms(300); } }
static void au1000_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; struct au1000_private *aup = (struct au1000_private *) dev->priv; unsigned char if_port; u16 link, speed; if (!dev) { /* fatal error, don't restart the timer */ printk(KERN_ERR "au1000_timer error: NULL dev\n"); return; } if_port = dev->if_port; #ifdef CLEANUP if (aup->phy_ops->phy_status(dev, aup->phy_addr, &link, &speed) == 0) { if (link) { if (!(dev->flags & IFF_RUNNING)) { netif_carrier_on(dev); dev->flags |= IFF_RUNNING; printk(KERN_INFO "%s: link up\n", dev->name); } } else { if (dev->flags & IFF_RUNNING) { netif_carrier_off(dev); dev->flags &= ~IFF_RUNNING; dev->if_port = 0; printk(KERN_INFO "%s: link down\n", dev->name); } } } #endif if (link && (dev->if_port != if_port) && (dev->if_port != IF_PORT_UNKNOWN)) { hard_stop(dev); if (dev->if_port == IF_PORT_100BASEFX) { printk(KERN_INFO "%s: going to full duplex\n", dev->name); aup->mac->control |= MAC_FULL_DUPLEX; au_sync_delay(1); } else { aup->mac->control &= ~MAC_FULL_DUPLEX; au_sync_delay(1); } enable_rx_tx(dev); } aup->timer.expires = RUN_AT((1*HZ)); aup->timer.data = (unsigned long)dev; aup->timer.function = &au1000_timer; /* timer handler */ add_timer(&aup->timer); }
static void reset_mac(struct net_device *dev) { u32 flags; struct au1000_private *aup = (struct au1000_private *) dev->priv; if (au1000_debug > 4) printk(KERN_INFO "%s: reset mac, aup %x\n", dev->name, (unsigned)aup); spin_lock_irqsave(&aup->lock, flags); del_timer(&aup->timer); hard_stop(dev); *aup->enable = MAC_EN_CLOCK_ENABLE; au_sync_delay(2); *aup->enable = 0; au_sync_delay(2); aup->tx_full = 0; spin_unlock_irqrestore(&aup->lock, flags); }
static void reset_mac(struct net_device *dev) { int i; u32 flags; struct au1000_private *aup = (struct au1000_private *) dev->priv; if (au1000_debug > 4) printk(KERN_INFO "%s: reset mac, aup %x\n", dev->name, (unsigned)aup); spin_lock_irqsave(&aup->lock, flags); del_timer(&aup->timer); hard_stop(dev); #ifdef CONFIG_BCM5222_DUAL_PHY if (aup->mac_id != 0) { #endif /* If BCM5222, we can't leave MAC0 in reset because then * we can't access the dual phy for ETH1 */ *aup->enable = MAC_EN_CLOCK_ENABLE; au_sync_delay(2); *aup->enable = 0; au_sync_delay(2); #ifdef CONFIG_BCM5222_DUAL_PHY } #endif aup->tx_full = 0; for (i = 0; i < NUM_RX_DMA; i++) { /* reset control bits */ aup->rx_dma_ring[i]->buff_stat &= ~0xf; } for (i = 0; i < NUM_TX_DMA; i++) { /* reset control bits */ aup->tx_dma_ring[i]->buff_stat &= ~0xf; } spin_unlock_irqrestore(&aup->lock, flags); }
static void au1000_adjust_link(struct net_device *dev) { struct au1000_private *aup = netdev_priv(dev); struct phy_device *phydev = aup->phy_dev; unsigned long flags; int status_change = 0; BUG_ON(!aup->phy_dev); spin_lock_irqsave(&aup->lock, flags); if (phydev->link && (aup->old_speed != phydev->speed)) { // speed changed switch(phydev->speed) { case SPEED_10: case SPEED_100: break; default: printk(KERN_WARNING "%s: Speed (%d) is not 10/100 ???\n", dev->name, phydev->speed); break; } aup->old_speed = phydev->speed; status_change = 1; } if (phydev->link && (aup->old_duplex != phydev->duplex)) { // duplex mode changed /* switching duplex mode requires to disable rx and tx! */ hard_stop(dev); if (DUPLEX_FULL == phydev->duplex) aup->mac->control = ((aup->mac->control | MAC_FULL_DUPLEX) & ~MAC_DISABLE_RX_OWN); else aup->mac->control = ((aup->mac->control & ~MAC_FULL_DUPLEX) | MAC_DISABLE_RX_OWN); au_sync_delay(1); enable_rx_tx(dev); aup->old_duplex = phydev->duplex; status_change = 1; } if(phydev->link != aup->old_link) { // link state changed if (!phydev->link) { /* link went down */ aup->old_speed = 0; aup->old_duplex = -1; } aup->old_link = phydev->link; status_change = 1; } spin_unlock_irqrestore(&aup->lock, flags); if (status_change) { if (phydev->link) printk(KERN_INFO "%s: link up (%d/%s)\n", dev->name, phydev->speed, DUPLEX_FULL == phydev->duplex ? "Full" : "Half"); else printk(KERN_INFO "%s: link down\n", dev->name); } }