static int mace68k_xmit_start(struct sk_buff *skb, struct net_device *dev) { struct mace68k_data *mp = (struct mace68k_data *) dev->priv; /* * This may need atomic types ??? */ printk("mace68k_xmit_start: mp->tx_count = %d, dev->tbusy = %d, mp->tx_ring = %p (%p)\n", mp->tx_count, dev->tbusy, mp->tx_ring, virt_to_bus(mp->tx_ring)); psc_debug_dump(); if(mp->tx_count == 0) { dev->tbusy=1; mace68k_dma_intr(IRQ_MAC_MACE_DMA, dev, NULL); return 1; } mp->tx_count--; /* * FIXME: * This is hackish. The memcpy probably isnt needed but * the rules for alignment are not known. Ideally we'd like * to just blast the skb directly to ethernet. We also don't * use the ring properly - just a one frame buffer. That * also requires cache pushes ;). */ memcpy((void *)mp->tx_ring, skb, skb->len); psc_write_long(PSC_ENETWR_ADDR + mp->tx_slot, virt_to_bus(mp->tx_ring)); psc_write_long(PSC_ENETWR_LEN + mp->tx_slot, skb->len); psc_write_word(PSC_ENETWR_CMD + mp->tx_slot, 0x9800); mp->stats.tx_packets++; mp->stats.tx_bytes+=skb->len; dev_kfree_skb(skb); return 0; }
void __init psc_init(void) { int i; if (macintosh_config->ident != MAC_MODEL_C660 && macintosh_config->ident != MAC_MODEL_Q840) { psc = NULL; psc_present = 0; return; } /* * The PSC is always at the same spot, but using psc * keeps things consistent with the psc_xxxx functions. */ psc = (void *) PSC_BASE; psc_present = 1; printk("PSC detected at %p\n", psc); psc_dma_die_die_die(); #ifdef DEBUG_PSC psc_debug_dump(); #endif /* * Mask and clear all possible interrupts */ for (i = 0x30 ; i < 0x70 ; i += 0x10) { psc_write_byte(pIERbase + i, 0x0F); psc_write_byte(pIFRbase + i, 0x0F); } }