⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macsonic.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		}	}	printk("yes\n");		if (dev) {		dev = init_etherdev(dev, sizeof(struct sonic_local));		/* methinks this will always be true but better safe than sorry */		if (dev->priv == NULL)			dev->priv = kmalloc(sizeof(struct sonic_local), GFP_KERNEL);	} else {		dev = init_etherdev(NULL, sizeof(struct sonic_local));	}	if (dev == NULL)		return -ENOMEM;	lp = (struct sonic_local*) dev->priv;	memset(lp, 0, sizeof(struct sonic_local));	/* Danger!  My arms are flailing wildly!  You *must* set this           before using sonic_read() */	dev->base_addr = ONBOARD_SONIC_REGISTERS;	if (via_alt_mapping)		dev->irq = IRQ_AUTO_3;	else		dev->irq = IRQ_NUBUS_9;	if (!sonic_version_printed) {		printk(KERN_INFO "%s", version);		sonic_version_printed = 1;	}	printk(KERN_INFO "%s: onboard / comm-slot SONIC at 0x%08lx\n",	       dev->name, dev->base_addr);	/* Now do a song and dance routine in an attempt to determine           the bus width */	/* The PowerBook's SONIC is 16 bit always. */	if (macintosh_config->ident == MAC_MODEL_PB520) {		lp->reg_offset = 0;		lp->dma_bitmode = 0;	} else {		/* Some of the comm-slot cards are 16 bit.  But some                   of them are not.  The 32-bit cards use offset 2 and                   pad with zeroes or sometimes ones (I think...)                   Therefore, if we try offset 0 and get a silicon                   revision of 0, we assume 16 bit. */		int sr;		/* Technically this is not necessary since we zeroed                   it above */		lp->reg_offset = 0;		lp->dma_bitmode = 0;		sr = sonic_read(dev, SONIC_SR);		if (sr == 0 || sr == 0xffff) {			lp->reg_offset = 2;			/* 83932 is 0x0004, 83934 is 0x0100 or 0x0101 */			sr = sonic_read(dev, SONIC_SR);			lp->dma_bitmode = 1;					}		printk(KERN_INFO		       "%s: revision 0x%04x, using %d bit DMA and register offset %d\n",		       dev->name, sr, lp->dma_bitmode?32:16, lp->reg_offset);	}	/* Software reset, then initialize control registers. */	sonic_write(dev, SONIC_CMD, SONIC_CR_RST);	sonic_write(dev, SONIC_DCR, SONIC_DCR_BMS |		    SONIC_DCR_RFT1 | SONIC_DCR_TFT0 | SONIC_DCR_EXBUS |		    (lp->dma_bitmode ? SONIC_DCR_DW : 0));	/* This *must* be written back to in order to restore the           extended programmable output bits */	sonic_write(dev, SONIC_DCR2, 0);	/* Clear *and* disable interrupts to be on the safe side */	sonic_write(dev, SONIC_ISR,0x7fff);	sonic_write(dev, SONIC_IMR,0);	/* Now look for the MAC address. */	if (mac_onboard_sonic_ethernet_addr(dev) != 0)		return -ENODEV;	printk(KERN_INFO "MAC ");	for (i = 0; i < 6; i++) {		printk("%2.2x", dev->dev_addr[i]);		if (i < 5)			printk(":");	}	printk(" IRQ %d\n", dev->irq);	/* Shared init code */	return macsonic_init(dev);}int __init mac_nubus_sonic_ethernet_addr(struct net_device* dev,					 unsigned long prom_addr,					 int id){	int i;	for(i = 0; i < 6; i++)		dev->dev_addr[i] = SONIC_READ_PROM(i);	/* For now we are going to assume that they're all bit-reversed */	bit_reverse_addr(dev->dev_addr);	return 0;}int __init macsonic_ident(struct nubus_dev* ndev){	if (ndev->dr_hw == NUBUS_DRHW_ASANTE_LC && 	    ndev->dr_sw == NUBUS_DRSW_SONIC_LC)		return MACSONIC_DAYNALINK;	if (ndev->dr_hw == NUBUS_DRHW_SONIC &&	    ndev->dr_sw == NUBUS_DRSW_APPLE) {		/* There has to be a better way to do this... */		if (strstr(ndev->board->name, "DuoDock"))			return MACSONIC_DUODOCK;		else			return MACSONIC_APPLE;	}	return -1;}int __init mac_nubus_sonic_probe(struct net_device* dev){	static int slots = 0;	struct nubus_dev* ndev = NULL;	struct sonic_local* lp;	unsigned long base_addr, prom_addr;	u16 sonic_dcr;	int id;	int i;	int reg_offset, dma_bitmode;	/* Find the first SONIC that hasn't been initialized already */	while ((ndev = nubus_find_type(NUBUS_CAT_NETWORK,				       NUBUS_TYPE_ETHERNET, ndev)) != NULL)	{		/* Have we seen it already? */		if (slots & (1<<ndev->board->slot))			continue;		slots |= 1<<ndev->board->slot;		/* Is it one of ours? */		if ((id = macsonic_ident(ndev)) != -1)			break;	}	if (ndev == NULL)		return -ENODEV;	switch (id) {	case MACSONIC_DUODOCK:		base_addr = ndev->board->slot_addr + DUODOCK_SONIC_REGISTERS;		prom_addr = ndev->board->slot_addr + DUODOCK_SONIC_PROM_BASE;		sonic_dcr = SONIC_DCR_EXBUS | SONIC_DCR_RFT0 | SONIC_DCR_RFT1			| SONIC_DCR_TFT0;		reg_offset = 2;		dma_bitmode = 1;		break;	case MACSONIC_APPLE:		base_addr = ndev->board->slot_addr + APPLE_SONIC_REGISTERS;		prom_addr = ndev->board->slot_addr + APPLE_SONIC_PROM_BASE;		sonic_dcr = SONIC_DCR_BMS | SONIC_DCR_RFT1 | SONIC_DCR_TFT0;		reg_offset = 0;		dma_bitmode = 1;		break;	case MACSONIC_APPLE16:		base_addr = ndev->board->slot_addr + APPLE_SONIC_REGISTERS;		prom_addr = ndev->board->slot_addr + APPLE_SONIC_PROM_BASE;		sonic_dcr = SONIC_DCR_EXBUS 			| SONIC_DCR_RFT1 | SONIC_DCR_TFT0			| SONIC_DCR_PO1 | SONIC_DCR_BMS; 		reg_offset = 0;		dma_bitmode = 0;		break;	case MACSONIC_DAYNALINK:		base_addr = ndev->board->slot_addr + APPLE_SONIC_REGISTERS;		prom_addr = ndev->board->slot_addr + DAYNALINK_PROM_BASE;		sonic_dcr = SONIC_DCR_RFT1 | SONIC_DCR_TFT0			| SONIC_DCR_PO1 | SONIC_DCR_BMS; 		reg_offset = 0;		dma_bitmode = 0;		break;	case MACSONIC_DAYNA:		base_addr = ndev->board->slot_addr + DAYNA_SONIC_REGISTERS;		prom_addr = ndev->board->slot_addr + DAYNA_SONIC_MAC_ADDR;		sonic_dcr = SONIC_DCR_BMS			| SONIC_DCR_RFT1 | SONIC_DCR_TFT0 | SONIC_DCR_PO1;		reg_offset = 0;		dma_bitmode = 0;		break;	default:		printk(KERN_ERR "macsonic: WTF, id is %d\n", id);		return -ENODEV;	}	if (dev) {		dev = init_etherdev(dev, sizeof(struct sonic_local));		/* methinks this will always be true but better safe than sorry */		if (dev->priv == NULL)			dev->priv = kmalloc(sizeof(struct sonic_local), GFP_KERNEL);	} else {		dev = init_etherdev(NULL, sizeof(struct sonic_local));	}	if (dev == NULL)		return -ENOMEM;	lp = (struct sonic_local*) dev->priv;	memset(lp, 0, sizeof(struct sonic_local));	/* Danger!  My arms are flailing wildly!  You *must* set this           before using sonic_read() */	lp->reg_offset = reg_offset;	lp->dma_bitmode = dma_bitmode;	dev->base_addr = base_addr;	dev->irq = SLOT2IRQ(ndev->board->slot);	if (!sonic_version_printed) {		printk(KERN_INFO "%s", version);		sonic_version_printed = 1;	}	printk(KERN_INFO "%s: %s in slot %X\n",	       dev->name, ndev->board->name, ndev->board->slot);	printk(KERN_INFO "%s: revision 0x%04x, using %d bit DMA and register offset %d\n",	       dev->name, sonic_read(dev, SONIC_SR), dma_bitmode?32:16, reg_offset);	/* Software reset, then initialize control registers. */	sonic_write(dev, SONIC_CMD, SONIC_CR_RST);	sonic_write(dev, SONIC_DCR, sonic_dcr		    | (dma_bitmode ? SONIC_DCR_DW : 0));	/* Clear *and* disable interrupts to be on the safe side */	sonic_write(dev, SONIC_ISR,0x7fff);	sonic_write(dev, SONIC_IMR,0);	/* Now look for the MAC address. */	if (mac_nubus_sonic_ethernet_addr(dev, prom_addr, id) != 0)		return -ENODEV;	printk(KERN_INFO "MAC ");	for (i = 0; i < 6; i++) {		printk("%2.2x", dev->dev_addr[i]);		if (i < 5)			printk(":");	}	printk(" IRQ %d\n", dev->irq);	/* Shared init code */	return macsonic_init(dev);}#ifdef MODULEstatic char namespace[16] = "";static struct net_device dev_macsonic = {        NULL,        0, 0, 0, 0,        0, 0,        0, 0, 0, NULL, NULL };MODULE_PARM(sonic_debug, "i");EXPORT_NO_SYMBOLS;intinit_module(void){        dev_macsonic.name = namespace;        dev_macsonic.init = macsonic_probe;        if (register_netdev(&dev_macsonic) != 0) {                printk(KERN_WARNING "macsonic.c: No card found\n");                return -ENXIO;        }	return 0;}voidcleanup_module(void){        if (dev_macsonic.priv != NULL) {                unregister_netdev(&dev_macsonic);                kfree(dev_macsonic.priv);                dev_macsonic.priv = NULL;        }}#endif /* MODULE */#define vdma_alloc(foo, bar) ((u32)foo)#define vdma_free(baz)#define sonic_chiptomem(bat) (bat)#define PHYSADDR(quux) (quux)#include "sonic.c"/* * Local variables: *  compile-command: "m68k-linux-gcc -D__KERNEL__ -I../../include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -fno-strength-reduce -ffixed-a2 -DMODULE -DMODVERSIONS -include ../../include/linux/modversions.h   -c -o macsonic.o macsonic.c" *  version-control: t *  kept-new-versions: 5 *  c-indent-level: 8 *  tab-width: 8 * End: * */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -