📄 skge.c
字号:
void dump_frag( SK_U8 *data, int length);/* global variables *********************************************************/#if 0static const char *BootString = BOOT_STRING;#endifstruct SK_NET_DEVICE *SkGeRootDev = NULL;static int probed __initdata = 0;/* local variables **********************************************************/static uintptr_t TxQueueAddr[SK_MAX_MACS][2] = {{0x680, 0x600},{0x780, 0x700}};static uintptr_t RxQueueAddr[SK_MAX_MACS] = {0x400, 0x480};/* local variables **********************************************************/const char SK_Root_Dir_entry[8];#if 0static struct proc_dir_entry *pSkRootDir;#endifstatic struct pci_device_id supported[] = { {PCI_VENDOR_ID_3COM, 0x1700}, {PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_GE}, {PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_YU}, {}};/***************************************************************************** * * skge_probe - find all SK-98xx adapters * * Description: * This function scans the PCI bus for SK-98xx adapters. Resources for * each adapter are allocated and the adapter is brought into Init 1 * state. * * Returns: * 0, if everything is ok * !=0, on error */#if 0static int __init skge_probe (void)#elseint skge_probe (struct eth_device ** ret_dev)#endif{#if 0 int proc_root_initialized = 0;#endif int boards_found = 0;#if 0 int vendor_flag = SK_FALSE;#endif SK_AC *pAC; DEV_NET *pNet = NULL;#if 0 struct proc_dir_entry *pProcFile; struct pci_dev *pdev = NULL; unsigned long base_address;#else u32 base_address;#endif struct SK_NET_DEVICE *dev = NULL;#if 0 SK_BOOL DeviceFound = SK_FALSE;#endif SK_BOOL BootStringCount = SK_FALSE;#if 1 pci_dev_t devno;#endif if (probed) return -ENODEV; probed++; if (!pci_present()) /* is PCI support present? */ return -ENODEV;#if 0 while((pdev = pci_find_class(PCI_CLASS_NETWORK_ETHERNET << 8, pdev)))#else while((devno = pci_find_devices (supported, boards_found)) >= 0)#endif { dev = NULL; pNet = NULL;#if 0 SK_PCI_ISCOMPLIANT(vendor_flag, pdev); if (!vendor_flag) continue;#endif/* if ((pdev->vendor != PCI_VENDOR_ID_SYSKONNECT) && ((pdev->device != PCI_DEVICE_ID_SYSKONNECT_GE) || (pdev->device != PCI_DEVICE_ID_SYSKONNECT_YU))){ continue; }*/#if 0 /* Configure DMA attributes. */ if (pci_set_dma_mask(pdev, (u64) 0xffffffffffffffff) && pci_set_dma_mask(pdev, (u64) 0xffffffff)) continue;#endif#if 0 if ((dev = init_etherdev(dev, sizeof(DEV_NET))) == NULL) { printk(KERN_ERR "Unable to allocate etherdev " "structure!\n"); break; }#else dev = malloc (sizeof *dev); memset(dev, 0, sizeof(*dev)); dev->priv = malloc(sizeof(DEV_NET));#endif if (dev->priv == NULL) { printk(KERN_ERR "Unable to allocate adapter " "structure!\n"); break; } pNet = dev->priv; pNet->pAC = kmalloc(sizeof(SK_AC), GFP_KERNEL); if (pNet->pAC == NULL){ kfree(dev->priv); printk(KERN_ERR "Unable to allocate adapter " "structure!\n"); break; } /* Print message */ if (!BootStringCount) { /* set display flag to TRUE so that */ /* we only display this string ONCE */ BootStringCount = SK_TRUE;#ifdef SK98_INFO printk("%s\n", BootString);#endif } memset(pNet->pAC, 0, sizeof(SK_AC)); pAC = pNet->pAC;#if 0 pAC->PciDev = pdev; pAC->PciDevId = pdev->device; pAC->dev[0] = dev; pAC->dev[1] = dev;#else pAC->PciDev = devno; ret_dev[0] = pAC->dev[0] = dev; ret_dev[1] = pAC->dev[1] = dev;#endif sprintf(pAC->Name, "SysKonnect SK-98xx"); pAC->CheckQueue = SK_FALSE; pNet->Mtu = 1500; pNet->Up = 0;#if 0 dev->irq = pdev->irq; dev->open = &SkGeOpen; dev->stop = &SkGeClose; dev->hard_start_xmit = &SkGeXmit; dev->get_stats = &SkGeStats; dev->set_multicast_list = &SkGeSetRxMode; dev->set_mac_address = &SkGeSetMacAddr; dev->do_ioctl = &SkGeIoctl; dev->change_mtu = &SkGeChangeMtu; dev->flags &= ~IFF_RUNNING;#endif#ifdef SK_ZEROCOPY if (pAC->GIni.GIChipId == CHIP_ID_YUKON) { /* Use only if yukon hardware */ /* SK and ZEROCOPY - fly baby... */ dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; }#endif#if 0 /* * Dummy value. */ dev->base_addr = 42; pci_set_master(pdev); pci_set_master(pdev); base_address = pci_resource_start (pdev, 0);#else pci_write_config_dword(devno, PCI_COMMAND, PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); pci_read_config_dword (devno, PCI_BASE_ADDRESS_0, &base_address);#endif#ifdef SK_BIG_ENDIAN /* * On big endian machines, we use the adapter's aibility of * reading the descriptors as big endian. */ { SK_U32 our2; SkPciReadCfgDWord(pAC, PCI_OUR_REG_2, &our2); our2 |= PCI_REV_DESC; SkPciWriteCfgDWord(pAC, PCI_OUR_REG_2, our2); }#endif /* * Remap the regs into kernel space. */#if 0 pAC->IoBase = (char*)ioremap(base_address, 0x4000);#else pAC->IoBase = (char*)pci_mem_to_phys(devno, base_address);#endif if (!pAC->IoBase){ printk(KERN_ERR "%s: Unable to map I/O register, " "SK 98xx No. %i will be disabled.\n", dev->name, boards_found); kfree(dev); break; } pAC->Index = boards_found; if (SkGeBoardInit(dev, pAC)) { FreeResources(dev); kfree(dev); continue; }#if 0 memcpy((caddr_t) &dev->dev_addr, (caddr_t) &pAC->Addr.Net[0].CurrentMacAddress, 6);#else memcpy((caddr_t) &dev->enetaddr, (caddr_t) &pAC->Addr.Net[0].CurrentMacAddress, 6);#endif#if 0 /* First adapter... Create proc and print message */ if (!DeviceFound) { DeviceFound = SK_TRUE; SK_MEMCPY(&SK_Root_Dir_entry, BootString, sizeof(SK_Root_Dir_entry) - 1); /*Create proc (directory)*/ if(!proc_root_initialized) { pSkRootDir = create_proc_entry(SK_Root_Dir_entry, S_IFDIR | S_IWUSR | S_IRUGO | S_IXUGO, proc_net); proc_root_initialized = 1; } pSkRootDir->owner = THIS_MODULE; } /* Create proc file */ pProcFile = create_proc_entry(dev->name, S_IFREG | S_IXUSR | S_IWGRP | S_IROTH, pSkRootDir); pProcFile->read_proc = proc_read; pProcFile->write_proc = NULL; pProcFile->nlink = 1; pProcFile->size = sizeof(dev->name + 1); pProcFile->data = (void *)pProcFile;#endif pNet->PortNr = 0; pNet->NetNr = 0;#ifdef SK_ZEROCOPY if (pAC->GIni.GIChipId == CHIP_ID_YUKON) { /* SG and ZEROCOPY - fly baby... */ dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; }#endif boards_found++; /* More then one port found */ if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) {#if 0 if ((dev = init_etherdev(NULL, sizeof(DEV_NET))) == 0) { printk(KERN_ERR "Unable to allocate etherdev " "structure!\n"); break; }#else dev = malloc (sizeof *dev); memset(dev, 0, sizeof(*dev)); dev->priv = malloc(sizeof(DEV_NET));#endif pAC->dev[1] = dev; pNet = dev->priv; pNet->PortNr = 1; pNet->NetNr = 1; pNet->pAC = pAC; pNet->Mtu = 1500; pNet->Up = 0;#if 0 dev->open = &SkGeOpen; dev->stop = &SkGeClose; dev->hard_start_xmit = &SkGeXmit; dev->get_stats = &SkGeStats; dev->set_multicast_list = &SkGeSetRxMode; dev->set_mac_address = &SkGeSetMacAddr; dev->do_ioctl = &SkGeIoctl; dev->change_mtu = &SkGeChangeMtu; dev->flags &= ~IFF_RUNNING;#endif#ifdef SK_ZEROCOPY if (pAC->GIni.GIChipId == CHIP_ID_YUKON) { /* SG and ZEROCOPY - fly baby... */ dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; }#endif#if 0 pProcFile = create_proc_entry(dev->name, S_IFREG | S_IXUSR | S_IWGRP | S_IROTH, pSkRootDir); pProcFile->read_proc = proc_read; pProcFile->write_proc = NULL; pProcFile->nlink = 1; pProcFile->size = sizeof(dev->name + 1); pProcFile->data = (void *)pProcFile;#endif#if 0 memcpy((caddr_t) &dev->dev_addr, (caddr_t) &pAC->Addr.Net[1].CurrentMacAddress, 6);#else memcpy((caddr_t) &dev->enetaddr, (caddr_t) &pAC->Addr.Net[1].CurrentMacAddress, 6);#endif printk("%s: %s\n", dev->name, pAC->DeviceStr); printk(" PrefPort:B RlmtMode:Dual Check Link State\n"); } /* Save the hardware revision */ pAC->HWRevision = (((pAC->GIni.GIPciHwRev >> 4) & 0x0F)*10) + (pAC->GIni.GIPciHwRev & 0x0F); /* * This is bollocks, but we need to tell the net-init * code that it shall go for the next device. */#if 0#ifndef MODULE dev->base_addr = 0;#endif#endif } /* * If we're at this point we're going through skge_probe() for * the first time. Return success (0) if we've initialized 1 * or more boards. Otherwise, return failure (-ENODEV). */ return boards_found;} /* skge_probe *//***************************************************************************** * * FreeResources - release resources allocated for adapter * * Description: * This function releases the IRQ, unmaps the IO and * frees the desriptor ring. * * Returns: N/A * */static void FreeResources(struct SK_NET_DEVICE *dev){SK_U32 AllocFlag;DEV_NET *pNet;SK_AC *pAC; if (dev->priv) { pNet = (DEV_NET*) dev->priv; pAC = pNet->pAC; AllocFlag = pAC->AllocFlag;#if 0 if (AllocFlag & SK_ALLOC_IRQ) { free_irq(dev->irq, dev); } if (pAC->IoBase) { iounmap(pAC->IoBase); }#endif if (pAC->pDescrMem) { BoardFreeMem(pAC); } }} /* FreeResources */#if 0MODULE_AUTHOR("Mirko Lindner <mlindner@syskonnect.de>");MODULE_DESCRIPTION("SysKonnect SK-NET Gigabit Ethernet SK-98xx driver");MODULE_LICENSE("GPL");MODULE_PARM(Speed_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");MODULE_PARM(Speed_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");MODULE_PARM(AutoNeg_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");MODULE_PARM(AutoNeg_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");MODULE_PARM(DupCap_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");MODULE_PARM(DupCap_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");MODULE_PARM(FlowCtrl_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");MODULE_PARM(FlowCtrl_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");MODULE_PARM(Role_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");MODULE_PARM(Role_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");MODULE_PARM(PrefPort, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");MODULE_PARM(RlmtMode, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");/* not used, just there because every driver should have them: */MODULE_PARM(options, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "i");MODULE_PARM(debug, "i");#endif#ifdef LINK_SPEED_Astatic char *Speed_A[SK_MAX_CARD_PARAM] = LINK_SPEED_A;#elsestatic char *Speed_A[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef LINK_SPEED_Bstatic char *Speed_B[SK_MAX_CARD_PARAM] = LINK_SPEED_B;#elsestatic char *Speed_B[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef AUTO_NEG_Astatic char *AutoNeg_A[SK_MAX_CARD_PARAM] = AUTO_NEG_A;#elsestatic char *AutoNeg_A[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef DUP_CAP_Astatic char *DupCap_A[SK_MAX_CARD_PARAM] = DUP_CAP_A;#elsestatic char *DupCap_A[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef FLOW_CTRL_Astatic char *FlowCtrl_A[SK_MAX_CARD_PARAM] = FLOW_CTRL_A;#elsestatic char *FlowCtrl_A[SK_MAX_CARD_PARAM] = {"", };#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -