skge.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:115k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Name:    skge.c
  4.  * Project: GEnesis, PCI Gigabit Ethernet Adapter
  5.  * Version: $Revision: 1.29.2.6 $
  6.  * Date:        $Date: 2001/05/21 07:59:29 $
  7.  * Purpose: The main driver source module
  8.  *
  9.  ******************************************************************************/
  10.  
  11. /******************************************************************************
  12.  *
  13.  * (C)Copyright 1998-2001 SysKonnect GmbH.
  14.  *
  15.  * Driver for SysKonnect Gigabit Ethernet Server Adapters:
  16.  *
  17.  * SK-9861 (single link 1000Base-SX, VF45 Volition Plug)
  18.  * SK-9862 (dual link   1000Base-SX, VF45 Volition Plug)
  19.  * SK-9841 (single link 1000Base-LX)
  20.  * SK-9842 (dual link   1000Base-LX)
  21.  * SK-9843 (single link 1000Base-SX)
  22.  * SK-9844 (dual link   1000Base-SX)
  23.  * SK-9821 (single link 1000Base-T)
  24.  * SK-9822 (dual link   1000Base-T)
  25.  *
  26.  * Created 10-Feb-1999, based on Linux' acenic.c, 3c59x.c and 
  27.  * SysKonnects GEnesis Solaris driver
  28.  * Author: Christoph Goos (cgoos@syskonnect.de)
  29.  *         Mirko Lindner (mlindner@syskonnect.de)
  30.  *
  31.  * Address all question to: linux@syskonnect.de
  32.  *
  33.  * The technical manual for the adapters is available from SysKonnect's
  34.  * web pages: www.syskonnect.com
  35.  * Goto "Support" and search Knowledge Base for "manual".
  36.  *
  37.  * This program is free software; you can redistribute it and/or modify
  38.  * it under the terms of the GNU General Public License as published by
  39.  * the Free Software Foundation; either version 2 of the License, or
  40.  * (at your option) any later version.
  41.  *
  42.  * The information in this file is provided "AS IS" without warranty.
  43.  *
  44.  ******************************************************************************/
  45. /******************************************************************************
  46.  *
  47.  * History:
  48.  *
  49.  * $Log: skge.c,v $
  50.  * Revision 1.29.2.6  2001/05/21 07:59:29  mlindner
  51.  * fix: MTU init problems
  52.  *
  53.  * Revision 1.29.2.5  2001/05/08 11:25:08  mlindner
  54.  * fix: removed VLAN error message
  55.  *
  56.  * Revision 1.29.2.4  2001/05/04 13:31:43  gklug
  57.  * fix: do not handle eth_copy on bad fragments received.
  58.  *
  59.  * Revision 1.29.2.3  2001/04/23 08:06:43  mlindner
  60.  * Fix: error handling
  61.  *
  62.  * Revision 1.29.2.2  2001/03/15 12:04:54  mlindner
  63.  * Fixed memory problem
  64.  *
  65.  * Revision 1.29.2.1  2001/03/12 16:41:44  mlindner
  66.  * add: procfs function
  67.  * add: dual-net function
  68.  * add: RLMT networks
  69.  * add: extended PNMI features
  70.  *
  71.  * Kernel 2.4.x specific:
  72.  * Revision 1.xx  2000/09/12 13:31:56  cgoos
  73.  * Fixed missign "dev=NULL in skge_probe.
  74.  * Added counting for jumbo frames (corrects error statistic).
  75.  * Removed VLAN tag check (enables VLAN support).
  76.  *
  77.  * Kernel 2.2.x specific:
  78.  * Revision 1.29  2000/02/21 13:31:56  cgoos
  79.  * Fixed "unused" warning for UltraSPARC change.
  80.  *
  81.  * Partially kernel 2.2.x specific:
  82.  * Revision 1.28  2000/02/21 10:32:36  cgoos
  83.  * Added fixes for UltraSPARC.
  84.  * Now printing RlmtMode and PrefPort setting at startup.
  85.  * Changed XmitFrame return value.
  86.  * Fixed rx checksum calculation for BIG ENDIAN systems.
  87.  * Fixed rx jumbo frames counted as ierrors.
  88.  *
  89.  *
  90.  * Revision 1.27  1999/11/25 09:06:28  cgoos
  91.  * Changed base_addr to unsigned long.
  92.  *
  93.  * Revision 1.26  1999/11/22 13:29:16  cgoos
  94.  * Changed license header to GPL.
  95.  * Changes for inclusion in linux kernel (2.2.13).
  96.  * Removed 2.0.x defines.
  97.  * Changed SkGeProbe to skge_probe.
  98.  * Added checks in SkGeIoctl.
  99.  *
  100.  * Revision 1.25  1999/10/07 14:47:52  cgoos
  101.  * Changed 984x to 98xx.
  102.  *
  103.  * Revision 1.24  1999/09/30 07:21:01  cgoos
  104.  * Removed SK_RLMT_SLOW_LOOKAHEAD option.
  105.  * Giving spanning tree packets also to OS now.
  106.  *
  107.  * Revision 1.23  1999/09/29 07:36:50  cgoos
  108.  * Changed assignment for IsBc/IsMc.
  109.  *
  110.  * Revision 1.22  1999/09/28 12:57:09  cgoos
  111.  * Added CheckQueue also to Single-Port-ISR.
  112.  *
  113.  * Revision 1.21  1999/09/28 12:42:41  cgoos
  114.  * Changed parameter strings for RlmtMode.
  115.  *
  116.  * Revision 1.20  1999/09/28 12:37:57  cgoos
  117.  * Added CheckQueue for fast delivery of RLMT frames.
  118.  *
  119.  * Revision 1.19  1999/09/16 07:57:25  cgoos
  120.  * Copperfield changes.
  121.  *
  122.  * Revision 1.18  1999/09/03 13:06:30  cgoos
  123.  * Fixed RlmtMode=CheckSeg bug: wrong DEV_KFREE_SKB in RLMT_SEND caused
  124.  * double allocated skb's.
  125.  * FrameStat in ReceiveIrq was accessed via wrong Rxd.
  126.  * Queue size for async. standby Tx queue was zero.
  127.  * FillRxLimit of 0 could cause problems with ReQueue, changed to 1.
  128.  * Removed debug output of checksum statistic.
  129.  *
  130.  * Revision 1.17  1999/08/11 13:55:27  cgoos
  131.  * Transmit descriptor polling was not reenabled after SkGePortInit.
  132.  *
  133.  * Revision 1.16  1999/07/27 15:17:29  cgoos
  134.  * Added some "n" in output strings (removed while debuging...).
  135.  *
  136.  * Revision 1.15  1999/07/23 12:09:30  cgoos
  137.  * Performance optimization, rx checksumming, large frame support.
  138.  *
  139.  * Revision 1.14  1999/07/14 11:26:27  cgoos
  140.  * Removed Link LED settings (now in RLMT).
  141.  * Added status output at NET UP.
  142.  * Fixed SMP problems with Tx and SWITCH running in parallel.
  143.  * Fixed return code problem at RLMT_SEND event.
  144.  *
  145.  * Revision 1.13  1999/04/07 10:11:42  cgoos
  146.  * Fixed Single Port problems.
  147.  * Fixed Multi-Adapter problems.
  148.  * Always display startup string.
  149.  *
  150.  * Revision 1.12  1999/03/29 12:26:37  cgoos
  151.  * Reversed locking to fine granularity.
  152.  * Fixed skb double alloc problem (caused by incorrect xmit return code).
  153.  * Enhanced function descriptions.
  154.  *
  155.  * Revision 1.11  1999/03/15 13:10:51  cgoos
  156.  * Changed device identifier in output string to ethX.
  157.  *
  158.  * Revision 1.10  1999/03/15 12:12:34  cgoos
  159.  * Changed copyright notice.
  160.  *
  161.  * Revision 1.9  1999/03/15 12:10:17  cgoos
  162.  * Changed locking to one driver lock.
  163.  * Added check of SK_AC-size (for consistency with library).
  164.  *
  165.  * Revision 1.8  1999/03/08 11:44:02  cgoos
  166.  * Fixed missing dev->tbusy in SkGeXmit.
  167.  * Changed large frame (jumbo) buffer number.
  168.  * Added copying of short frames.
  169.  *
  170.  * Revision 1.7  1999/03/04 13:26:57  cgoos
  171.  * Fixed spinlock calls for SMP.
  172.  *
  173.  * Revision 1.6  1999/03/02 09:53:51  cgoos
  174.  * Added descriptor revertion for big endian machines.
  175.  *
  176.  * Revision 1.5  1999/03/01 08:50:59  cgoos
  177.  * Fixed SkGeChangeMtu.
  178.  * Fixed pci config space accesses.
  179.  *
  180.  * Revision 1.4  1999/02/18 15:48:44  cgoos
  181.  * Corrected some printk's.
  182.  *
  183.  * Revision 1.3  1999/02/18 12:45:55  cgoos
  184.  * Changed SK_MAX_CARD_PARAM to default 16
  185.  *
  186.  * Revision 1.2  1999/02/18 10:55:32  cgoos
  187.  * Removed SkGeDrvTimeStamp function.
  188.  * Printing "ethX:" before adapter type at adapter init.
  189.  *
  190.  *
  191.  * 10-Feb-1999 cg Created, based on Linux' acenic.c, 3c59x.c and 
  192.  * SysKonnects GEnesis Solaris driver
  193.  *
  194.  ******************************************************************************/
  195. /******************************************************************************
  196.  *
  197.  * Possible compiler options (#define xxx / -Dxxx):
  198.  *
  199.  * debugging can be enable by changing SK_DEBUG_CHKMOD and 
  200.  * SK_DEBUG_CHKCAT in makefile (described there).
  201.  *
  202.  ******************************************************************************/
  203.  
  204. /******************************************************************************
  205.  *
  206.  * Description:
  207.  *
  208.  * This is the main module of the Linux GE driver.
  209.  *
  210.  * All source files except skge.c, skdrv1st.h, skdrv2nd.h and sktypes.h
  211.  * are part of SysKonnect's COMMON MODULES for the SK-98xx adapters.
  212.  * Those are used for drivers on multiple OS', so some thing may seem
  213.  * unnecessary complicated on Linux. Please do not try to 'clean up'
  214.  * them without VERY good reasons, because this will make it more
  215.  * difficult to keep the Linux driver in synchronisation with the
  216.  * other versions.
  217.  *
  218.  * Include file hierarchy:
  219.  *
  220.  * <linux/module.h>
  221.  *
  222.  * "h/skdrv1st.h"
  223.  * <linux/version.h>
  224.  * <linux/types.h>
  225.  * <linux/kernel.h>
  226.  * <linux/string.h>
  227.  * <linux/errno.h>
  228.  * <linux/ioport.h>
  229.  * <linux/slab.h>
  230.  * <linux/interrupt.h>
  231.  * <linux/pci.h>
  232.  * <asm/byteorder.h>
  233.  * <asm/bitops.h>
  234.  * <asm/io.h>
  235.  * <linux/netdevice.h>
  236.  * <linux/etherdevice.h>
  237.  * <linux/skbuff.h>
  238.  *     those three depending on kernel version used:
  239.  * <linux/bios32.h>
  240.  * <linux/init.h>
  241.  * <asm/uaccess.h>
  242.  * <net/checksum.h>
  243.  *
  244.  * "h/skerror.h"
  245.  * "h/skdebug.h"
  246.  * "h/sktypes.h"
  247.  * "h/lm80.h"
  248.  * "h/xmac_ii.h"
  249.  *
  250.  *      "h/skdrv2nd.h"
  251.  * "h/skqueue.h"
  252.  * "h/skgehwt.h"
  253.  * "h/sktimer.h"
  254.  * "h/ski2c.h"
  255.  * "h/skgepnmi.h"
  256.  * "h/skvpd.h"
  257.  * "h/skgehw.h"
  258.  * "h/skgeinit.h"
  259.  * "h/skaddr.h"
  260.  * "h/skgesirq.h"
  261.  * "h/skcsum.h"
  262.  * "h/skrlmt.h"
  263.  *
  264.  ******************************************************************************/
  265. #include "h/skversion.h"
  266. #include <linux/module.h>
  267. #include <linux/init.h>
  268. #include  <linux/proc_fs.h>
  269. #include "h/skdrv1st.h"
  270. #include "h/skdrv2nd.h"
  271. /* defines ******************************************************************/
  272. /* for debuging on x86 only */
  273. /* #define BREAKPOINT() asm(" int $3"); */
  274. /* use of a transmit complete interrupt */
  275. #define USE_TX_COMPLETE
  276. /* use interrupt moderation (for tx complete only) */
  277. // #define USE_INT_MOD
  278. #define INTS_PER_SEC 1000
  279. /*
  280.  * threshold for copying small receive frames
  281.  * set to 0 to avoid copying, set to 9001 to copy all frames
  282.  */
  283. #define SK_COPY_THRESHOLD 200
  284. /* number of adapters that can be configured via command line params */
  285. #define SK_MAX_CARD_PARAM 16
  286. /*
  287.  * use those defines for a compile-in version of the driver instead 
  288.  * of command line parameters
  289.  */
  290. // #define AUTO_NEG_A {"Sense", }
  291. // #define AUTO_NEG_B {"Sense", }
  292. // #define DUP_CAP_A {"Both", }
  293. // #define DUP_CAP_B {"Both", }
  294. // #define FLOW_CTRL_A {"SymOrRem", }
  295. // #define FLOW_CTRL_B {"SymOrRem", }
  296. // #define ROLE_A {"Auto", }
  297. // #define ROLE_B {"Auto", }
  298. // #define PREF_PORT {"A", }
  299. // #define RLMT_MODE {"CheckLinkState", }
  300. #define DEV_KFREE_SKB(skb) dev_kfree_skb(skb)
  301. #define DEV_KFREE_SKB_IRQ(skb) dev_kfree_skb_irq(skb)
  302. #define DEV_KFREE_SKB_ANY(skb) dev_kfree_skb_any(skb)
  303. /* function prototypes ******************************************************/
  304. static void FreeResources(struct net_device *dev);
  305. int init_module(void);
  306. void cleanup_module(void);
  307. static int SkGeBoardInit(struct net_device *dev, SK_AC *pAC);
  308. static SK_BOOL BoardAllocMem(SK_AC *pAC);
  309. static void BoardFreeMem(SK_AC *pAC);
  310. static void BoardInitMem(SK_AC *pAC);
  311. static void SetupRing(SK_AC*, void*, uintptr_t, RXD**, RXD**, RXD**,
  312. int*, SK_BOOL);
  313. static void SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs);
  314. static void SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs);
  315. static int SkGeOpen(struct net_device *dev);
  316. static int SkGeClose(struct net_device *dev);
  317. static int SkGeXmit(struct sk_buff *skb, struct net_device *dev);
  318. static int SkGeSetMacAddr(struct net_device *dev, void *p);
  319. static void SkGeSetRxMode(struct net_device *dev);
  320. static struct net_device_stats *SkGeStats(struct net_device *dev);
  321. static int SkGeIoctl(struct net_device *dev, struct ifreq *rq, int cmd);
  322. static void GetConfiguration(SK_AC*);
  323. static void ProductStr(SK_AC*);
  324. static int XmitFrame(SK_AC*, TX_PORT*, struct sk_buff*);
  325. static void FreeTxDescriptors(SK_AC*pAC, TX_PORT*);
  326. static void FillRxRing(SK_AC*, RX_PORT*);
  327. static SK_BOOL FillRxDescriptor(SK_AC*, RX_PORT*);
  328. static void ReceiveIrq(SK_AC*, RX_PORT*);
  329. static void ClearAndStartRx(SK_AC*, int);
  330. static void ClearTxIrq(SK_AC*, int, int);
  331. static void ClearRxRing(SK_AC*, RX_PORT*);
  332. static void ClearTxRing(SK_AC*, TX_PORT*);
  333. static void SetQueueSizes(SK_AC *pAC);
  334. static int SkGeChangeMtu(struct net_device *dev, int new_mtu);
  335. static void PortReInitBmu(SK_AC*, int);
  336. static int SkGeIocMib(DEV_NET*, unsigned int, int);
  337. /*Extern */
  338. extern struct proc_dir_entry *pSkRootDir;
  339. //extern struct proc_dir_entry Our_Proc_Dir;
  340. extern int proc_read(char *buffer, char **buffer_location,
  341. off_t offset, int buffer_length, int *eof, void *data);
  342. #ifdef DEBUG
  343. static void DumpMsg(struct sk_buff*, char*);
  344. static void DumpData(char*, int);
  345. static void DumpLong(char*, int);
  346. #endif
  347. /* global variables *********************************************************/
  348. static const char *BootString = BOOT_STRING;
  349. struct net_device *sk98lin_root_dev = NULL;
  350. static int probed __initdata = 0;
  351. struct inode_operations SkInodeOps;
  352. //static struct file_operations SkFileOps;  /* with open/relase */
  353. /* local variables **********************************************************/
  354. static uintptr_t TxQueueAddr[SK_MAX_MACS][2] = {{0x680, 0x600},{0x780, 0x700}};
  355. static uintptr_t RxQueueAddr[SK_MAX_MACS] = {0x400, 0x480};
  356. void proc_fill_inode(struct inode *inode, int fill)
  357. {
  358. if (fill)
  359. MOD_INC_USE_COUNT;
  360. else
  361. MOD_DEC_USE_COUNT;
  362. }
  363. /*****************************************************************************
  364.  *
  365.  *  skge_probe - find all SK-98xx adapters
  366.  *
  367.  * Description:
  368.  * This function scans the PCI bus for SK-98xx adapters. Resources for
  369.  * each adapter are allocated and the adapter is brought into Init 1
  370.  * state.
  371.  *
  372.  * Returns:
  373.  * 0, if everything is ok
  374.  * !=0, on error
  375.  */
  376. static int __init skge_probe (void)
  377. {
  378. int proc_root_initialized = 0;
  379. int  boards_found = 0;
  380. int version_disp = 0;
  381. SK_AC *pAC;
  382. DEV_NET *pNet = NULL;
  383. struct  pci_dev *pdev = NULL;
  384. unsigned long base_address;
  385. struct net_device *dev = NULL;
  386. struct proc_dir_entry *pProcFile;
  387. if (probed)
  388. return -ENODEV;
  389. probed++;
  390. /* display driver info */
  391. if (!version_disp)
  392. {
  393. /* set display flag to TRUE so that */
  394. /* we only display this string ONCE */
  395. version_disp = 1;
  396. printk("%sn", BootString);
  397. }
  398. if (!pci_present()) /* is PCI support present? */
  399. return -ENODEV;
  400. while((pdev = pci_find_device(PCI_VENDOR_ID_SYSKONNECT,
  401.       PCI_DEVICE_ID_SYSKONNECT_GE, pdev)) != NULL) {
  402. dev = NULL;
  403. pNet = NULL;
  404. if (pci_enable_device(pdev))
  405. continue;
  406. /* Configure DMA attributes. */
  407. if (pci_set_dma_mask(pdev, (u64) 0xffffffffffffffff) &&
  408.     pci_set_dma_mask(pdev, (u64) 0xffffffff))
  409. continue;
  410. if ((dev = init_etherdev(dev, sizeof(DEV_NET))) == 0) {
  411. printk(KERN_ERR "Unable to allocate etherdev "
  412.        "structure!n");
  413. break;
  414. }
  415. pNet = dev->priv;
  416. pNet->pAC = kmalloc(sizeof(SK_AC), GFP_KERNEL);
  417. if (pNet->pAC == NULL){
  418. kfree(dev->priv);
  419. printk(KERN_ERR "Unable to allocate adapter "
  420.        "structure!n");
  421. break;
  422. }
  423. memset(pNet->pAC, 0, sizeof(SK_AC));
  424. pAC = pNet->pAC;
  425. pAC->PciDev = *pdev;
  426. pAC->PciDevId = pdev->device;
  427. pAC->dev[0] = dev;
  428. pAC->dev[1] = dev;
  429. sprintf(pAC->Name, "SysKonnect SK-98xx");
  430. pAC->CheckQueue = SK_FALSE;
  431. pNet->Mtu = 1500;
  432. pNet->Up = 0;
  433. dev->irq = pdev->irq;
  434. dev->open = &SkGeOpen;
  435. dev->stop = &SkGeClose;
  436. dev->hard_start_xmit = &SkGeXmit;
  437. dev->get_stats = &SkGeStats;
  438. dev->set_multicast_list = &SkGeSetRxMode;
  439. dev->set_mac_address = &SkGeSetMacAddr;
  440. dev->do_ioctl = &SkGeIoctl;
  441. dev->change_mtu = &SkGeChangeMtu;
  442. if(!proc_root_initialized) {
  443. pSkRootDir = create_proc_entry("sk98lin",
  444. S_IFDIR | S_IWUSR | S_IRUGO | S_IXUGO, proc_net);
  445. pSkRootDir->owner = THIS_MODULE;
  446. proc_root_initialized = 1;
  447. }
  448. pProcFile = create_proc_entry(dev->name, 
  449. S_IFREG | 0444, pSkRootDir);
  450. pProcFile->read_proc = proc_read;
  451. pProcFile->write_proc = NULL;
  452. pProcFile->nlink = 1;
  453. pProcFile->size = sizeof(dev->name+1);
  454. pProcFile->data = (void*)pProcFile;
  455. /*
  456.  * Dummy value.
  457.  */
  458. dev->base_addr = 42;
  459. pci_set_master(pdev);
  460. base_address = pci_resource_start (pdev, 0);
  461. #ifdef SK_BIG_ENDIAN
  462. /*
  463.  * On big endian machines, we use the adapter's aibility of
  464.  * reading the descriptors as big endian.
  465.  */
  466. {
  467. SK_U32 our2;
  468. SkPciReadCfgDWord(pAC, PCI_OUR_REG_2, &our2);
  469. our2 |= PCI_REV_DESC;
  470. SkPciWriteCfgDWord(pAC, PCI_OUR_REG_2, our2);
  471. }
  472. #endif /* BIG ENDIAN */
  473. /*
  474.  * Remap the regs into kernel space.
  475.  */
  476. pAC->IoBase = (char*)ioremap(base_address, 0x4000);
  477. if (!pAC->IoBase){
  478. printk(KERN_ERR "%s:  Unable to map I/O register, "
  479.        "SK 98xx No. %i will be disabled.n",
  480.        dev->name, boards_found);
  481. kfree(dev);
  482. break;
  483. }
  484. pAC->Index = boards_found;
  485. if (SkGeBoardInit(dev, pAC)) {
  486. FreeResources(dev);
  487. kfree(dev);
  488. continue;
  489. }
  490. memcpy((caddr_t) &dev->dev_addr,
  491. (caddr_t) &pAC->Addr.Net[0].CurrentMacAddress, 6);
  492. pNet->PortNr = 0;
  493. pNet->NetNr = 0;
  494. boards_found++;
  495. /* More then one port found */
  496. if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) {
  497. if ((dev = init_etherdev(NULL, sizeof(DEV_NET))) == 0) {
  498. printk(KERN_ERR "Unable to allocate etherdev "
  499. "structure!n");
  500. break;
  501. }
  502. pAC->dev[1] = dev;
  503. pNet = dev->priv;
  504. pNet->PortNr = 1;
  505. pNet->NetNr = 1;
  506. pNet->pAC = pAC;
  507. pNet->Mtu = 1500;
  508. pNet->Up = 0;
  509. dev->open = &SkGeOpen;
  510. dev->stop = &SkGeClose;
  511. dev->hard_start_xmit = &SkGeXmit;
  512. dev->get_stats = &SkGeStats;
  513. dev->set_multicast_list = &SkGeSetRxMode;
  514. dev->set_mac_address = &SkGeSetMacAddr;
  515. dev->do_ioctl = &SkGeIoctl;
  516. dev->change_mtu = &SkGeChangeMtu;
  517. pProcFile = create_proc_entry(dev->name, 
  518. S_IFREG | 0444, pSkRootDir);
  519. pProcFile->read_proc = proc_read;
  520. pProcFile->write_proc = NULL;
  521. pProcFile->nlink = 1;
  522. pProcFile->size = sizeof(dev->name+1);
  523. pProcFile->data = (void*)pProcFile;
  524. memcpy((caddr_t) &dev->dev_addr,
  525. (caddr_t) &pAC->Addr.Net[1].CurrentMacAddress, 6);
  526. printk("%s: %sn", dev->name, pAC->DeviceStr);
  527. printk("      PrefPort:B  RlmtMode:Dual Check Link Staten");
  528. }
  529. /*
  530.  * This is bollocks, but we need to tell the net-init
  531.  * code that it shall go for the next device.
  532.  */
  533. #ifndef MODULE
  534. dev->base_addr = 0;
  535. #endif
  536. }
  537. /*
  538.  * If we're at this point we're going through skge_probe() for
  539.  * the first time.  Return success (0) if we've initialized 1
  540.  * or more boards. Otherwise, return failure (-ENODEV).
  541.  */
  542. return boards_found;
  543. } /* skge_probe */
  544. /*****************************************************************************
  545.  *
  546.  *  FreeResources - release resources allocated for adapter
  547.  *
  548.  * Description:
  549.  * This function releases the IRQ, unmaps the IO and
  550.  * frees the desriptor ring.
  551.  *
  552.  * Returns: N/A
  553.  *
  554.  */
  555. static void FreeResources(struct net_device *dev)
  556. {
  557. SK_U32 AllocFlag;
  558. DEV_NET *pNet;
  559. SK_AC *pAC;
  560. if (dev->priv) {
  561. pNet = (DEV_NET*) dev->priv;
  562. pAC = pNet->pAC;
  563. AllocFlag = pAC->AllocFlag;
  564. if (AllocFlag & SK_ALLOC_IRQ) {
  565. free_irq(dev->irq, dev);
  566. }
  567. if (pAC->IoBase) {
  568. iounmap(pAC->IoBase);
  569. }
  570. if (pAC->pDescrMem) {
  571. BoardFreeMem(pAC);
  572. }
  573. }
  574. } /* FreeResources */
  575. MODULE_AUTHOR("Christoph Goos <cgoos@syskonnect.de>");
  576. MODULE_DESCRIPTION("SysKonnect SK-NET Gigabit Ethernet SK-98xx driver");
  577. MODULE_LICENSE("GPL");
  578. MODULE_PARM(AutoNeg_A,  "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
  579. MODULE_PARM(AutoNeg_B,  "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
  580. MODULE_PARM(DupCap_A,   "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
  581. MODULE_PARM(DupCap_B,   "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
  582. MODULE_PARM(FlowCtrl_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
  583. MODULE_PARM(FlowCtrl_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
  584. MODULE_PARM(Role_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
  585. MODULE_PARM(Role_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
  586. MODULE_PARM(PrefPort,   "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
  587. MODULE_PARM(RlmtMode,   "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s");
  588. /* not used, just there because every driver should have them: */
  589. MODULE_PARM(options,    "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "i");
  590. MODULE_PARM(debug,      "i");
  591. #ifdef AUTO_NEG_A
  592. static char *AutoNeg_A[SK_MAX_CARD_PARAM] = AUTO_NEG_A;
  593. #else
  594. static char *AutoNeg_A[SK_MAX_CARD_PARAM] = {"", };
  595. #endif
  596. #ifdef DUP_CAP_A
  597. static char *DupCap_A[SK_MAX_CARD_PARAM] = DUP_CAP_A;
  598. #else
  599. static char *DupCap_A[SK_MAX_CARD_PARAM] = {"", };
  600. #endif
  601. #ifdef FLOW_CTRL_A
  602. static char *FlowCtrl_A[SK_MAX_CARD_PARAM] = FLOW_CTRL_A;
  603. #else
  604. static char *FlowCtrl_A[SK_MAX_CARD_PARAM] = {"", };
  605. #endif
  606. #ifdef ROLE_A
  607. static char *Role_A[SK_MAX_CARD_PARAM] = ROLE_A;
  608. #else
  609. static char *Role_A[SK_MAX_CARD_PARAM] = {"", };
  610. #endif
  611. #ifdef AUTO_NEG_B
  612. static char *AutoNeg_B[SK_MAX_CARD_PARAM] = AUTO_NEG_B;
  613. #else
  614. static char *AutoNeg_B[SK_MAX_CARD_PARAM] = {"", };
  615. #endif
  616. #ifdef DUP_CAP_B
  617. static char *DupCap_B[SK_MAX_CARD_PARAM] = DUP_CAP_B;
  618. #else
  619. static char *DupCap_B[SK_MAX_CARD_PARAM] = {"", };
  620. #endif
  621. #ifdef FLOW_CTRL_B
  622. static char *FlowCtrl_B[SK_MAX_CARD_PARAM] = FLOW_CTRL_B;
  623. #else
  624. static char *FlowCtrl_B[SK_MAX_CARD_PARAM] = {"", };
  625. #endif
  626. #ifdef ROLE_B
  627. static char *Role_B[SK_MAX_CARD_PARAM] = ROLE_B;
  628. #else
  629. static char *Role_B[SK_MAX_CARD_PARAM] = {"", };
  630. #endif
  631. #ifdef PREF_PORT
  632. static char *PrefPort[SK_MAX_CARD_PARAM] = PREF_PORT;
  633. #else
  634. static char *PrefPort[SK_MAX_CARD_PARAM] = {"", };
  635. #endif
  636. #ifdef RLMT_MODE
  637. static char *RlmtMode[SK_MAX_CARD_PARAM] = RLMT_MODE;
  638. #else
  639. static char *RlmtMode[SK_MAX_CARD_PARAM] = {"", };
  640. #endif
  641. static int debug = 0; /* not used */
  642. static int options[SK_MAX_CARD_PARAM] = {0, }; /* not used */
  643. /*****************************************************************************
  644.  *
  645.  *  skge_init_module - module initialization function
  646.  *
  647.  * Description:
  648.  * Very simple, only call skge_probe and return approriate result.
  649.  *
  650.  * Returns:
  651.  * 0, if everything is ok
  652.  * !=0, on error
  653.  */
  654. static int __init skge_init_module(void)
  655. {
  656. int cards;
  657. sk98lin_root_dev = NULL;
  658. /* just to avoid warnings ... */
  659. debug = 0;
  660. options[0] = 0;
  661. cards = skge_probe();
  662. if (cards == 0) {
  663. printk("No adapter foundn");
  664. }
  665. return cards ? 0 : -ENODEV;
  666. } /* skge_init_module */
  667. /*****************************************************************************
  668.  *
  669.  *  skge_cleanup_module - module unload function
  670.  *
  671.  * Description:
  672.  * Disable adapter if it is still running, free resources,
  673.  * free device struct.
  674.  *
  675.  * Returns: N/A
  676.  */
  677. static void __exit skge_cleanup_module(void)
  678. {
  679. DEV_NET *pNet;
  680. SK_AC *pAC;
  681. struct net_device *next;
  682. unsigned long Flags;
  683. SK_EVPARA EvPara;
  684. while (sk98lin_root_dev) {
  685. pNet = (DEV_NET*) sk98lin_root_dev->priv;
  686. pAC = pNet->pAC;
  687. next = pAC->Next;
  688. netif_stop_queue(sk98lin_root_dev);
  689. SkGeYellowLED(pAC, pAC->IoBase, 0);
  690. if(pAC->BoardLevel == 2) {
  691. /* board is still alive */
  692. spin_lock_irqsave(&pAC->SlowPathLock, Flags);
  693. EvPara.Para32[0] = 0;
  694. EvPara.Para32[1] = -1;
  695. SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);
  696. EvPara.Para32[0] = 1;
  697. EvPara.Para32[1] = -1;
  698. SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);
  699. SkEventDispatcher(pAC, pAC->IoBase);
  700. /* disable interrupts */
  701. SK_OUT32(pAC->IoBase, B0_IMSK, 0);
  702. SkGeDeInit(pAC, pAC->IoBase); 
  703. spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
  704. pAC->BoardLevel = 0;
  705. /* We do NOT check here, if IRQ was pending, of course*/
  706. }
  707. if(pAC->BoardLevel == 1) {
  708. /* board is still alive */
  709. SkGeDeInit(pAC, pAC->IoBase); 
  710. pAC->BoardLevel = 0;
  711. }
  712. if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 2){
  713. unregister_netdev(pAC->dev[1]);
  714. kfree(pAC->dev[1]);
  715. }
  716. FreeResources(sk98lin_root_dev);
  717. sk98lin_root_dev->get_stats = NULL;
  718. /* 
  719.  * otherwise unregister_netdev calls get_stats with
  720.  * invalid IO ...  :-(
  721.  */
  722. unregister_netdev(sk98lin_root_dev);
  723. kfree(sk98lin_root_dev);
  724. kfree(pAC);
  725. sk98lin_root_dev = next;
  726. }
  727. /* clear proc-dir */
  728. remove_proc_entry(pSkRootDir->name, proc_net);
  729. } /* skge_cleanup_module */
  730. module_init(skge_init_module);
  731. module_exit(skge_cleanup_module);
  732. /*****************************************************************************
  733.  *
  734.  *  SkGeBoardInit - do level 0 and 1 initialization
  735.  *
  736.  * Description:
  737.  * This function prepares the board hardware for running. The desriptor
  738.  * ring is set up, the IRQ is allocated and the configuration settings
  739.  * are examined.
  740.  *
  741.  * Returns:
  742.  * 0, if everything is ok
  743.  * !=0, on error
  744.  */
  745. static int __init SkGeBoardInit(struct net_device *dev, SK_AC *pAC)
  746. {
  747. short i;
  748. unsigned long Flags;
  749. char *DescrString = "sk98lin: Driver for Linux"; /* this is given to PNMI */
  750. char *VerStr = VER_STRING;
  751. int Ret; /* return code of request_irq */
  752. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  753. ("IoBase: %08lXn", (unsigned long)pAC->IoBase));
  754. for (i=0; i<SK_MAX_MACS; i++) {
  755. pAC->TxPort[i][0].HwAddr = pAC->IoBase + TxQueueAddr[i][0];
  756. pAC->TxPort[i][0].PortIndex = i;
  757. pAC->RxPort[i].HwAddr = pAC->IoBase + RxQueueAddr[i];
  758. pAC->RxPort[i].PortIndex = i;
  759. }
  760. /* Initialize the mutexes */
  761. for (i=0; i<SK_MAX_MACS; i++) {
  762. spin_lock_init(&pAC->TxPort[i][0].TxDesRingLock);
  763. spin_lock_init(&pAC->RxPort[i].RxDesRingLock);
  764. }
  765. spin_lock_init(&pAC->SlowPathLock);
  766. /* level 0 init common modules here */
  767. spin_lock_irqsave(&pAC->SlowPathLock, Flags);
  768. /* Does a RESET on board ...*/
  769. if (SkGeInit(pAC, pAC->IoBase, 0) != 0) {
  770. printk("HWInit (0) failed.n");
  771. spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
  772. return(-EAGAIN);
  773. }
  774. SkI2cInit(  pAC, pAC->IoBase, 0);
  775. SkEventInit(pAC, pAC->IoBase, 0);
  776. SkPnmiInit( pAC, pAC->IoBase, 0);
  777. SkAddrInit( pAC, pAC->IoBase, 0);
  778. SkRlmtInit( pAC, pAC->IoBase, 0);
  779. SkTimerInit(pAC, pAC->IoBase, 0);
  780. pAC->BoardLevel = 0;
  781. pAC->RxBufSize = ETH_BUF_SIZE;
  782. SK_PNMI_SET_DRIVER_DESCR(pAC, DescrString);
  783. SK_PNMI_SET_DRIVER_VER(pAC, VerStr);
  784. spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
  785. /* level 1 init common modules here (HW init) */
  786. spin_lock_irqsave(&pAC->SlowPathLock, Flags);
  787. if (SkGeInit(pAC, pAC->IoBase, 1) != 0) {
  788. printk("HWInit (1) failed.n");
  789. spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
  790. return(-EAGAIN);
  791. }
  792. SkI2cInit(  pAC, pAC->IoBase, 1);
  793. SkEventInit(pAC, pAC->IoBase, 1);
  794. SkPnmiInit( pAC, pAC->IoBase, 1);
  795. SkAddrInit( pAC, pAC->IoBase, 1);
  796. SkRlmtInit( pAC, pAC->IoBase, 1);
  797. SkTimerInit(pAC, pAC->IoBase, 1);
  798. GetConfiguration(pAC);
  799. if (pAC->RlmtNets == 2) {
  800. pAC->GIni.GIPortUsage = SK_MUL_LINK;
  801. }
  802. pAC->BoardLevel = 1;
  803. spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
  804. if (pAC->GIni.GIMacsFound == 2) {
  805.  Ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, pAC->Name, dev);
  806. } else if (pAC->GIni.GIMacsFound == 1) {
  807. Ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ,
  808. pAC->Name, dev);
  809. } else {
  810. printk(KERN_WARNING "%s: illegal number of ports: %dn",
  811.        dev->name, pAC->GIni.GIMacsFound);
  812. return -EAGAIN;
  813. }
  814. if (Ret) {
  815. printk(KERN_WARNING "%s: Requested IRQ %d is busyn",
  816.        dev->name, dev->irq);
  817. return -EAGAIN;
  818. }
  819. pAC->AllocFlag |= SK_ALLOC_IRQ;
  820. /* Alloc memory for this board (Mem for RxD/TxD) : */
  821. if(!BoardAllocMem(pAC)) {
  822. printk("No memory for descriptor ringsn");
  823.         return(-EAGAIN);
  824. }
  825. SkCsSetReceiveFlags(pAC,
  826. SKCS_PROTO_IP | SKCS_PROTO_TCP | SKCS_PROTO_UDP,
  827. &pAC->CsOfs1, &pAC->CsOfs2, 0);
  828. pAC->CsOfs = (pAC->CsOfs2 << 16) | pAC->CsOfs1;
  829. BoardInitMem(pAC);
  830. SetQueueSizes(pAC);
  831. /* Print adapter specific string from vpd */
  832. ProductStr(pAC);
  833. printk("%s: %sn", dev->name, pAC->DeviceStr);
  834. /* Print configuration settings */
  835. printk("      PrefPort:%c  RlmtMode:%sn",
  836. 'A' + pAC->Rlmt.Net[0].Port[pAC->Rlmt.Net[0].PrefPort]->PortNumber,
  837. (pAC->RlmtMode==0)  ? "Check Link State" :
  838. ((pAC->RlmtMode==1) ? "Check Link State" : 
  839. ((pAC->RlmtMode==3) ? "Check Local Port" : 
  840. ((pAC->RlmtMode==7) ? "Check Segmentation" : 
  841. ((pAC->RlmtMode==17) ? "Dual Check Link State" :"Error")))));
  842. SkGeYellowLED(pAC, pAC->IoBase, 1);
  843. /*
  844.  * Register the device here
  845.  */
  846. pAC->Next = sk98lin_root_dev;
  847. sk98lin_root_dev = dev;
  848. return (0);
  849. } /* SkGeBoardInit */
  850. /*****************************************************************************
  851.  *
  852.  *  BoardAllocMem - allocate the memory for the descriptor rings
  853.  *
  854.  * Description:
  855.  * This function allocates the memory for all descriptor rings.
  856.  * Each ring is aligned for the desriptor alignment and no ring
  857.  * has a 4 GByte boundary in it (because the upper 32 bit must
  858.  * be constant for all descriptiors in one rings).
  859.  *
  860.  * Returns:
  861.  * SK_TRUE, if all memory could be allocated
  862.  * SK_FALSE, if not
  863.  */
  864. static SK_BOOL BoardAllocMem(
  865. SK_AC *pAC)
  866. {
  867. caddr_t pDescrMem; /* pointer to descriptor memory area */
  868. size_t AllocLength; /* length of complete descriptor area */
  869. int i; /* loop counter */
  870. unsigned long BusAddr;
  871. /* rings plus one for alignment (do not cross 4 GB boundary) */
  872. /* RX_RING_SIZE is assumed bigger than TX_RING_SIZE */
  873. #if (BITS_PER_LONG == 32)
  874. AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound + 8;
  875. #else
  876. AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound
  877. + RX_RING_SIZE + 8;
  878. #endif
  879. pDescrMem = pci_alloc_consistent(&pAC->PciDev, AllocLength,
  880.  &pAC->pDescrMemDMA);
  881. if (pDescrMem == NULL) {
  882. return (SK_FALSE);
  883. }
  884. pAC->pDescrMem = pDescrMem;
  885. /* Descriptors need 8 byte alignment, and this is ensured
  886.  * by pci_alloc_consistent.
  887.  */
  888. BusAddr = (unsigned long) pAC->pDescrMemDMA;
  889. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  890. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
  891. ("TX%d/A: pDescrMem: %lX,   PhysDescrMem: %lXn",
  892. i, (unsigned long) pDescrMem,
  893. BusAddr));
  894. pAC->TxPort[i][0].pTxDescrRing = pDescrMem;
  895. pAC->TxPort[i][0].VTxDescrRing = BusAddr;
  896. pDescrMem += TX_RING_SIZE;
  897. BusAddr += TX_RING_SIZE;
  898. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
  899. ("RX%d: pDescrMem: %lX,   PhysDescrMem: %lXn",
  900. i, (unsigned long) pDescrMem,
  901. (unsigned long)BusAddr));
  902. pAC->RxPort[i].pRxDescrRing = pDescrMem;
  903. pAC->RxPort[i].VRxDescrRing = BusAddr;
  904. pDescrMem += RX_RING_SIZE;
  905. BusAddr += RX_RING_SIZE;
  906. } /* for */
  907. return (SK_TRUE);
  908. } /* BoardAllocMem */
  909. /****************************************************************************
  910.  *
  911.  * BoardFreeMem - reverse of BoardAllocMem
  912.  *
  913.  * Description:
  914.  * Free all memory allocated in BoardAllocMem: adapter context,
  915.  * descriptor rings, locks.
  916.  *
  917.  * Returns: N/A
  918.  */
  919. static void BoardFreeMem(
  920. SK_AC *pAC)
  921. {
  922. size_t AllocLength; /* length of complete descriptor area */
  923. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  924. ("BoardFreeMemn"));
  925. #if (BITS_PER_LONG == 32)
  926. AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound + 8;
  927. #else
  928. AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound
  929. + RX_RING_SIZE + 8;
  930. #endif
  931. pci_free_consistent(&pAC->PciDev, AllocLength,
  932.     pAC->pDescrMem, pAC->pDescrMemDMA);
  933. pAC->pDescrMem = NULL;
  934. } /* BoardFreeMem */
  935. /*****************************************************************************
  936.  *
  937.  *  BoardInitMem - initiate the descriptor rings
  938.  *
  939.  * Description:
  940.  * This function sets the descriptor rings up in memory.
  941.  * The adapter is initialized with the descriptor start addresses.
  942.  *
  943.  * Returns: N/A
  944.  */
  945. static void BoardInitMem(
  946. SK_AC *pAC) /* pointer to adapter context */
  947. {
  948. int i; /* loop counter */
  949. int RxDescrSize; /* the size of a rx descriptor rounded up to alignment*/
  950. int TxDescrSize; /* the size of a tx descriptor rounded up to alignment*/
  951. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  952. ("BoardInitMemn"));
  953. RxDescrSize = (((sizeof(RXD) - 1) / DESCR_ALIGN) + 1) * DESCR_ALIGN;
  954. pAC->RxDescrPerRing = RX_RING_SIZE / RxDescrSize;
  955. TxDescrSize = (((sizeof(TXD) - 1) / DESCR_ALIGN) + 1) * DESCR_ALIGN;
  956. pAC->TxDescrPerRing = TX_RING_SIZE / RxDescrSize;
  957. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  958. SetupRing(
  959. pAC,
  960. pAC->TxPort[i][0].pTxDescrRing,
  961. pAC->TxPort[i][0].VTxDescrRing,
  962. (RXD**)&pAC->TxPort[i][0].pTxdRingHead,
  963. (RXD**)&pAC->TxPort[i][0].pTxdRingTail,
  964. (RXD**)&pAC->TxPort[i][0].pTxdRingPrev,
  965. &pAC->TxPort[i][0].TxdRingFree,
  966. SK_TRUE);
  967. SetupRing(
  968. pAC,
  969. pAC->RxPort[i].pRxDescrRing,
  970. pAC->RxPort[i].VRxDescrRing,
  971. &pAC->RxPort[i].pRxdRingHead,
  972. &pAC->RxPort[i].pRxdRingTail,
  973. &pAC->RxPort[i].pRxdRingPrev,
  974. &pAC->RxPort[i].RxdRingFree,
  975. SK_FALSE);
  976. }
  977. } /* BoardInitMem */
  978. /*****************************************************************************
  979.  *
  980.  *  SetupRing - create one descriptor ring
  981.  *
  982.  * Description:
  983.  * This function creates one descriptor ring in the given memory area.
  984.  * The head, tail and number of free descriptors in the ring are set.
  985.  *
  986.  * Returns:
  987.  * none
  988.  */
  989. static void SetupRing(
  990. SK_AC *pAC,
  991. void *pMemArea, /* a pointer to the memory area for the ring */
  992. uintptr_t VMemArea, /* the virtual bus address of the memory area */
  993. RXD **ppRingHead, /* address where the head should be written */
  994. RXD **ppRingTail, /* address where the tail should be written */
  995. RXD **ppRingPrev, /* address where the tail should be written */
  996. int *pRingFree, /* address where the # of free descr. goes */
  997. SK_BOOL IsTx) /* flag: is this a tx ring */
  998. {
  999. int i; /* loop counter */
  1000. int DescrSize; /* the size of a descriptor rounded up to alignment*/
  1001. int DescrNum; /* number of descriptors per ring */
  1002. RXD *pDescr; /* pointer to a descriptor (receive or transmit) */
  1003. RXD *pNextDescr; /* pointer to the next descriptor */
  1004. RXD *pPrevDescr; /* pointer to the previous descriptor */
  1005. uintptr_t VNextDescr; /* the virtual bus address of the next descriptor */
  1006. if (IsTx == SK_TRUE) {
  1007. DescrSize = (((sizeof(TXD) - 1) / DESCR_ALIGN) + 1) *
  1008. DESCR_ALIGN;
  1009. DescrNum = TX_RING_SIZE / DescrSize;
  1010. }
  1011. else {
  1012. DescrSize = (((sizeof(RXD) - 1) / DESCR_ALIGN) + 1) *
  1013. DESCR_ALIGN;
  1014. DescrNum = RX_RING_SIZE / DescrSize;
  1015. }
  1016. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
  1017. ("Descriptor size: %d   Descriptor Number: %dn",
  1018. DescrSize,DescrNum));
  1019. pDescr = (RXD*) pMemArea;
  1020. pPrevDescr = NULL;
  1021. pNextDescr = (RXD*) (((char*)pDescr) + DescrSize);
  1022. VNextDescr = VMemArea + DescrSize;
  1023. for(i=0; i<DescrNum; i++) {
  1024. /* set the pointers right */
  1025. pDescr->VNextRxd = VNextDescr & 0xffffffffULL;
  1026. pDescr->pNextRxd = pNextDescr;
  1027. pDescr->TcpSumStarts = pAC->CsOfs;
  1028. /* advance on step */
  1029. pPrevDescr = pDescr;
  1030. pDescr = pNextDescr;
  1031. pNextDescr = (RXD*) (((char*)pDescr) + DescrSize);
  1032. VNextDescr += DescrSize;
  1033. }
  1034. pPrevDescr->pNextRxd = (RXD*) pMemArea;
  1035. pPrevDescr->VNextRxd = VMemArea;
  1036. pDescr = (RXD*) pMemArea;
  1037. *ppRingHead = (RXD*) pMemArea;
  1038. *ppRingTail = *ppRingHead;
  1039. *ppRingPrev = pPrevDescr;
  1040. *pRingFree = DescrNum;
  1041. } /* SetupRing */
  1042. /*****************************************************************************
  1043.  *
  1044.  *  PortReInitBmu - re-initiate the descriptor rings for one port
  1045.  *
  1046.  * Description:
  1047.  * This function reinitializes the descriptor rings of one port
  1048.  * in memory. The port must be stopped before.
  1049.  * The HW is initialized with the descriptor start addresses.
  1050.  *
  1051.  * Returns:
  1052.  * none
  1053.  */
  1054. static void PortReInitBmu(
  1055. SK_AC *pAC, /* pointer to adapter context */
  1056. int PortIndex) /* index of the port for which to re-init */
  1057. {
  1058. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  1059. ("PortReInitBmu "));
  1060. /* set address of first descriptor of ring in BMU */
  1061. SK_OUT32(pAC->IoBase, TxQueueAddr[PortIndex][TX_PRIO_LOW]+
  1062. TX_Q_CUR_DESCR_LOW,
  1063. (uint32_t)(((caddr_t)
  1064. (pAC->TxPort[PortIndex][TX_PRIO_LOW].pTxdRingHead) -
  1065. pAC->TxPort[PortIndex][TX_PRIO_LOW].pTxDescrRing +
  1066. pAC->TxPort[PortIndex][TX_PRIO_LOW].VTxDescrRing) &
  1067. 0xFFFFFFFF));
  1068. SK_OUT32(pAC->IoBase, TxQueueAddr[PortIndex][TX_PRIO_LOW]+
  1069. TX_Q_DESCR_HIGH,
  1070. (uint32_t)(((caddr_t)
  1071. (pAC->TxPort[PortIndex][TX_PRIO_LOW].pTxdRingHead) -
  1072. pAC->TxPort[PortIndex][TX_PRIO_LOW].pTxDescrRing +
  1073. pAC->TxPort[PortIndex][TX_PRIO_LOW].VTxDescrRing) >> 32));
  1074. SK_OUT32(pAC->IoBase, RxQueueAddr[PortIndex]+RX_Q_CUR_DESCR_LOW,
  1075. (uint32_t)(((caddr_t)(pAC->RxPort[PortIndex].pRxdRingHead) -
  1076. pAC->RxPort[PortIndex].pRxDescrRing +
  1077. pAC->RxPort[PortIndex].VRxDescrRing) & 0xFFFFFFFF));
  1078. SK_OUT32(pAC->IoBase, RxQueueAddr[PortIndex]+RX_Q_DESCR_HIGH,
  1079. (uint32_t)(((caddr_t)(pAC->RxPort[PortIndex].pRxdRingHead) -
  1080. pAC->RxPort[PortIndex].pRxDescrRing +
  1081. pAC->RxPort[PortIndex].VRxDescrRing) >> 32));
  1082. } /* PortReInitBmu */
  1083. /****************************************************************************
  1084.  *
  1085.  * SkGeIsr - handle adapter interrupts
  1086.  *
  1087.  * Description:
  1088.  * The interrupt routine is called when the network adapter
  1089.  * generates an interrupt. It may also be called if another device
  1090.  * shares this interrupt vector with the driver.
  1091.  *
  1092.  * Returns: N/A
  1093.  *
  1094.  */
  1095. static void SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs)
  1096. {
  1097. struct net_device *dev = (struct net_device *)dev_id;
  1098. DEV_NET *pNet;
  1099. SK_AC *pAC;
  1100. SK_U32 IntSrc; /* interrupts source register contents */
  1101. pNet = (DEV_NET*) dev->priv;
  1102. pAC = pNet->pAC;
  1103. /*
  1104.  * Check and process if its our interrupt
  1105.  */
  1106. SK_IN32(pAC->IoBase, B0_SP_ISRC, &IntSrc);
  1107. if (IntSrc == 0) {
  1108. return;
  1109. }
  1110. while (((IntSrc & IRQ_MASK) & ~SPECIAL_IRQS) != 0) {
  1111. #if 0 /* software irq currently not used */
  1112. if (IntSrc & IRQ_SW) {
  1113. SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
  1114. SK_DBGCAT_DRV_INT_SRC,
  1115. ("Software IRQn"));
  1116. }
  1117. #endif
  1118. if (IntSrc & IRQ_EOF_RX1) {
  1119. SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
  1120. SK_DBGCAT_DRV_INT_SRC,
  1121. ("EOF RX1 IRQn"));
  1122. ReceiveIrq(pAC, &pAC->RxPort[0]);
  1123. SK_PNMI_CNT_RX_INTR(pAC,0);
  1124. }
  1125. if (IntSrc & IRQ_EOF_RX2) {
  1126. SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
  1127. SK_DBGCAT_DRV_INT_SRC,
  1128. ("EOF RX2 IRQn"));
  1129. ReceiveIrq(pAC, &pAC->RxPort[1]);
  1130. SK_PNMI_CNT_RX_INTR(pAC,1);
  1131. }
  1132. #ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */
  1133. if (IntSrc & IRQ_EOF_AS_TX1) {
  1134. SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
  1135. SK_DBGCAT_DRV_INT_SRC,
  1136. ("EOF AS TX1 IRQn"));
  1137. SK_PNMI_CNT_TX_INTR(pAC,0);
  1138. spin_lock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock);
  1139. FreeTxDescriptors(pAC, &pAC->TxPort[0][TX_PRIO_LOW]);
  1140. spin_unlock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock);
  1141. }
  1142. if (IntSrc & IRQ_EOF_AS_TX2) {
  1143. SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
  1144. SK_DBGCAT_DRV_INT_SRC,
  1145. ("EOF AS TX2 IRQn"));
  1146. SK_PNMI_CNT_TX_INTR(pAC,1);
  1147. spin_lock(&pAC->TxPort[1][TX_PRIO_LOW].TxDesRingLock);
  1148. FreeTxDescriptors(pAC, &pAC->TxPort[1][TX_PRIO_LOW]);
  1149. spin_unlock(&pAC->TxPort[1][TX_PRIO_LOW].TxDesRingLock);
  1150. }
  1151. #if 0 /* only if sync. queues used */
  1152. if (IntSrc & IRQ_EOF_SY_TX1) {
  1153. SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
  1154. SK_DBGCAT_DRV_INT_SRC,
  1155. ("EOF SY TX1 IRQn"));
  1156. SK_PNMI_CNT_TX_INTR(pAC,0);
  1157. spin_lock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock);
  1158. FreeTxDescriptors(pAC, 0, TX_PRIO_HIGH);
  1159. spin_unlock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock);
  1160. ClearTxIrq(pAC, 0, TX_PRIO_HIGH);
  1161. }
  1162. if (IntSrc & IRQ_EOF_SY_TX2) {
  1163. SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
  1164. SK_DBGCAT_DRV_INT_SRC,
  1165. ("EOF SY TX2 IRQn"));
  1166. SK_PNMI_CNT_TX_INTR(pAC,1);
  1167. spin_lock(&pAC->TxPort[1][TX_PRIO_HIGH].TxDesRingLock);
  1168. FreeTxDescriptors(pAC, 1, TX_PRIO_HIGH);
  1169. spin_unlock(&pAC->TxPort[1][TX_PRIO_HIGH].TxDesRingLock);
  1170. ClearTxIrq(pAC, 1, TX_PRIO_HIGH);
  1171. }
  1172. #endif /* 0 */
  1173. #endif /* USE_TX_COMPLETE */
  1174. /* do all IO at once */
  1175. if (IntSrc & IRQ_EOF_RX1)
  1176. ClearAndStartRx(pAC, 0);
  1177. if (IntSrc & IRQ_EOF_RX2)
  1178. ClearAndStartRx(pAC, 1);
  1179. #ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */
  1180. if (IntSrc & IRQ_EOF_AS_TX1)
  1181. ClearTxIrq(pAC, 0, TX_PRIO_LOW);
  1182. if (IntSrc & IRQ_EOF_AS_TX2)
  1183. ClearTxIrq(pAC, 1, TX_PRIO_LOW);
  1184. #endif
  1185. SK_IN32(pAC->IoBase, B0_ISRC, &IntSrc);
  1186. } /* while (IntSrc & IRQ_MASK != 0) */
  1187. if ((IntSrc & SPECIAL_IRQS) || pAC->CheckQueue) {
  1188. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
  1189. ("SPECIAL IRQn"));
  1190. pAC->CheckQueue = SK_FALSE;
  1191. spin_lock(&pAC->SlowPathLock);
  1192. if (IntSrc & SPECIAL_IRQS)
  1193. SkGeSirqIsr(pAC, pAC->IoBase, IntSrc);
  1194. SkEventDispatcher(pAC, pAC->IoBase);
  1195. spin_unlock(&pAC->SlowPathLock);
  1196. }
  1197. /*
  1198.  * do it all again is case we cleared an interrupt that 
  1199.  * came in after handling the ring (OUTs may be delayed
  1200.  * in hardware buffers, but are through after IN)
  1201.  */
  1202. // ReceiveIrq(pAC, &pAC->RxPort[pAC->ActivePort]);
  1203. ReceiveIrq(pAC, &pAC->RxPort[0]);
  1204. ReceiveIrq(pAC, &pAC->RxPort[1]);
  1205. #if 0
  1206. // #ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */
  1207. spin_lock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock);
  1208. FreeTxDescriptors(pAC, &pAC->TxPort[0][TX_PRIO_LOW]);
  1209. spin_unlock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock);
  1210. spin_lock(&pAC->TxPort[1][TX_PRIO_LOW].TxDesRingLock);
  1211. FreeTxDescriptors(pAC, &pAC->TxPort[1][TX_PRIO_LOW]);
  1212. spin_unlock(&pAC->TxPort[1][TX_PRIO_LOW].TxDesRingLock);
  1213. #if 0 /* only if sync. queues used */
  1214. spin_lock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock);
  1215. FreeTxDescriptors(pAC, 0, TX_PRIO_HIGH);
  1216. spin_unlock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock);
  1217. spin_lock(&pAC->TxPort[1][TX_PRIO_HIGH].TxDesRingLock);
  1218. FreeTxDescriptors(pAC, 1, TX_PRIO_HIGH);
  1219. spin_unlock(&pAC->TxPort[1][TX_PRIO_HIGH].TxDesRingLock);
  1220. #endif /* 0 */
  1221. #endif /* USE_TX_COMPLETE */
  1222. /* IRQ is processed - Enable IRQs again*/
  1223. SK_OUT32(pAC->IoBase, B0_IMSK, IRQ_MASK);
  1224. return;
  1225. } /* SkGeIsr */
  1226. /****************************************************************************
  1227.  *
  1228.  * SkGeIsrOnePort - handle adapter interrupts for single port adapter
  1229.  *
  1230.  * Description:
  1231.  * The interrupt routine is called when the network adapter
  1232.  * generates an interrupt. It may also be called if another device
  1233.  * shares this interrupt vector with the driver.
  1234.  * This is the same as above, but handles only one port.
  1235.  *
  1236.  * Returns: N/A
  1237.  *
  1238.  */
  1239. static void SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs)
  1240. {
  1241. struct net_device *dev = (struct net_device *)dev_id;
  1242. DEV_NET *pNet;
  1243. SK_AC *pAC;
  1244. SK_U32 IntSrc; /* interrupts source register contents */
  1245. pNet = (DEV_NET*) dev->priv;
  1246. pAC = pNet->pAC;
  1247. /*
  1248.  * Check and process if its our interrupt
  1249.  */
  1250. SK_IN32(pAC->IoBase, B0_SP_ISRC, &IntSrc);
  1251. if (IntSrc == 0) {
  1252. return;
  1253. }
  1254. while (((IntSrc & IRQ_MASK) & ~SPECIAL_IRQS) != 0) {
  1255. #if 0 /* software irq currently not used */
  1256. if (IntSrc & IRQ_SW) {
  1257. SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
  1258. SK_DBGCAT_DRV_INT_SRC,
  1259. ("Software IRQn"));
  1260. }
  1261. #endif
  1262. if (IntSrc & IRQ_EOF_RX1) {
  1263. SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
  1264. SK_DBGCAT_DRV_INT_SRC,
  1265. ("EOF RX1 IRQn"));
  1266. ReceiveIrq(pAC, &pAC->RxPort[0]);
  1267. SK_PNMI_CNT_RX_INTR(pAC,0);
  1268. }
  1269. #ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */
  1270. if (IntSrc & IRQ_EOF_AS_TX1) {
  1271. SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
  1272. SK_DBGCAT_DRV_INT_SRC,
  1273. ("EOF AS TX1 IRQn"));
  1274. SK_PNMI_CNT_TX_INTR(pAC,0);
  1275. spin_lock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock);
  1276. FreeTxDescriptors(pAC, &pAC->TxPort[0][TX_PRIO_LOW]);
  1277. spin_unlock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock);
  1278. }
  1279. #if 0 /* only if sync. queues used */
  1280. if (IntSrc & IRQ_EOF_SY_TX1) {
  1281. SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
  1282. SK_DBGCAT_DRV_INT_SRC,
  1283. ("EOF SY TX1 IRQn"));
  1284. SK_PNMI_CNT_TX_INTR(pAC,1);
  1285. spin_lock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock);
  1286. FreeTxDescriptors(pAC, 0, TX_PRIO_HIGH);
  1287. spin_unlock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock);
  1288. ClearTxIrq(pAC, 0, TX_PRIO_HIGH);
  1289. }
  1290. #endif /* 0 */
  1291. #endif /* USE_TX_COMPLETE */
  1292. /* do all IO at once */
  1293. if (IntSrc & IRQ_EOF_RX1)
  1294. ClearAndStartRx(pAC, 0);
  1295. #ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */
  1296. if (IntSrc & IRQ_EOF_AS_TX1)
  1297. ClearTxIrq(pAC, 0, TX_PRIO_LOW);
  1298. #endif
  1299. SK_IN32(pAC->IoBase, B0_ISRC, &IntSrc);
  1300. } /* while (IntSrc & IRQ_MASK != 0) */
  1301. if ((IntSrc & SPECIAL_IRQS) || pAC->CheckQueue) {
  1302. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC,
  1303. ("SPECIAL IRQn"));
  1304. pAC->CheckQueue = SK_FALSE;
  1305. spin_lock(&pAC->SlowPathLock);
  1306. if (IntSrc & SPECIAL_IRQS)
  1307. SkGeSirqIsr(pAC, pAC->IoBase, IntSrc);
  1308. SkEventDispatcher(pAC, pAC->IoBase);
  1309. spin_unlock(&pAC->SlowPathLock);
  1310. }
  1311. /*
  1312.  * do it all again is case we cleared an interrupt that 
  1313.  * came in after handling the ring (OUTs may be delayed
  1314.  * in hardware buffers, but are through after IN)
  1315.  */
  1316. ReceiveIrq(pAC, &pAC->RxPort[0]);
  1317. #if 0
  1318. // #ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */
  1319. spin_lock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock);
  1320. FreeTxDescriptors(pAC, &pAC->TxPort[0][TX_PRIO_LOW]);
  1321. spin_unlock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock);
  1322. #if 0 /* only if sync. queues used */
  1323. spin_lock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock);
  1324. FreeTxDescriptors(pAC, 0, TX_PRIO_HIGH);
  1325. spin_unlock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock);
  1326. #endif /* 0 */
  1327. #endif /* USE_TX_COMPLETE */
  1328. /* IRQ is processed - Enable IRQs again*/
  1329. SK_OUT32(pAC->IoBase, B0_IMSK, IRQ_MASK);
  1330. return;
  1331. } /* SkGeIsrOnePort */
  1332. /****************************************************************************
  1333.  *
  1334.  * SkGeOpen - handle start of initialized adapter
  1335.  *
  1336.  * Description:
  1337.  * This function starts the initialized adapter.
  1338.  * The board level variable is set and the adapter is
  1339.  * brought to full functionality.
  1340.  * The device flags are set for operation.
  1341.  * Do all necessary level 2 initialization, enable interrupts and
  1342.  * give start command to RLMT.
  1343.  *
  1344.  * Returns:
  1345.  * 0 on success
  1346.  * != 0 on error
  1347.  */
  1348. static int SkGeOpen(
  1349. struct net_device *dev)
  1350. {
  1351. DEV_NET *pNet;
  1352. SK_AC *pAC;
  1353. unsigned long Flags; /* for spin lock */
  1354. int i;
  1355. SK_EVPARA EvPara; /* an event parameter union */
  1356. pNet = (DEV_NET*) dev->priv;
  1357. pAC = pNet->pAC;
  1358. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  1359. ("SkGeOpen: pAC=0x%lX:n", (unsigned long)pAC));
  1360. if (pAC->BoardLevel == 0) {
  1361. /* level 1 init common modules here */
  1362. if (SkGeInit(pAC, pAC->IoBase, 1) != 0) {
  1363. printk("%s: HWInit(1) failedn", pAC->dev[pNet->PortNr]->name);
  1364. return (-1);
  1365. }
  1366. SkI2cInit (pAC, pAC->IoBase, 1);
  1367. SkEventInit (pAC, pAC->IoBase, 1);
  1368. SkPnmiInit (pAC, pAC->IoBase, 1);
  1369. SkAddrInit (pAC, pAC->IoBase, 1);
  1370. SkRlmtInit (pAC, pAC->IoBase, 1);
  1371. SkTimerInit (pAC, pAC->IoBase, 1);
  1372. pAC->BoardLevel = 1;
  1373. }
  1374. if (pAC->BoardLevel != 2) {
  1375. /* level 2 init modules here */
  1376. SkGeInit (pAC, pAC->IoBase, 2);
  1377. SkI2cInit (pAC, pAC->IoBase, 2);
  1378. SkEventInit (pAC, pAC->IoBase, 2);
  1379. SkPnmiInit (pAC, pAC->IoBase, 2);
  1380. SkAddrInit (pAC, pAC->IoBase, 2);
  1381. SkRlmtInit (pAC, pAC->IoBase, 2);
  1382. SkTimerInit (pAC, pAC->IoBase, 2);
  1383. pAC->BoardLevel = 2;
  1384. }
  1385. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  1386. /* Enable transmit descriptor polling. */
  1387. SkGePollTxD(pAC, pAC->IoBase, i, SK_TRUE);
  1388. FillRxRing(pAC, &pAC->RxPort[i]);
  1389. }
  1390. SkGeYellowLED(pAC, pAC->IoBase, 1);
  1391. #ifdef USE_INT_MOD
  1392. /* moderate only TX complete interrupts (these are not time critical) */
  1393. #define IRQ_MOD_MASK (IRQ_EOF_AS_TX1 | IRQ_EOF_AS_TX2)
  1394. {
  1395. unsigned long ModBase;
  1396. ModBase = 53125000 / INTS_PER_SEC;
  1397. SK_OUT32(pAC->IoBase, B2_IRQM_INI, ModBase);
  1398. SK_OUT32(pAC->IoBase, B2_IRQM_MSK, IRQ_MOD_MASK);
  1399. SK_OUT32(pAC->IoBase, B2_IRQM_CTRL, TIM_START);
  1400. }
  1401. #endif
  1402. /* enable Interrupts */
  1403. SK_OUT32(pAC->IoBase, B0_IMSK, IRQ_MASK);
  1404. SK_OUT32(pAC->IoBase, B0_HWE_IMSK, IRQ_HWE_MASK);
  1405. spin_lock_irqsave(&pAC->SlowPathLock, Flags);
  1406. if ((pAC->RlmtMode != 0) && (pAC->MaxPorts == 0)) {
  1407. EvPara.Para32[0] = pAC->RlmtNets;
  1408. EvPara.Para32[1] = -1;
  1409. SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_SET_NETS,
  1410. EvPara);
  1411. EvPara.Para32[0] = pAC->RlmtMode;
  1412. EvPara.Para32[1] = 0;
  1413. SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_MODE_CHANGE,
  1414. EvPara);
  1415. }
  1416. EvPara.Para32[0] = pNet->NetNr;
  1417. EvPara.Para32[1] = -1;
  1418. SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara);
  1419. SkEventDispatcher(pAC, pAC->IoBase);
  1420. spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
  1421. pAC->MaxPorts++;
  1422. pNet->Up = 1;
  1423. MOD_INC_USE_COUNT;
  1424. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  1425. ("SkGeOpen suceededn"));
  1426. return (0);
  1427. } /* SkGeOpen */
  1428. /****************************************************************************
  1429.  *
  1430.  * SkGeClose - Stop initialized adapter
  1431.  *
  1432.  * Description:
  1433.  * Close initialized adapter.
  1434.  *
  1435.  * Returns:
  1436.  * 0 - on success
  1437.  * error code - on error
  1438.  */
  1439. static int SkGeClose(
  1440. struct net_device *dev)
  1441. {
  1442. DEV_NET *pNet;
  1443. SK_AC *pAC;
  1444. unsigned long Flags; /* for spin lock */
  1445. int i;
  1446. int PortIdx;
  1447. SK_EVPARA EvPara;
  1448. netif_stop_queue(dev);
  1449. pNet = (DEV_NET*) dev->priv;
  1450. pAC = pNet->pAC;
  1451. if (pAC->RlmtNets == 1)
  1452. PortIdx = pAC->ActivePort;
  1453. else
  1454. PortIdx = pNet->NetNr;
  1455. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  1456. ("SkGeClose: pAC=0x%lX ", (unsigned long)pAC));
  1457. /* 
  1458.  * Clear multicast table, promiscuous mode ....
  1459.  */
  1460.  
  1461. SkAddrMcClear(pAC, pAC->IoBase, PortIdx, 0);
  1462. SkAddrPromiscuousChange(pAC, pAC->IoBase, PortIdx,
  1463. SK_PROM_MODE_NONE);
  1464. if (pAC->MaxPorts == 1) {
  1465. spin_lock_irqsave(&pAC->SlowPathLock, Flags);
  1466. /* disable interrupts */
  1467. SK_OUT32(pAC->IoBase, B0_IMSK, 0);
  1468. EvPara.Para32[0] = pNet->NetNr;
  1469. EvPara.Para32[1] = -1;
  1470. SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);
  1471. SkEventDispatcher(pAC, pAC->IoBase);
  1472. SK_OUT32(pAC->IoBase, B0_IMSK, 0);
  1473. /* stop the hardware */
  1474. SkGeDeInit(pAC, pAC->IoBase);
  1475. pAC->BoardLevel = 0;
  1476. spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
  1477. } else {
  1478. spin_lock_irqsave(&pAC->SlowPathLock, Flags);
  1479. EvPara.Para32[0] = pNet->NetNr;
  1480. EvPara.Para32[1] = -1;
  1481. SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);
  1482. SkEventDispatcher(pAC, pAC->IoBase);
  1483. spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
  1484. /* Stop port */
  1485. spin_lock_irqsave(&pAC->TxPort[pNet->PortNr]
  1486. [TX_PRIO_LOW].TxDesRingLock, Flags);
  1487. SkGeStopPort(pAC, pAC->IoBase, pNet->PortNr, 
  1488. SK_STOP_ALL, SK_HARD_RST);
  1489. spin_unlock_irqrestore(&pAC->TxPort[pNet->PortNr]
  1490. [TX_PRIO_LOW].TxDesRingLock, Flags);
  1491. }
  1492. if (pAC->RlmtNets == 1) {
  1493. /* clear all descriptor rings */
  1494. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  1495. ReceiveIrq(pAC, &pAC->RxPort[i]);
  1496. ClearRxRing(pAC, &pAC->RxPort[i]);
  1497. ClearTxRing(pAC, &pAC->TxPort[i][TX_PRIO_LOW]);
  1498. }
  1499. } else {
  1500. /* clear port descriptor rings */
  1501. ReceiveIrq(pAC, &pAC->RxPort[pNet->PortNr]);
  1502. ClearRxRing(pAC, &pAC->RxPort[pNet->PortNr]);
  1503. ClearTxRing(pAC, &pAC->TxPort[pNet->PortNr][TX_PRIO_LOW]);
  1504. }
  1505. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  1506. ("SkGeClose: done "));
  1507. pAC->MaxPorts--;
  1508. pNet->Up = 0;
  1509. MOD_DEC_USE_COUNT;
  1510. return (0);
  1511. } /* SkGeClose */
  1512. /*****************************************************************************
  1513.  *
  1514.  *  SkGeXmit - Linux frame transmit function
  1515.  *
  1516.  * Description:
  1517.  * The system calls this function to send frames onto the wire.
  1518.  * It puts the frame in the tx descriptor ring. If the ring is
  1519.  * full then, the 'tbusy' flag is set.
  1520.  *
  1521.  * Returns:
  1522.  * 0, if everything is ok
  1523.  * !=0, on error
  1524.  * WARNING: returning 1 in 'tbusy' case caused system crashes (double
  1525.  * allocated skb's) !!!
  1526.  */
  1527. static int SkGeXmit(struct sk_buff *skb, struct net_device *dev)
  1528. {
  1529. DEV_NET *pNet;
  1530. SK_AC *pAC;
  1531. int Rc; /* return code of XmitFrame */
  1532. pNet = (DEV_NET*) dev->priv;
  1533. pAC = pNet->pAC;
  1534. if (pAC->RlmtNets == 2)
  1535. Rc = XmitFrame(pAC, &pAC->TxPort[pNet->PortNr][TX_PRIO_LOW], skb);
  1536. else
  1537. Rc = XmitFrame(pAC, &pAC->TxPort[pAC->ActivePort][TX_PRIO_LOW], skb);
  1538. /* Transmitter out of resources? */
  1539. if (Rc <= 0)
  1540. netif_stop_queue(dev);
  1541. /* If not taken, give buffer ownership back to the
  1542.  * queueing layer.
  1543.  */
  1544. if (Rc < 0)
  1545. return (1);
  1546. dev->trans_start = jiffies;
  1547. return (0);
  1548. } /* SkGeXmit */
  1549. /*****************************************************************************
  1550.  *
  1551.  *  XmitFrame - fill one socket buffer into the transmit ring
  1552.  *
  1553.  * Description:
  1554.  * This function puts a message into the transmit descriptor ring
  1555.  * if there is a descriptors left.
  1556.  * Linux skb's consist of only one continuous buffer.
  1557.  * The first step locks the ring. It is held locked
  1558.  * all time to avoid problems with SWITCH_../PORT_RESET.
  1559.  * Then the descriptoris allocated.
  1560.  * The second part is linking the buffer to the descriptor.
  1561.  * At the very last, the Control field of the descriptor
  1562.  * is made valid for the BMU and a start TX command is given
  1563.  * if necessary.
  1564.  *
  1565.  * Returns:
  1566.  *  > 0 - on succes: the number of bytes in the message
  1567.  *  = 0 - on resource shortage: this frame sent or dropped, now
  1568.  *        the ring is full ( -> set tbusy)
  1569.  *  < 0 - on failure: other problems ( -> return failure to upper layers)
  1570.  */
  1571. static int XmitFrame(
  1572. SK_AC  *pAC, /* pointer to adapter context */
  1573. TX_PORT *pTxPort, /* pointer to struct of port to send to */
  1574. struct sk_buff *pMessage) /* pointer to send-message */
  1575. {
  1576. TXD *pTxd; /* the rxd to fill */
  1577. unsigned long Flags;
  1578. SK_U64 PhysAddr;
  1579. int BytesSend;
  1580. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
  1581. ("X"));
  1582. spin_lock_irqsave(&pTxPort->TxDesRingLock, Flags);
  1583. if (pTxPort->TxdRingFree == 0) {
  1584. /* no enough free descriptors in ring at the moment */
  1585. FreeTxDescriptors(pAC, pTxPort);
  1586. if (pTxPort->TxdRingFree == 0) {
  1587. spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags);
  1588. SK_PNMI_CNT_NO_TX_BUF(pAC, pTxPort->PortIndex);
  1589. SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
  1590. SK_DBGCAT_DRV_TX_PROGRESS,
  1591. ("XmitFrame failedn"));
  1592. /* this message can not be sent now */
  1593. return (-1);
  1594. }
  1595. }
  1596. /* advance head counter behind descriptor needed for this frame */
  1597. pTxd = pTxPort->pTxdRingHead;
  1598. pTxPort->pTxdRingHead = pTxd->pNextTxd;
  1599. pTxPort->TxdRingFree--;
  1600. /* the needed descriptor is reserved now */
  1601. /* 
  1602.  * everything allocated ok, so add buffer to descriptor
  1603.  */
  1604. #ifdef SK_DUMP_TX
  1605. DumpMsg(pMessage, "XmitFrame");
  1606. #endif
  1607. /* set up descriptor and CONTROL dword */
  1608. PhysAddr = (SK_U64) pci_map_page(&pAC->PciDev,
  1609.  virt_to_page(pMessage->data),
  1610.  ((unsigned long) pMessage->data &
  1611.   ~PAGE_MASK),
  1612.  pMessage->len,
  1613.  PCI_DMA_TODEVICE);
  1614. pTxd->VDataLow = (SK_U32)  (PhysAddr & 0xffffffff);
  1615. pTxd->VDataHigh = (SK_U32) (PhysAddr >> 32);
  1616. pTxd->pMBuf = pMessage;
  1617. pTxd->TBControl = TX_CTRL_OWN_BMU | TX_CTRL_STF |
  1618. TX_CTRL_CHECK_DEFAULT | TX_CTRL_SOFTWARE |
  1619. #ifdef USE_TX_COMPLETE
  1620. TX_CTRL_EOF | TX_CTRL_EOF_IRQ | pMessage->len;
  1621. #else
  1622. TX_CTRL_EOF | pMessage->len;
  1623. #endif
  1624. if ((pTxPort->pTxdRingPrev->TBControl & TX_CTRL_OWN_BMU) == 0) {
  1625. /* previous descriptor already done, so give tx start cmd */
  1626. /* StartTx(pAC, pTxPort->HwAddr); */
  1627. SK_OUT8(pTxPort->HwAddr, TX_Q_CTRL, TX_Q_CTRL_START);
  1628. }
  1629. pTxPort->pTxdRingPrev = pTxd;
  1630. BytesSend = pMessage->len;
  1631. /* after releasing the lock, the skb may be immidiately freed */
  1632. if (pTxPort->TxdRingFree != 0) {
  1633. spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags);
  1634. return (BytesSend);
  1635. }
  1636. else {
  1637. /* ring full: set tbusy on return */
  1638. spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags);
  1639. return (0);
  1640. }
  1641. } /* XmitFrame */
  1642. /*****************************************************************************
  1643.  *
  1644.  *  FreeTxDescriptors - release descriptors from the descriptor ring
  1645.  *
  1646.  * Description:
  1647.  * This function releases descriptors from a transmit ring if they
  1648.  * have been sent by the BMU.
  1649.  * If a descriptors is sent, it can be freed and the message can
  1650.  * be freed, too.
  1651.  * The SOFTWARE controllable bit is used to prevent running around a
  1652.  * completely free ring for ever. If this bit is no set in the
  1653.  * frame (by XmitFrame), this frame has never been sent or is
  1654.  * already freed.
  1655.  * The Tx descriptor ring lock must be held while calling this function !!!
  1656.  *
  1657.  * Returns:
  1658.  * none
  1659.  */
  1660. static void FreeTxDescriptors(
  1661. SK_AC *pAC, /* pointer to the adapter context */
  1662. TX_PORT *pTxPort) /* pointer to destination port structure */
  1663. {
  1664. TXD *pTxd; /* pointer to the checked descriptor */
  1665. TXD *pNewTail; /* pointer to 'end' of the ring */
  1666. SK_U32 Control; /* TBControl field of descriptor */
  1667. SK_U64 PhysAddr; /* address of DMA mapping */
  1668. pNewTail = pTxPort->pTxdRingTail;
  1669. pTxd = pNewTail;
  1670. /* 
  1671.  * loop forever; exits if TX_CTRL_SOFTWARE bit not set in start frame
  1672.  * or TX_CTRL_OWN_BMU bit set in any frame
  1673.  */
  1674. while (1) {
  1675. Control = pTxd->TBControl;
  1676. if ((Control & TX_CTRL_SOFTWARE) == 0) {
  1677. /* 
  1678.  * software controllable bit is set in first
  1679.  * fragment when given to BMU. Not set means that
  1680.  * this fragment was never sent or is already 
  1681.  * freed ( -> ring completely free now).
  1682.  */
  1683. pTxPort->pTxdRingTail = pTxd;
  1684. netif_start_queue(pAC->dev[pTxPort->PortIndex]);
  1685. return;
  1686. }
  1687. if (Control & TX_CTRL_OWN_BMU) {
  1688. pTxPort->pTxdRingTail = pTxd;
  1689. if (pTxPort->TxdRingFree > 0) {
  1690. netif_start_queue(pAC->dev[pTxPort->PortIndex]);
  1691. }
  1692. return;
  1693. }
  1694. /* release the DMA mapping */
  1695. PhysAddr = ((SK_U64) pTxd->VDataHigh) << (SK_U64) 32;
  1696. PhysAddr |= (SK_U64) pTxd->VDataLow;
  1697. pci_unmap_page(&pAC->PciDev, PhysAddr,
  1698.        pTxd->pMBuf->len,
  1699.        PCI_DMA_TODEVICE);
  1700. /* free message */
  1701. DEV_KFREE_SKB_ANY(pTxd->pMBuf);
  1702. pTxPort->TxdRingFree++;
  1703. pTxd->TBControl &= ~TX_CTRL_SOFTWARE;
  1704. pTxd = pTxd->pNextTxd; /* point behind fragment with EOF */
  1705. } /* while(forever) */
  1706. } /* FreeTxDescriptors */
  1707. /*****************************************************************************
  1708.  *
  1709.  *  FillRxRing - fill the receive ring with valid descriptors
  1710.  *
  1711.  * Description:
  1712.  * This function fills the receive ring descriptors with data
  1713.  * segments and makes them valid for the BMU.
  1714.  * The active ring is filled completely, if possible.
  1715.  * The non-active ring is filled only partial to save memory.
  1716.  *
  1717.  * Description of rx ring structure:
  1718.  * head - points to the descriptor which will be used next by the BMU
  1719.  * tail - points to the next descriptor to give to the BMU
  1720.  *
  1721.  * Returns: N/A
  1722.  */
  1723. static void FillRxRing(
  1724. SK_AC *pAC, /* pointer to the adapter context */
  1725. RX_PORT *pRxPort) /* ptr to port struct for which the ring
  1726.    should be filled */
  1727. {
  1728. unsigned long Flags;
  1729. spin_lock_irqsave(&pRxPort->RxDesRingLock, Flags);
  1730. while (pRxPort->RxdRingFree > pRxPort->RxFillLimit) {
  1731. if(!FillRxDescriptor(pAC, pRxPort))
  1732. break;
  1733. }
  1734. spin_unlock_irqrestore(&pRxPort->RxDesRingLock, Flags);
  1735. } /* FillRxRing */
  1736. /*****************************************************************************
  1737.  *
  1738.  *  FillRxDescriptor - fill one buffer into the receive ring
  1739.  *
  1740.  * Description:
  1741.  * The function allocates a new receive buffer and
  1742.  * puts it into the next descriptor.
  1743.  *
  1744.  * Returns:
  1745.  * SK_TRUE - a buffer was added to the ring
  1746.  * SK_FALSE - a buffer could not be added
  1747.  */
  1748. static SK_BOOL FillRxDescriptor(
  1749. SK_AC *pAC, /* pointer to the adapter context struct */
  1750. RX_PORT *pRxPort) /* ptr to port struct of ring to fill */
  1751. {
  1752. struct sk_buff *pMsgBlock; /* pointer to a new message block */
  1753. RXD *pRxd; /* the rxd to fill */
  1754. SK_U16 Length; /* data fragment length */
  1755. SK_U64 PhysAddr; /* physical address of a rx buffer */
  1756. pMsgBlock = alloc_skb(pAC->RxBufSize, GFP_ATOMIC);
  1757. if (pMsgBlock == NULL) {
  1758. SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
  1759. SK_DBGCAT_DRV_ENTRY,
  1760. ("%s: Allocation of rx buffer failed !n",
  1761. pAC->dev[pRxPort->PortIndex]->name));
  1762. SK_PNMI_CNT_NO_RX_BUF(pAC, pRxPort->PortIndex);
  1763. return(SK_FALSE);
  1764. }
  1765. skb_reserve(pMsgBlock, 2); /* to align IP frames */
  1766. /* skb allocated ok, so add buffer */
  1767. pRxd = pRxPort->pRxdRingTail;
  1768. pRxPort->pRxdRingTail = pRxd->pNextRxd;
  1769. pRxPort->RxdRingFree--;
  1770. Length = pAC->RxBufSize;
  1771. PhysAddr = (SK_U64) pci_map_page(&pAC->PciDev,
  1772.  virt_to_page(pMsgBlock->data),
  1773.  ((unsigned long) pMsgBlock->data &
  1774.   ~PAGE_MASK),
  1775.  pAC->RxBufSize - 2,
  1776.  PCI_DMA_FROMDEVICE);
  1777. pRxd->VDataLow = (SK_U32) (PhysAddr & 0xffffffff);
  1778. pRxd->VDataHigh = (SK_U32) (PhysAddr >> 32);
  1779. pRxd->pMBuf = pMsgBlock;
  1780. pRxd->RBControl = RX_CTRL_OWN_BMU | RX_CTRL_STF |
  1781. RX_CTRL_EOF_IRQ | RX_CTRL_CHECK_CSUM | Length;
  1782. return (SK_TRUE);
  1783. } /* FillRxDescriptor */
  1784. /*****************************************************************************
  1785.  *
  1786.  *  ReQueueRxBuffer - fill one buffer back into the receive ring
  1787.  *
  1788.  * Description:
  1789.  * Fill a given buffer back into the rx ring. The buffer
  1790.  * has been previously allocated and aligned, and its phys.
  1791.  * address calculated, so this is no more necessary.
  1792.  *
  1793.  * Returns: N/A
  1794.  */
  1795. static void ReQueueRxBuffer(
  1796. SK_AC *pAC, /* pointer to the adapter context struct */
  1797. RX_PORT *pRxPort, /* ptr to port struct of ring to fill */
  1798. struct sk_buff *pMsg, /* pointer to the buffer */
  1799. SK_U32 PhysHigh, /* phys address high dword */
  1800. SK_U32 PhysLow) /* phys address low dword */
  1801. {
  1802. RXD *pRxd; /* the rxd to fill */
  1803. SK_U16 Length; /* data fragment length */
  1804. pRxd = pRxPort->pRxdRingTail;
  1805. pRxPort->pRxdRingTail = pRxd->pNextRxd;
  1806. pRxPort->RxdRingFree--;
  1807. Length = pAC->RxBufSize;
  1808. pRxd->VDataLow = PhysLow;
  1809. pRxd->VDataHigh = PhysHigh;
  1810. pRxd->pMBuf = pMsg;
  1811. pRxd->RBControl = RX_CTRL_OWN_BMU | RX_CTRL_STF |
  1812. RX_CTRL_EOF_IRQ | RX_CTRL_CHECK_CSUM | Length;
  1813. return;
  1814. } /* ReQueueRxBuffer */
  1815. /*****************************************************************************
  1816.  *
  1817.  *  ReceiveIrq - handle a receive IRQ
  1818.  *
  1819.  * Description:
  1820.  * This function is called when a receive IRQ is set.
  1821.  * It walks the receive descriptor ring and sends up all
  1822.  * frames that are complete.
  1823.  *
  1824.  * Returns: N/A
  1825.  */
  1826. static void ReceiveIrq(
  1827. SK_AC *pAC, /* pointer to adapter context */
  1828. RX_PORT *pRxPort) /* pointer to receive port struct */
  1829. {
  1830. RXD *pRxd; /* pointer to receive descriptors */
  1831. SK_U32 Control; /* control field of descriptor */
  1832. struct sk_buff *pMsg; /* pointer to message holding frame */
  1833. struct sk_buff *pNewMsg; /* pointer to a new message for copying frame */
  1834. int FrameLength; /* total length of received frame */
  1835. SK_MBUF *pRlmtMbuf; /* ptr to a buffer for giving a frame to rlmt */
  1836. SK_EVPARA EvPara; /* an event parameter union */
  1837. int PortIndex = pRxPort->PortIndex;
  1838. unsigned int Offset;
  1839. unsigned int NumBytes;
  1840. unsigned int ForRlmt;
  1841. SK_BOOL IsBc;
  1842. SK_BOOL IsMc;
  1843. SK_U32 FrameStat;
  1844. unsigned short Csum1;
  1845. unsigned short Csum2;
  1846. unsigned short Type;
  1847. int Result;
  1848. SK_U64 PhysAddr;
  1849. rx_start:
  1850. /* do forever; exit if RX_CTRL_OWN_BMU found */
  1851. for ( pRxd = pRxPort->pRxdRingHead ;
  1852.   pRxPort->RxdRingFree < pAC->RxDescrPerRing ;
  1853.   pRxd = pRxd->pNextRxd,
  1854.   pRxPort->pRxdRingHead = pRxd,
  1855.   pRxPort->RxdRingFree ++) {
  1856. /*
  1857.  * For a better understanding of this loop 
  1858.  * Go through every descriptor beginning at the head 
  1859.  * Please note: the ring might be completely received so the OWN bit
  1860.  * set is not a good crirteria to leave that loop.
  1861.  * Therefore the RingFree counter is used.
  1862.  * On entry of this loop pRxd is a pointer to the Rxd that needs
  1863.  * to be checked next.
  1864.  */
  1865. Control = pRxd->RBControl;
  1866. /* check if this descriptor is ready */
  1867. if ((Control & RX_CTRL_OWN_BMU) != 0) {
  1868. /* this descriptor is not yet ready */
  1869. /* This is the usual end of the loop */
  1870. /* We don't need to start the ring again */
  1871. FillRxRing(pAC, pRxPort);
  1872. return;
  1873. }
  1874. /* get length of frame and check it */
  1875. FrameLength = Control & RX_CTRL_LEN_MASK;
  1876. if (FrameLength > pAC->RxBufSize) {
  1877. goto rx_failed;
  1878. }
  1879. /* check for STF and EOF */
  1880. if ((Control & (RX_CTRL_STF | RX_CTRL_EOF)) !=
  1881. (RX_CTRL_STF | RX_CTRL_EOF)) {
  1882. goto rx_failed;
  1883. }
  1884. /* here we have a complete frame in the ring */
  1885. pMsg = pRxd->pMBuf;
  1886. FrameStat = pRxd->FrameStat;
  1887. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 0,
  1888. ("Received frame of length %d on port %dn",
  1889. FrameLength, PortIndex));
  1890. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 0,
  1891. ("Number of free rx descriptors: %dn",
  1892. pRxPort->RxdRingFree));
  1893. /*DumpMsg(pMsg, "Rx"); */
  1894. if ((Control & RX_CTRL_STAT_VALID) != RX_CTRL_STAT_VALID ||
  1895. (FrameStat & (XMR_FS_ANY_ERR | XMR_FS_2L_VLAN)) != 0) {
  1896. /* there is a receive error in this frame */
  1897. SK_DBG_MSG(NULL, SK_DBGMOD_DRV,
  1898. SK_DBGCAT_DRV_RX_PROGRESS,
  1899. ("skge: Error in received frame, dropped!n"
  1900. "Control: %xnRxStat: %xn",
  1901. Control, FrameStat));
  1902. PhysAddr = ((SK_U64) pRxd->VDataHigh) << (SK_U64)32;
  1903. PhysAddr |= (SK_U64) pRxd->VDataLow;
  1904. pci_dma_sync_single(&pAC->PciDev,
  1905.     (dma_addr_t) PhysAddr,
  1906.     FrameLength,
  1907.     PCI_DMA_FROMDEVICE);
  1908. ReQueueRxBuffer(pAC, pRxPort, pMsg,
  1909. pRxd->VDataHigh, pRxd->VDataLow);
  1910. continue;
  1911. }
  1912. /*
  1913.  * if short frame then copy data to reduce memory waste
  1914.  */
  1915. if ((FrameLength < SK_COPY_THRESHOLD) &&
  1916. ((pNewMsg = alloc_skb(FrameLength+2, GFP_ATOMIC)) != NULL)) {
  1917. /*
  1918.  * Short frame detected and allocation successfull
  1919.  */
  1920. PhysAddr = ((SK_U64) pRxd->VDataHigh) << (SK_U64)32;
  1921. PhysAddr |= (SK_U64) pRxd->VDataLow;
  1922. /* use new skb and copy data */
  1923. skb_reserve(pNewMsg, 2);
  1924. skb_put(pNewMsg, FrameLength);
  1925. pci_dma_sync_single(&pAC->PciDev,
  1926.     (dma_addr_t) PhysAddr,
  1927.     FrameLength,
  1928.     PCI_DMA_FROMDEVICE);
  1929. eth_copy_and_sum(pNewMsg, pMsg->data,
  1930. FrameLength, 0);
  1931. ReQueueRxBuffer(pAC, pRxPort, pMsg,
  1932. pRxd->VDataHigh, pRxd->VDataLow);
  1933. pMsg = pNewMsg;
  1934. }
  1935. else {
  1936. /*
  1937.  * if large frame, or SKB allocation failed, pass
  1938.  * the SKB directly to the networking
  1939.  */
  1940. PhysAddr = ((SK_U64) pRxd->VDataHigh) << (SK_U64)32;
  1941. PhysAddr |= (SK_U64) pRxd->VDataLow;
  1942. /* release the DMA mapping */
  1943. pci_unmap_page(&pAC->PciDev,
  1944.        PhysAddr,
  1945.        pAC->RxBufSize - 2,
  1946.        PCI_DMA_FROMDEVICE);
  1947. /* set length in message */
  1948. skb_put(pMsg, FrameLength);
  1949. /* hardware checksum */
  1950. Type = ntohs(*((short*)&pMsg->data[12]));
  1951. if (Type == 0x800) {
  1952. Csum1=le16_to_cpu(pRxd->TcpSums & 0xffff);
  1953. Csum2=le16_to_cpu((pRxd->TcpSums >> 16) & 0xffff);
  1954. if ((Csum1 & 0xfffe) && (Csum2 & 0xfffe)) {
  1955. Result = SkCsGetReceiveInfo(pAC,
  1956. &pMsg->data[14], 
  1957. Csum1, Csum2, pRxPort->PortIndex);
  1958. if (Result == 
  1959. SKCS_STATUS_IP_FRAGMENT ||
  1960. Result ==
  1961. SKCS_STATUS_IP_CSUM_OK ||
  1962. Result ==
  1963. SKCS_STATUS_TCP_CSUM_OK ||
  1964. Result ==
  1965. SKCS_STATUS_UDP_CSUM_OK) {
  1966. pMsg->ip_summed =
  1967. CHECKSUM_UNNECESSARY;
  1968. }
  1969. } /* checksum calculation valid */
  1970. } /* IP frame */
  1971. } /* frame > SK_COPY_TRESHOLD */
  1972. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("V"));
  1973. ForRlmt = SK_RLMT_RX_PROTOCOL;
  1974. IsBc = (FrameStat & XMR_FS_BC)==XMR_FS_BC;
  1975. SK_RLMT_PRE_LOOKAHEAD(pAC, PortIndex, FrameLength,
  1976. IsBc, &Offset, &NumBytes);
  1977. if (NumBytes != 0) {
  1978. IsMc = (FrameStat & XMR_FS_MC)==XMR_FS_MC;
  1979. SK_RLMT_LOOKAHEAD(pAC, PortIndex, 
  1980. &pMsg->data[Offset],
  1981. IsBc, IsMc, &ForRlmt);
  1982. }
  1983. if (ForRlmt == SK_RLMT_RX_PROTOCOL) {
  1984. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("W"));
  1985. /* send up only frames from active port */
  1986. if ((PortIndex == pAC->ActivePort) ||
  1987. (pAC->RlmtNets == 2)) {
  1988. /* frame for upper layer */
  1989. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("U"));
  1990. #ifdef xDEBUG
  1991. DumpMsg(pMsg, "Rx");
  1992. #endif
  1993. SK_PNMI_CNT_RX_OCTETS_DELIVERED(pAC,
  1994. FrameLength, pRxPort->PortIndex);
  1995. pMsg->dev = pAC->dev[pRxPort->PortIndex];
  1996. pMsg->protocol = eth_type_trans(pMsg,
  1997. pAC->dev[pRxPort->PortIndex]);
  1998. netif_rx(pMsg);
  1999. pAC->dev[pRxPort->PortIndex]->last_rx = jiffies;
  2000. }
  2001. else {
  2002. /* drop frame */
  2003. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 
  2004. SK_DBGCAT_DRV_RX_PROGRESS,
  2005. ("D"));
  2006. DEV_KFREE_SKB(pMsg);
  2007. }
  2008. } /* if not for rlmt */
  2009. else {
  2010. /* packet for rlmt */
  2011. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 
  2012. SK_DBGCAT_DRV_RX_PROGRESS, ("R"));
  2013. pRlmtMbuf = SkDrvAllocRlmtMbuf(pAC,
  2014. pAC->IoBase, FrameLength);
  2015. if (pRlmtMbuf != NULL) {
  2016. pRlmtMbuf->pNext = NULL;
  2017. pRlmtMbuf->Length = FrameLength;
  2018. pRlmtMbuf->PortIdx = PortIndex;
  2019. EvPara.pParaPtr = pRlmtMbuf;
  2020. memcpy((char*)(pRlmtMbuf->pData),
  2021.    (char*)(pMsg->data),
  2022.    FrameLength);
  2023. SkEventQueue(pAC, SKGE_RLMT,
  2024. SK_RLMT_PACKET_RECEIVED,
  2025. EvPara);
  2026. pAC->CheckQueue = SK_TRUE;
  2027. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 
  2028. SK_DBGCAT_DRV_RX_PROGRESS,
  2029. ("Q"));
  2030. }
  2031. if ((pAC->dev[pRxPort->PortIndex]->flags & 
  2032. (IFF_PROMISC | IFF_ALLMULTI)) != 0 ||
  2033. (ForRlmt & SK_RLMT_RX_PROTOCOL) == 
  2034. SK_RLMT_RX_PROTOCOL) { 
  2035. pMsg->dev = pAC->dev[pRxPort->PortIndex];
  2036. pMsg->protocol = eth_type_trans(pMsg,
  2037. pAC->dev[pRxPort->PortIndex]);
  2038. netif_rx(pMsg);
  2039. pAC->dev[pRxPort->PortIndex]->last_rx = jiffies;
  2040. }
  2041. else {
  2042. DEV_KFREE_SKB(pMsg);
  2043. }
  2044. } /* if packet for rlmt */
  2045. } /* for ... scanning the RXD ring */
  2046. /* RXD ring is empty -> fill and restart */
  2047. FillRxRing(pAC, pRxPort);
  2048. /* do not start if called from Close */
  2049. if (pAC->BoardLevel > 0) {
  2050. ClearAndStartRx(pAC, PortIndex);
  2051. }
  2052. return;
  2053. rx_failed:
  2054. /* remove error frame */
  2055. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ERROR,
  2056. ("Schrottdescriptor, length: 0x%xn", FrameLength));
  2057. /* release the DMA mapping */
  2058. PhysAddr = ((SK_U64) pRxd->VDataHigh) << (SK_U64)32;
  2059. PhysAddr |= (SK_U64) pRxd->VDataLow;
  2060. pci_unmap_page(&pAC->PciDev,
  2061.        PhysAddr,
  2062.        pAC->RxBufSize - 2,
  2063.        PCI_DMA_FROMDEVICE);
  2064. DEV_KFREE_SKB_IRQ(pRxd->pMBuf);
  2065. pRxd->pMBuf = NULL;
  2066. pRxPort->RxdRingFree++;
  2067. pRxPort->pRxdRingHead = pRxd->pNextRxd;
  2068. goto rx_start;
  2069. } /* ReceiveIrq */
  2070. /*****************************************************************************
  2071.  *
  2072.  *  ClearAndStartRx - give a start receive command to BMU, clear IRQ
  2073.  *
  2074.  * Description:
  2075.  * This function sends a start command and a clear interrupt
  2076.  * command for one receive queue to the BMU.
  2077.  *
  2078.  * Returns: N/A
  2079.  * none
  2080.  */
  2081. static void ClearAndStartRx(
  2082. SK_AC *pAC, /* pointer to the adapter context */
  2083. int PortIndex) /* index of the receive port (XMAC) */
  2084. {
  2085. SK_OUT8(pAC->IoBase, RxQueueAddr[PortIndex]+RX_Q_CTRL,
  2086. RX_Q_CTRL_START | RX_Q_CTRL_CLR_I_EOF);
  2087. } /* ClearAndStartRx */
  2088. /*****************************************************************************
  2089.  *
  2090.  *  ClearTxIrq - give a clear transmit IRQ command to BMU
  2091.  *
  2092.  * Description:
  2093.  * This function sends a clear tx IRQ command for one
  2094.  * transmit queue to the BMU.
  2095.  *
  2096.  * Returns: N/A
  2097.  */
  2098. static void ClearTxIrq(
  2099. SK_AC *pAC, /* pointer to the adapter context */
  2100. int PortIndex, /* index of the transmit port (XMAC) */
  2101. int Prio) /* priority or normal queue */
  2102. {
  2103. SK_OUT8(pAC->IoBase, TxQueueAddr[PortIndex][Prio]+TX_Q_CTRL,
  2104. TX_Q_CTRL_CLR_I_EOF);
  2105. } /* ClearTxIrq */
  2106. /*****************************************************************************
  2107.  *
  2108.  *  ClearRxRing - remove all buffers from the receive ring
  2109.  *
  2110.  * Description:
  2111.  * This function removes all receive buffers from the ring.
  2112.  * The receive BMU must be stopped before calling this function.
  2113.  *
  2114.  * Returns: N/A
  2115.  */
  2116. static void ClearRxRing(
  2117. SK_AC *pAC, /* pointer to adapter context */
  2118. RX_PORT *pRxPort) /* pointer to rx port struct */
  2119. {
  2120. RXD *pRxd; /* pointer to the current descriptor */
  2121. unsigned long Flags;
  2122.  SK_U64 PhysAddr;
  2123. if (pRxPort->RxdRingFree == pAC->RxDescrPerRing) {
  2124. return;
  2125. }
  2126. spin_lock_irqsave(&pRxPort->RxDesRingLock, Flags);
  2127. pRxd = pRxPort->pRxdRingHead;
  2128. do {
  2129. if (pRxd->pMBuf != NULL) {
  2130. PhysAddr = ((SK_U64) pRxd->VDataHigh) << (SK_U64)32;
  2131. PhysAddr |= (SK_U64) pRxd->VDataLow;
  2132. pci_unmap_page(&pAC->PciDev,
  2133.        PhysAddr,
  2134.        pAC->RxBufSize - 2,
  2135.        PCI_DMA_FROMDEVICE);
  2136. DEV_KFREE_SKB(pRxd->pMBuf);
  2137. pRxd->pMBuf = NULL;
  2138. }
  2139. pRxd->RBControl &= RX_CTRL_OWN_BMU;
  2140. pRxd = pRxd->pNextRxd;
  2141. pRxPort->RxdRingFree++;
  2142. } while (pRxd != pRxPort->pRxdRingTail);
  2143. pRxPort->pRxdRingTail = pRxPort->pRxdRingHead;
  2144. spin_unlock_irqrestore(&pRxPort->RxDesRingLock, Flags);
  2145. } /* ClearRxRing */
  2146. /*****************************************************************************
  2147.  *
  2148.  * ClearTxRing - remove all buffers from the transmit ring
  2149.  *
  2150.  * Description:
  2151.  * This function removes all transmit buffers from the ring.
  2152.  * The transmit BMU must be stopped before calling this function
  2153.  * and transmitting at the upper level must be disabled.
  2154.  * The BMU own bit of all descriptors is cleared, the rest is
  2155.  * done by calling FreeTxDescriptors.
  2156.  *
  2157.  * Returns: N/A
  2158.  */
  2159. static void ClearTxRing(
  2160. SK_AC *pAC, /* pointer to adapter context */
  2161. TX_PORT *pTxPort) /* pointer to tx prt struct */
  2162. {
  2163. TXD *pTxd; /* pointer to the current descriptor */
  2164. int i;
  2165. unsigned long Flags;
  2166. spin_lock_irqsave(&pTxPort->TxDesRingLock, Flags);
  2167. pTxd = pTxPort->pTxdRingHead;
  2168. for (i=0; i<pAC->TxDescrPerRing; i++) {
  2169. pTxd->TBControl &= ~TX_CTRL_OWN_BMU;
  2170. pTxd = pTxd->pNextTxd;
  2171. }
  2172. FreeTxDescriptors(pAC, pTxPort);
  2173. spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags);
  2174. } /* ClearTxRing */
  2175. /*****************************************************************************
  2176.  *
  2177.  *  SetQueueSizes - configure the sizes of rx and tx queues
  2178.  *
  2179.  * Description:
  2180.  * This function assigns the sizes for active and passive port
  2181.  * to the appropriate HWinit structure variables.
  2182.  * The passive port(s) get standard values, all remaining RAM
  2183.  * is given to the active port.
  2184.  * The queue sizes are in kbyte and must be multiple of 8.
  2185.  * The limits for the number of buffers filled into the rx rings
  2186.  * is also set in this routine.
  2187.  *
  2188.  * Returns:
  2189.  * none
  2190.  */
  2191. static void SetQueueSizes(
  2192. SK_AC *pAC) /* pointer to the adapter context */
  2193. {
  2194. int StandbyRam; /* adapter RAM used for a standby port */
  2195. int RemainingRam; /* adapter RAM available for the active port */
  2196. int RxRam; /* RAM used for the active port receive queue */
  2197. int i; /* loop counter */
  2198. if (pAC->RlmtNets == 1) {
  2199. StandbyRam = SK_RLMT_STANDBY_QRXSIZE + SK_RLMT_STANDBY_QXASIZE +
  2200. SK_RLMT_STANDBY_QXSSIZE;
  2201. RemainingRam = pAC->GIni.GIRamSize - 
  2202. (pAC->GIni.GIMacsFound-1) * StandbyRam;
  2203. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  2204. pAC->GIni.GP[i].PRxQSize = SK_RLMT_STANDBY_QRXSIZE;
  2205. pAC->GIni.GP[i].PXSQSize = SK_RLMT_STANDBY_QXSSIZE;
  2206. pAC->GIni.GP[i].PXAQSize = SK_RLMT_STANDBY_QXASIZE;
  2207. }
  2208. RxRam = (RemainingRam * 8 / 10) & ~7;
  2209. pAC->GIni.GP[pAC->ActivePort].PRxQSize = RxRam;
  2210. pAC->GIni.GP[pAC->ActivePort].PXSQSize = 0;
  2211. pAC->GIni.GP[pAC->ActivePort].PXAQSize =
  2212. (RemainingRam - RxRam) & ~7;
  2213. pAC->RxQueueSize = RxRam;
  2214. pAC->TxSQueueSize = 0;
  2215. pAC->TxAQueueSize = (RemainingRam - RxRam) & ~7;
  2216. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  2217. ("queue sizes settings - rx:%d  txA:%d txS:%dn",
  2218. pAC->RxQueueSize,pAC->TxAQueueSize, pAC->TxSQueueSize));
  2219. } else {
  2220. RemainingRam = pAC->GIni.GIRamSize/pAC->GIni.GIMacsFound;
  2221. RxRam = (RemainingRam * 8 / 10) & ~7;
  2222. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  2223. pAC->GIni.GP[i].PRxQSize = RxRam;
  2224. pAC->GIni.GP[i].PXSQSize = 0;
  2225. pAC->GIni.GP[i].PXAQSize = (RemainingRam - RxRam) & ~7;
  2226. }
  2227. pAC->RxQueueSize = RxRam;
  2228. pAC->TxSQueueSize = 0;
  2229. pAC->TxAQueueSize = (RemainingRam - RxRam) & ~7;
  2230. }
  2231. for (i=0; i<SK_MAX_MACS; i++) {
  2232. pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing;
  2233. }
  2234. if (pAC->RlmtNets == 2) {
  2235. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  2236. pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing - 100;
  2237. }
  2238. } else {
  2239. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  2240. pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing - 100;
  2241. }
  2242. /*
  2243.  * Do not set the Limit to 0, because this could cause
  2244.  * wrap around with ReQueue'ed buffers (a buffer could
  2245.  * be requeued in the same position, made accessable to
  2246.  * the hardware, and the hardware could change its
  2247.  * contents!
  2248.  */
  2249. pAC->RxPort[pAC->ActivePort].RxFillLimit = 1;
  2250. }
  2251. #ifdef DEBUG
  2252. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  2253. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,
  2254. ("i: %d,  RxQSize: %d,  PXSQsize: %d, PXAQSize: %dn",
  2255. i,
  2256. pAC->GIni.GP[i].PRxQSize,
  2257. pAC->GIni.GP[i].PXSQSize,
  2258. pAC->GIni.GP[i].PXAQSize));
  2259. }
  2260. #endif
  2261. } /* SetQueueSizes */
  2262. /*****************************************************************************
  2263.  *
  2264.  *  SkGeSetMacAddr - Set the hardware MAC address
  2265.  *
  2266.  * Description:
  2267.  * This function sets the MAC address used by the adapter.
  2268.  *
  2269.  * Returns:
  2270.  * 0, if everything is ok
  2271.  * !=0, on error
  2272.  */
  2273. static int SkGeSetMacAddr(struct net_device *dev, void *p)
  2274. {
  2275. DEV_NET *pNet = (DEV_NET*) dev->priv;
  2276. SK_AC *pAC = pNet->pAC;
  2277. struct sockaddr *addr = p;
  2278. unsigned long Flags;
  2279. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  2280. ("SkGeSetMacAddr starts now...n"));
  2281. if(netif_running(dev)) {
  2282. return -EBUSY;
  2283. }
  2284. memcpy(dev->dev_addr, addr->sa_data,dev->addr_len);
  2285. spin_lock_irqsave(&pAC->SlowPathLock, Flags);
  2286. if (pAC->RlmtNets == 2)
  2287. SkAddrOverride(pAC, pAC->IoBase, pNet->NetNr,
  2288. (SK_MAC_ADDR*)dev->dev_addr, SK_ADDR_VIRTUAL_ADDRESS);
  2289. else
  2290. SkAddrOverride(pAC, pAC->IoBase, pAC->ActivePort,
  2291. (SK_MAC_ADDR*)dev->dev_addr, SK_ADDR_VIRTUAL_ADDRESS);
  2292. spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
  2293. return 0;
  2294. } /* SkGeSetMacAddr */
  2295. /*****************************************************************************
  2296.  *
  2297.  *  SkGeSetRxMode - set receive mode
  2298.  *
  2299.  * Description:
  2300.  * This function sets the receive mode of an adapter. The adapter
  2301.  * supports promiscuous mode, allmulticast mode and a number of
  2302.  * multicast addresses. If more multicast addresses the available
  2303.  * are selected, a hash function in the hardware is used.
  2304.  *
  2305.  * Returns:
  2306.  * 0, if everything is ok
  2307.  * !=0, on error
  2308.  */
  2309. static void SkGeSetRxMode(struct net_device *dev)
  2310. {
  2311. DEV_NET *pNet;
  2312. SK_AC *pAC;
  2313. struct dev_mc_list *pMcList;
  2314. int i;
  2315. int PortIdx;
  2316. unsigned long Flags;
  2317. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  2318. ("SkGeSetRxMode starts now... "));
  2319. pNet = (DEV_NET*) dev->priv;
  2320. pAC = pNet->pAC;
  2321. if (pAC->RlmtNets == 1)
  2322. PortIdx = pAC->ActivePort;
  2323. else
  2324. PortIdx = pNet->NetNr;
  2325. spin_lock_irqsave(&pAC->SlowPathLock, Flags);
  2326. if (dev->flags & IFF_PROMISC) {
  2327. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  2328. ("PROMISCUOUS moden"));
  2329. SkAddrPromiscuousChange(pAC, pAC->IoBase, PortIdx,
  2330. SK_PROM_MODE_LLC);
  2331. } else if (dev->flags & IFF_ALLMULTI) {
  2332. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  2333. ("ALLMULTI moden"));
  2334. SkAddrPromiscuousChange(pAC, pAC->IoBase, PortIdx,
  2335. SK_PROM_MODE_ALL_MC);
  2336. } else {
  2337. SkAddrPromiscuousChange(pAC, pAC->IoBase, PortIdx,
  2338. SK_PROM_MODE_NONE);
  2339. SkAddrMcClear(pAC, pAC->IoBase, PortIdx, 0);
  2340. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  2341. ("Number of MC entries: %d ", dev->mc_count));
  2342. pMcList = dev->mc_list;
  2343. for (i=0; i<dev->mc_count; i++, pMcList = pMcList->next) {
  2344. SkAddrMcAdd(pAC, pAC->IoBase, PortIdx,
  2345. (SK_MAC_ADDR*)pMcList->dmi_addr, 0);
  2346. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_MCA,
  2347. ("%02x:%02x:%02x:%02x:%02x:%02xn",
  2348. pMcList->dmi_addr[0],
  2349. pMcList->dmi_addr[1],
  2350. pMcList->dmi_addr[2],
  2351. pMcList->dmi_addr[3],
  2352. pMcList->dmi_addr[4],
  2353. pMcList->dmi_addr[5]));
  2354. }
  2355. SkAddrMcUpdate(pAC, pAC->IoBase, PortIdx);
  2356. }
  2357. spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
  2358. return;
  2359. } /* SkGeSetRxMode */
  2360. /*****************************************************************************
  2361.  *
  2362.  *  SkGeChangeMtu - set the MTU to another value
  2363.  *
  2364.  * Description:
  2365.  * This function sets is called whenever the MTU size is changed
  2366.  * (ifconfig mtu xxx dev ethX). If the MTU is bigger than standard
  2367.  * ethernet MTU size, long frame support is activated.
  2368.  *
  2369.  * Returns:
  2370.  * 0, if everything is ok
  2371.  * !=0, on error
  2372.  */
  2373. static int SkGeChangeMtu(struct net_device *dev, int NewMtu)
  2374. {
  2375. DEV_NET *pNet;
  2376. DEV_NET *pOtherNet;
  2377. SK_AC *pAC;
  2378. unsigned long Flags;
  2379. int i;
  2380. SK_EVPARA  EvPara;
  2381. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  2382. ("SkGeChangeMtu starts now...n"));
  2383. pNet = (DEV_NET*) dev->priv;
  2384. pAC = pNet->pAC;
  2385. if ((NewMtu < 68) || (NewMtu > SK_JUMBO_MTU)) {
  2386. return -EINVAL;
  2387. }
  2388. pNet->Mtu = NewMtu;
  2389. pOtherNet = (DEV_NET*)pAC->dev[1 - pNet->NetNr]->priv;
  2390. if ((pOtherNet->Mtu > 1500) && (NewMtu <= 1500) && (pOtherNet->Up==1)) {
  2391. return(0);
  2392. }
  2393. EvPara.Para32[0] = pNet->NetNr;
  2394. EvPara.Para32[1] = -1;
  2395. pAC->RxBufSize = NewMtu + 32;
  2396. dev->mtu = NewMtu;
  2397. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  2398. ("New MTU: %dn", NewMtu));
  2399. if(pAC->BoardLevel != 2) {
  2400. return 0;
  2401. }
  2402. /* prevent reconfiguration while changing the MTU */
  2403. /* disable interrupts */
  2404. SK_OUT32(pAC->IoBase, B0_IMSK, 0);
  2405. spin_lock_irqsave(&pAC->SlowPathLock, Flags);
  2406. /* Found more than one port */
  2407. if ((pAC->GIni.GIMacsFound == 2 ) && 
  2408. (pAC->RlmtNets == 2)) {
  2409. /* Stop both ports */
  2410. EvPara.Para32[0] = 0;
  2411. SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);
  2412. EvPara.Para32[0] = 1;
  2413. SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);
  2414. } else {
  2415. SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);
  2416. }
  2417. SkEventDispatcher(pAC, pAC->IoBase);
  2418. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  2419. spin_lock_irqsave(
  2420. &pAC->TxPort[i][TX_PRIO_LOW].TxDesRingLock, Flags);
  2421. netif_stop_queue(pAC->dev[i]);
  2422. }
  2423. /* 
  2424.  * adjust number of rx buffers allocated
  2425.  */
  2426. if (NewMtu > 1500) {
  2427. /* use less rx buffers */
  2428. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  2429. /* Found more than one port */
  2430. if ((pAC->GIni.GIMacsFound == 2 ) && 
  2431. (pAC->RlmtNets == 2)) {
  2432. pAC->RxPort[i].RxFillLimit = 
  2433. pAC->RxDescrPerRing - 100;
  2434. } else {
  2435. if (i == pAC->ActivePort)
  2436. pAC->RxPort[i].RxFillLimit =
  2437. pAC->RxDescrPerRing - 100;
  2438. else
  2439. pAC->RxPort[i].RxFillLimit =
  2440. pAC->RxDescrPerRing - 10;
  2441. }
  2442. }
  2443. }
  2444. else {
  2445. /* use normal anoumt of rx buffers */
  2446. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  2447. /* Found more than one port */
  2448. if ((pAC->GIni.GIMacsFound == 2 ) && 
  2449. (pAC->RlmtNets == 2)) {
  2450. pAC->RxPort[i].RxFillLimit = 1;
  2451. } else {
  2452. if (i == pAC->ActivePort)
  2453. pAC->RxPort[i].RxFillLimit = 1;
  2454. else
  2455. pAC->RxPort[i].RxFillLimit =
  2456. pAC->RxDescrPerRing - 100;
  2457. }
  2458. }
  2459. }
  2460.  
  2461. SkGeDeInit(pAC, pAC->IoBase); 
  2462. /* 
  2463.  * enable/disable hardware support for long frames
  2464.  */
  2465. if (NewMtu > 1500) {
  2466. // pAC->JumboActivated = SK_TRUE; /* is never set back !!! */
  2467. pAC->GIni.GIPortUsage = SK_JUMBO_LINK;
  2468. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  2469. pAC->GIni.GP[i].PRxCmd = 
  2470. XM_RX_STRIP_FCS | XM_RX_LENERR_OK;
  2471. }
  2472. }
  2473. else {
  2474. if ((pAC->GIni.GIMacsFound == 2 ) && 
  2475. (pAC->RlmtNets == 2)) {
  2476. pAC->GIni.GIPortUsage = SK_MUL_LINK;
  2477. } else {
  2478. pAC->GIni.GIPortUsage = SK_RED_LINK;
  2479. }
  2480. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  2481. pAC->GIni.GP[i].PRxCmd = XM_RX_STRIP_FCS;
  2482. }
  2483. }
  2484. SkGeInit(   pAC, pAC->IoBase, 1);
  2485. SkI2cInit(  pAC, pAC->IoBase, 1);
  2486. SkEventInit(pAC, pAC->IoBase, 1);
  2487. SkPnmiInit( pAC, pAC->IoBase, 1);
  2488. SkAddrInit( pAC, pAC->IoBase, 1);
  2489. SkRlmtInit( pAC, pAC->IoBase, 1);
  2490. SkTimerInit(pAC, pAC->IoBase, 1);
  2491. SkGeInit(   pAC, pAC->IoBase, 2);
  2492. SkI2cInit(  pAC, pAC->IoBase, 2);
  2493. SkEventInit(pAC, pAC->IoBase, 2);
  2494. SkPnmiInit( pAC, pAC->IoBase, 2);
  2495. SkAddrInit( pAC, pAC->IoBase, 2);
  2496. SkRlmtInit( pAC, pAC->IoBase, 2);
  2497. SkTimerInit(pAC, pAC->IoBase, 2);
  2498. /* 
  2499.  * clear and reinit the rx rings here
  2500.  */
  2501. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  2502. ReceiveIrq(pAC, &pAC->RxPort[i]);
  2503. ClearRxRing(pAC, &pAC->RxPort[i]);
  2504. FillRxRing(pAC, &pAC->RxPort[i]);
  2505. /* Enable transmit descriptor polling. */
  2506. SkGePollTxD(pAC, pAC->IoBase, i, SK_TRUE);
  2507. FillRxRing(pAC, &pAC->RxPort[i]);
  2508. };
  2509. SkGeYellowLED(pAC, pAC->IoBase, 1);
  2510. #ifdef USE_INT_MOD
  2511. {
  2512. unsigned long ModBase;
  2513. ModBase = 53125000 / INTS_PER_SEC;
  2514. SK_OUT32(pAC->IoBase, B2_IRQM_INI, ModBase);
  2515. SK_OUT32(pAC->IoBase, B2_IRQM_MSK, IRQ_MOD_MASK);
  2516. SK_OUT32(pAC->IoBase, B2_IRQM_CTRL, TIM_START);
  2517. }
  2518. #endif
  2519. netif_start_queue(pAC->dev[pNet->PortNr]);
  2520. for (i=pAC->GIni.GIMacsFound-1; i>=0; i--) {
  2521. spin_unlock(&pAC->TxPort[i][TX_PRIO_LOW].TxDesRingLock);
  2522. }
  2523. /* enable Interrupts */
  2524. SK_OUT32(pAC->IoBase, B0_IMSK, IRQ_MASK);
  2525. SK_OUT32(pAC->IoBase, B0_HWE_IMSK, IRQ_HWE_MASK);
  2526. SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara);
  2527. SkEventDispatcher(pAC, pAC->IoBase);
  2528. /* Found more than one port */
  2529. if ((pAC->GIni.GIMacsFound == 2 ) && 
  2530. (pAC->RlmtNets == 2)) {
  2531. /* Start both ports */
  2532. EvPara.Para32[0] = pAC->RlmtNets;
  2533. EvPara.Para32[1] = -1;
  2534. SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_SET_NETS,
  2535. EvPara);
  2536. EvPara.Para32[1] = -1;
  2537. EvPara.Para32[0] = pNet->PortNr;
  2538. SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara);
  2539. if (pOtherNet->Up) {
  2540. EvPara.Para32[0] = pOtherNet->PortNr;
  2541. SkEventQueue(pAC, SKGE_RLMT, 
  2542. SK_RLMT_START, EvPara);
  2543. }
  2544. } else {
  2545. SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara);
  2546. }
  2547. SkEventDispatcher(pAC, pAC->IoBase);
  2548. spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
  2549. return 0;
  2550. } /* SkGeChangeMtu */
  2551. /*****************************************************************************
  2552.  *
  2553.  *  SkGeStats - return ethernet device statistics
  2554.  *
  2555.  * Description:
  2556.  * This function return statistic data about the ethernet device
  2557.  * to the operating system.
  2558.  *
  2559.  * Returns:
  2560.  * pointer to the statistic structure.
  2561.  */
  2562. static struct net_device_stats *SkGeStats(struct net_device *dev)
  2563. {
  2564. DEV_NET *pNet = (DEV_NET*) dev->priv;
  2565. SK_AC *pAC = pNet->pAC;
  2566. SK_PNMI_STRUCT_DATA *pPnmiStruct;       /* structure for all Pnmi-Data */
  2567. SK_PNMI_STAT    *pPnmiStat;             /* pointer to virtual XMAC stat. data */SK_PNMI_CONF    *pPnmiConf;             /* pointer to virtual link config. */
  2568. unsigned int    Size;                   /* size of pnmi struct */
  2569. unsigned long Flags; /* for spin lock */
  2570. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  2571. ("SkGeStats starts now...n"));
  2572. pPnmiStruct = &pAC->PnmiStruct;
  2573.         memset(pPnmiStruct, 0, sizeof(SK_PNMI_STRUCT_DATA));
  2574.         spin_lock_irqsave(&pAC->SlowPathLock, Flags);
  2575.         Size = SK_PNMI_STRUCT_SIZE;
  2576. SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr);
  2577.         spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
  2578.         pPnmiStat = &pPnmiStruct->Stat[0];
  2579.         pPnmiConf = &pPnmiStruct->Conf[0];
  2580. pAC->stats.rx_packets = (SK_U32) pPnmiStruct->RxDeliveredCts & 0xFFFFFFFF;
  2581. pAC->stats.tx_packets = (SK_U32) pPnmiStat->StatTxOkCts & 0xFFFFFFFF;
  2582. pAC->stats.rx_bytes = (SK_U32) pPnmiStruct->RxOctetsDeliveredCts;
  2583. pAC->stats.tx_bytes = (SK_U32) pPnmiStat->StatTxOctetsOkCts;
  2584. pAC->stats.rx_errors = (SK_U32) pPnmiStruct->InErrorsCts & 0xFFFFFFFF;
  2585. pAC->stats.tx_errors = (SK_U32) pPnmiStat->StatTxSingleCollisionCts & 0xFFFFFFFF;
  2586. pAC->stats.rx_dropped = (SK_U32) pPnmiStruct->RxNoBufCts & 0xFFFFFFFF;
  2587. pAC->stats.tx_dropped = (SK_U32) pPnmiStruct->TxNoBufCts & 0xFFFFFFFF;
  2588. pAC->stats.multicast = (SK_U32) pPnmiStat->StatRxMulticastOkCts & 0xFFFFFFFF;
  2589. pAC->stats.collisions = (SK_U32) pPnmiStat->StatTxSingleCollisionCts & 0xFFFFFFFF;
  2590. /* detailed rx_errors: */
  2591. pAC->stats.rx_length_errors = (SK_U32) pPnmiStat->StatRxRuntCts & 0xFFFFFFFF;
  2592. pAC->stats.rx_over_errors = (SK_U32) pPnmiStat->StatRxFifoOverflowCts & 0xFFFFFFFF;
  2593. pAC->stats.rx_crc_errors = (SK_U32) pPnmiStat->StatRxFcsCts & 0xFFFFFFFF;
  2594. pAC->stats.rx_frame_errors = (SK_U32) pPnmiStat->StatRxFramingCts & 0xFFFFFFFF;
  2595. pAC->stats.rx_fifo_errors = (SK_U32) pPnmiStat->StatRxFifoOverflowCts & 0xFFFFFFFF;
  2596. pAC->stats.rx_missed_errors = (SK_U32) pPnmiStat->StatRxMissedCts & 0xFFFFFFFF;
  2597. /* detailed tx_errors */
  2598. pAC->stats.tx_aborted_errors = (SK_U32) 0;
  2599. pAC->stats.tx_carrier_errors = (SK_U32) pPnmiStat->StatTxCarrierCts & 0xFFFFFFFF;
  2600. pAC->stats.tx_fifo_errors = (SK_U32) pPnmiStat->StatTxFifoUnderrunCts & 0xFFFFFFFF;
  2601. pAC->stats.tx_heartbeat_errors = (SK_U32) pPnmiStat->StatTxCarrierCts & 0xFFFFFFFF;
  2602. pAC->stats.tx_window_errors = (SK_U32) 0;
  2603. return(&pAC->stats);
  2604. } /* SkGeStats */
  2605. /*****************************************************************************
  2606.  *
  2607.  *  SkGeIoctl - IO-control function
  2608.  *
  2609.  * Description:
  2610.  * This function is called if an ioctl is issued on the device.
  2611.  * There are three subfunction for reading, writing and test-writing
  2612.  * the private MIB data structure (usefull for SysKonnect-internal tools).
  2613.  *
  2614.  * Returns:
  2615.  * 0, if everything is ok
  2616.  * !=0, on error
  2617.  */
  2618. static int SkGeIoctl(struct net_device *dev, struct ifreq *rq, int cmd)
  2619. {
  2620. DEV_NET *pNet;
  2621. SK_AC *pAC;
  2622. SK_GE_IOCTL Ioctl;
  2623. unsigned int Err = 0;
  2624. int Size;
  2625. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  2626. ("SkGeIoctl starts now...n"));
  2627. pNet = (DEV_NET*) dev->priv;
  2628. pAC = pNet->pAC;
  2629. if(copy_from_user(&Ioctl, rq->ifr_data, sizeof(SK_GE_IOCTL))) {
  2630. return -EFAULT;
  2631. }
  2632. switch(cmd) {
  2633. case SK_IOCTL_SETMIB:
  2634. case SK_IOCTL_PRESETMIB:
  2635. if (!capable(CAP_NET_ADMIN)) return -EPERM;
  2636.   case SK_IOCTL_GETMIB:
  2637. if(copy_from_user(&pAC->PnmiStruct, Ioctl.pData, 
  2638. Ioctl.Len<sizeof(pAC->PnmiStruct)?
  2639. Ioctl.Len : sizeof(pAC->PnmiStruct))) {
  2640. return -EFAULT;
  2641. }
  2642. Size = SkGeIocMib(pNet, Ioctl.Len, cmd);
  2643. if(copy_to_user(Ioctl.pData, &pAC->PnmiStruct,
  2644. Ioctl.Len<Size? Ioctl.Len : Size)) {
  2645. return -EFAULT;
  2646. }
  2647. Ioctl.Len = Size;
  2648. if(copy_to_user(rq->ifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) {
  2649. return -EFAULT;
  2650. }
  2651. break;
  2652. default:
  2653. Err = -EOPNOTSUPP;
  2654. }
  2655. return(Err);
  2656. } /* SkGeIoctl */
  2657. /*****************************************************************************
  2658.  *
  2659.  *  SkGeIocMib - handle a GetMib, SetMib- or PresetMib-ioctl message
  2660.  *
  2661.  * Description:
  2662.  * This function reads/writes the MIB data using PNMI (Private Network
  2663.  * Management Interface).
  2664.  * The destination for the data must be provided with the
  2665.  * ioctl call and is given to the driver in the form of
  2666.  * a user space address.
  2667.  * Copying from the user-provided data area into kernel messages
  2668.  * and back is done by copy_from_user and copy_to_user calls in
  2669.  * SkGeIoctl.
  2670.  *
  2671.  * Returns:
  2672.  * returned size from PNMI call
  2673.  */
  2674. static int SkGeIocMib(
  2675. DEV_NET *pNet, /* pointer to the adapter context */
  2676. unsigned int Size, /* length of ioctl data */
  2677. int mode) /* flag for set/preset */
  2678. {
  2679. unsigned long Flags; /* for spin lock */
  2680. SK_AC *pAC;
  2681. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  2682. ("SkGeIocMib starts now...n"));
  2683. pAC = pNet->pAC;
  2684. /* access MIB */
  2685. spin_lock_irqsave(&pAC->SlowPathLock, Flags);
  2686. switch(mode) {
  2687. case SK_IOCTL_GETMIB:
  2688. SkPnmiGetStruct(pAC, pAC->IoBase, &pAC->PnmiStruct, &Size,
  2689. pNet->NetNr);
  2690. break;
  2691. case SK_IOCTL_PRESETMIB:
  2692. SkPnmiPreSetStruct(pAC, pAC->IoBase, &pAC->PnmiStruct, &Size,
  2693. pNet->NetNr);
  2694. break;
  2695. case SK_IOCTL_SETMIB:
  2696. SkPnmiSetStruct(pAC, pAC->IoBase, &pAC->PnmiStruct, &Size,
  2697. pNet->NetNr);
  2698. break;
  2699. default:
  2700. break;
  2701. }
  2702. spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
  2703. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
  2704. ("MIB data access succeededn"));
  2705. return (Size);
  2706. } /* SkGeIocMib */
  2707. /*****************************************************************************
  2708.  *
  2709.  *  GetConfiguration - read configuration information
  2710.  *
  2711.  * Description:
  2712.  * This function reads per-adapter configuration information from
  2713.  * the options provided on the command line.
  2714.  *
  2715.  * Returns:
  2716.  * none
  2717.  */
  2718. static void GetConfiguration(
  2719. SK_AC *pAC) /* pointer to the adapter context structure */
  2720. {
  2721. SK_I32 Port; /* preferred port */
  2722. int AutoNeg; /* auto negotiation off (0) or on (1) */
  2723. int DuplexCap; /* duplex capabilities (0=both, 1=full, 2=half */
  2724. int MSMode; /* master / slave mode selection */
  2725. SK_BOOL AutoSet;
  2726. SK_BOOL DupSet;
  2727. /*
  2728.  * The two parameters AutoNeg. and DuplexCap. map to one configuration
  2729.  * parameter. The mapping is described by this table:
  2730.  * DuplexCap -> | both | full | half |
  2731.  * AutoNeg | | | |
  2732.  * -----------------------------------------------------------------
  2733.  * Off |    illegal | Full | Half |
  2734.  * -----------------------------------------------------------------
  2735.  * On |   AutoBoth |   AutoFull |   AutoHalf |
  2736.  * -----------------------------------------------------------------
  2737.  * Sense |   AutoSense |   AutoSense |   AutoSense |
  2738.  */
  2739. int Capabilities[3][3] = 
  2740. { {   -1, SK_LMODE_FULL,     SK_LMODE_HALF}, 
  2741.   {SK_LMODE_AUTOBOTH, SK_LMODE_AUTOFULL, SK_LMODE_AUTOHALF},
  2742.   {SK_LMODE_AUTOSENSE, SK_LMODE_AUTOSENSE, SK_LMODE_AUTOSENSE} };
  2743. #define DC_BOTH 0
  2744. #define DC_FULL 1
  2745. #define DC_HALF 2
  2746. #define AN_OFF 0
  2747. #define AN_ON 1
  2748. #define AN_SENS 2
  2749. /* settings for port A */
  2750. AutoNeg = AN_SENS; /* default: do auto Sense */
  2751. AutoSet = SK_FALSE;
  2752. if (AutoNeg_A != NULL && pAC->Index<SK_MAX_CARD_PARAM &&
  2753. AutoNeg_A[pAC->Index] != NULL) {
  2754. AutoSet = SK_TRUE;
  2755. if (strcmp(AutoNeg_A[pAC->Index],"")==0) {
  2756. AutoSet = SK_FALSE;
  2757. }
  2758. else if (strcmp(AutoNeg_A[pAC->Index],"On")==0) {
  2759. AutoNeg = AN_ON;
  2760. }
  2761. else if (strcmp(AutoNeg_A[pAC->Index],"Off")==0) {
  2762. AutoNeg = AN_OFF;
  2763. }
  2764. else if (strcmp(AutoNeg_A[pAC->Index],"Sense")==0) {
  2765. AutoNeg = AN_SENS;
  2766. }
  2767. else printk("%s: Illegal value for AutoNeg_An",
  2768. pAC->dev[0]->name);
  2769. }
  2770. DuplexCap = DC_BOTH;
  2771. DupSet = SK_FALSE;
  2772. if (DupCap_A != NULL && pAC->Index<SK_MAX_CARD_PARAM &&
  2773. DupCap_A[pAC->Index] != NULL) {
  2774. DupSet = SK_TRUE;
  2775. if (strcmp(DupCap_A[pAC->Index],"")==0) {
  2776. DupSet = SK_FALSE;
  2777. }
  2778. else if (strcmp(DupCap_A[pAC->Index],"Both")==0) {
  2779. DuplexCap = DC_BOTH;
  2780. }
  2781. else if (strcmp(DupCap_A[pAC->Index],"Full")==0) {
  2782. DuplexCap = DC_FULL;
  2783. }
  2784. else if (strcmp(DupCap_A[pAC->Index],"Half")==0) {
  2785. DuplexCap = DC_HALF;
  2786. }
  2787. else printk("%s: Illegal value for DupCap_An",
  2788. pAC->dev[0]->name);
  2789. }
  2790. /* check for illegal combinations */
  2791. if (AutoSet && AutoNeg==AN_SENS && DupSet) {
  2792. printk("%s, Port A: DuplexCapabilities"
  2793. " ignored using Sense moden", pAC->dev[0]->name);
  2794. }
  2795. if (AutoSet && AutoNeg==AN_OFF && DupSet && DuplexCap==DC_BOTH){
  2796. printk("%s, Port A: Illegal combination"
  2797. " of values AutoNeg. and DuplexCap.n    Using "
  2798. "Full Duplexn", pAC->dev[0]->name);
  2799. DuplexCap = DC_FULL;
  2800. }
  2801. if (AutoSet && AutoNeg==AN_OFF && !DupSet) {
  2802. DuplexCap = DC_FULL;
  2803. }
  2804. if (!AutoSet && DupSet) {
  2805. printk("%s, Port A: Duplex setting not"
  2806. " possible inn    default AutoNegotiation mode"
  2807. " (Sense).n    Using AutoNegotiation Onn",
  2808. pAC->dev[0]->name);
  2809. AutoNeg = AN_ON;
  2810. }
  2811. /* set the desired mode */
  2812. pAC->GIni.GP[0].PLinkModeConf =
  2813. Capabilities[AutoNeg][DuplexCap];
  2814. pAC->GIni.GP[0].PFlowCtrlMode = SK_FLOW_MODE_SYM_OR_REM;
  2815. if (FlowCtrl_A != NULL && pAC->Index<SK_MAX_CARD_PARAM &&
  2816. FlowCtrl_A[pAC->Index] != NULL) {
  2817. if (strcmp(FlowCtrl_A[pAC->Index],"") == 0) {
  2818. }
  2819. else if (strcmp(FlowCtrl_A[pAC->Index],"SymOrRem") == 0) {
  2820. pAC->GIni.GP[0].PFlowCtrlMode =
  2821. SK_FLOW_MODE_SYM_OR_REM;
  2822. }
  2823. else if (strcmp(FlowCtrl_A[pAC->Index],"Sym")==0) {
  2824. pAC->GIni.GP[0].PFlowCtrlMode =
  2825. SK_FLOW_MODE_SYMMETRIC;
  2826. }
  2827. else if (strcmp(FlowCtrl_A[pAC->Index],"LocSend")==0) {
  2828. pAC->GIni.GP[0].PFlowCtrlMode =
  2829. SK_FLOW_MODE_LOC_SEND;
  2830. }
  2831. else if (strcmp(FlowCtrl_A[pAC->Index],"None")==0) {
  2832. pAC->GIni.GP[0].PFlowCtrlMode =
  2833. SK_FLOW_MODE_NONE;
  2834. }
  2835. else printk("Illegal value for FlowCtrl_An");
  2836. }
  2837. if (AutoNeg==AN_OFF && pAC->GIni.GP[0].PFlowCtrlMode!=
  2838. SK_FLOW_MODE_NONE) {
  2839. printk("%s, Port A: FlowControl"
  2840. " impossible without AutoNegotiation,"
  2841. " disabledn", pAC->dev[0]->name);
  2842. pAC->GIni.GP[0].PFlowCtrlMode = SK_FLOW_MODE_NONE;
  2843. }
  2844. MSMode = SK_MS_MODE_AUTO; /* default: do auto select */
  2845. if (Role_A != NULL && pAC->Index<SK_MAX_CARD_PARAM &&
  2846. Role_A[pAC->Index] != NULL) {
  2847. if (strcmp(Role_A[pAC->Index],"")==0) {
  2848. }
  2849. else if (strcmp(Role_A[pAC->Index],"Auto")==0) {
  2850. MSMode = SK_MS_MODE_AUTO;
  2851. }
  2852. else if (strcmp(Role_A[pAC->Index],"Master")==0) {
  2853. MSMode = SK_MS_MODE_MASTER;
  2854. }
  2855. else if (strcmp(Role_A[pAC->Index],"Slave")==0) {
  2856. MSMode = SK_MS_MODE_SLAVE;
  2857. }
  2858. else printk("%s: Illegal value for Role_An",
  2859. pAC->dev[0]->name);
  2860. }
  2861. pAC->GIni.GP[0].PMSMode = MSMode;
  2862. /* settings for port B */
  2863. AutoNeg = AN_SENS; /* default: do auto Sense */
  2864. AutoSet = SK_FALSE;
  2865. if (AutoNeg_B != NULL && pAC->Index<SK_MAX_CARD_PARAM &&
  2866. AutoNeg_B[pAC->Index] != NULL) {
  2867. AutoSet = SK_TRUE;
  2868. if (strcmp(AutoNeg_B[pAC->Index],"")==0) {
  2869. AutoSet = SK_FALSE;
  2870. }
  2871. else if (strcmp(AutoNeg_B[pAC->Index],"On")==0) {
  2872. AutoNeg = AN_ON;
  2873. }
  2874. else if (strcmp(AutoNeg_B[pAC->Index],"Off")==0) {
  2875. AutoNeg = AN_OFF;
  2876. }
  2877. else if (strcmp(AutoNeg_B[pAC->Index],"Sense")==0) {
  2878. AutoNeg = AN_SENS;
  2879. }
  2880. else printk("Illegal value for AutoNeg_Bn");
  2881. }
  2882. DuplexCap = DC_BOTH;
  2883. DupSet = SK_FALSE;
  2884. if (DupCap_B != NULL && pAC->Index<SK_MAX_CARD_PARAM &&
  2885. DupCap_B[pAC->Index] != NULL) {
  2886. DupSet = SK_TRUE;
  2887. if (strcmp(DupCap_B[pAC->Index],"")==0) {
  2888. DupSet = SK_FALSE;
  2889. }
  2890. else if (strcmp(DupCap_B[pAC->Index],"Both")==0) {
  2891. DuplexCap = DC_BOTH;
  2892. }
  2893. else if (strcmp(DupCap_B[pAC->Index],"Full")==0) {
  2894. DuplexCap = DC_FULL;
  2895. }
  2896. else if (strcmp(DupCap_B[pAC->Index],"Half")==0) {
  2897. DuplexCap = DC_HALF;
  2898. }
  2899. else printk("Illegal value for DupCap_Bn");
  2900. }
  2901. /* check for illegal combinations */
  2902. if (AutoSet && AutoNeg==AN_SENS && DupSet) {
  2903. printk("%s, Port B: DuplexCapabilities"
  2904. " ignored using Sense moden", pAC->dev[1]->name);
  2905. }
  2906. if (AutoSet && AutoNeg==AN_OFF && DupSet && DuplexCap==DC_BOTH){
  2907. printk("%s, Port B: Illegal combination"
  2908. " of values AutoNeg. and DuplexCap.n    Using "
  2909. "Full Duplexn", pAC->dev[1]->name);
  2910. DuplexCap = DC_FULL;
  2911. }
  2912. if (AutoSet && AutoNeg==AN_OFF && !DupSet) {
  2913. DuplexCap = DC_FULL;
  2914. }
  2915. if (!AutoSet && DupSet) {
  2916. printk("%s, Port B: Duplex setting not"
  2917. " possible inn    default AutoNegotiation mode"
  2918. " (Sense).n    Using AutoNegotiation Onn",
  2919. pAC->dev[1]->name);
  2920. AutoNeg = AN_ON;
  2921. }
  2922. /* set the desired mode */
  2923. pAC->GIni.GP[1].PLinkModeConf =
  2924. Capabilities[AutoNeg][DuplexCap];
  2925. pAC->GIni.GP[1].PFlowCtrlMode = SK_FLOW_MODE_SYM_OR_REM;
  2926. if (FlowCtrl_B != NULL && pAC->Index<SK_MAX_CARD_PARAM &&
  2927. FlowCtrl_B[pAC->Index] != NULL) {
  2928. if (strcmp(FlowCtrl_B[pAC->Index],"") == 0) {
  2929. }
  2930. else if (strcmp(FlowCtrl_B[pAC->Index],"SymOrRem") == 0) {
  2931. pAC->GIni.GP[1].PFlowCtrlMode =
  2932. SK_FLOW_MODE_SYM_OR_REM;
  2933. }
  2934. else if (strcmp(FlowCtrl_B[pAC->Index],"Sym")==0) {
  2935. pAC->GIni.GP[1].PFlowCtrlMode =
  2936. SK_FLOW_MODE_SYMMETRIC;
  2937. }
  2938. else if (strcmp(FlowCtrl_B[pAC->Index],"LocSend")==0) {
  2939. pAC->GIni.GP[1].PFlowCtrlMode =
  2940. SK_FLOW_MODE_LOC_SEND;
  2941. }
  2942. else if (strcmp(FlowCtrl_B[pAC->Index],"None")==0) {
  2943. pAC->GIni.GP[1].PFlowCtrlMode =
  2944. SK_FLOW_MODE_NONE;
  2945. }
  2946. else printk("Illegal value for FlowCtrl_Bn");
  2947. }
  2948. if (AutoNeg==AN_OFF && pAC->GIni.GP[1].PFlowCtrlMode!=
  2949. SK_FLOW_MODE_NONE) {
  2950. printk("%s, Port B: FlowControl"
  2951. " impossible without AutoNegotiation,"
  2952. " disabledn", pAC->dev[1]->name);
  2953. pAC->GIni.GP[1].PFlowCtrlMode = SK_FLOW_MODE_NONE;
  2954. }
  2955. MSMode = SK_MS_MODE_AUTO; /* default: do auto select */
  2956. if (Role_B != NULL && pAC->Index<SK_MAX_CARD_PARAM &&
  2957. Role_B[pAC->Index] != NULL) {
  2958. if (strcmp(Role_B[pAC->Index],"")==0) {
  2959. }
  2960. else if (strcmp(Role_B[pAC->Index],"Auto")==0) {
  2961. MSMode = SK_MS_MODE_AUTO;
  2962. }
  2963. else if (strcmp(Role_B[pAC->Index],"Master")==0) {
  2964. MSMode = SK_MS_MODE_MASTER;
  2965. }
  2966. else if (strcmp(Role_B[pAC->Index],"Slave")==0) {
  2967. MSMode = SK_MS_MODE_SLAVE;
  2968. }
  2969. else printk("%s: Illegal value for Role_Bn",
  2970. pAC->dev[1]->name);
  2971. }
  2972. pAC->GIni.GP[1].PMSMode = MSMode;
  2973. /* settings for both ports */
  2974. pAC->ActivePort = 0;
  2975. if (PrefPort != NULL && pAC->Index<SK_MAX_CARD_PARAM &&
  2976. PrefPort[pAC->Index] != NULL) {
  2977. if (strcmp(PrefPort[pAC->Index],"") == 0) { /* Auto */
  2978. pAC->ActivePort = 0;
  2979. pAC->Rlmt.Net[0].Preference = -1; /* auto */
  2980. pAC->Rlmt.Net[0].PrefPort = 0;
  2981. }
  2982. else if (strcmp(PrefPort[pAC->Index],"A") == 0) {
  2983. /*
  2984.  * do not set ActivePort here, thus a port
  2985.  * switch is issued after net up.
  2986.  */
  2987. Port = 0;
  2988. pAC->Rlmt.Net[0].Preference = Port;
  2989. pAC->Rlmt.Net[0].PrefPort = Port;
  2990. }
  2991. else if (strcmp(PrefPort[pAC->Index],"B") == 0) {
  2992. /*
  2993.  * do not set ActivePort here, thus a port
  2994.  * switch is issued after net up.
  2995.  */
  2996. Port = 1;
  2997. pAC->Rlmt.Net[0].Preference = Port;
  2998. pAC->Rlmt.Net[0].PrefPort = Port;
  2999. }
  3000. else printk("%s: Illegal value for PrefPortn",
  3001. pAC->dev[0]->name);
  3002. }
  3003. pAC->RlmtNets = 1;
  3004. if (RlmtMode != NULL && pAC->Index<SK_MAX_CARD_PARAM &&
  3005. RlmtMode[pAC->Index] != NULL) {
  3006. if (strcmp(RlmtMode[pAC->Index], "") == 0) {
  3007. pAC->RlmtMode = 0;
  3008. }
  3009. else if (strcmp(RlmtMode[pAC->Index], "CheckLinkState") == 0) {
  3010. pAC->RlmtMode = SK_RLMT_CHECK_LINK;
  3011. }
  3012. else if (strcmp(RlmtMode[pAC->Index], "CheckLocalPort") == 0) {
  3013. pAC->RlmtMode = SK_RLMT_CHECK_LINK |
  3014. SK_RLMT_CHECK_LOC_LINK;
  3015. }
  3016. else if (strcmp(RlmtMode[pAC->Index], "CheckSeg") == 0) {
  3017. pAC->RlmtMode = SK_RLMT_CHECK_LINK |
  3018. SK_RLMT_CHECK_LOC_LINK | 
  3019. SK_RLMT_CHECK_SEG;
  3020. }
  3021. else if ((strcmp(RlmtMode[pAC->Index], "DualNet") == 0) &&
  3022. (pAC->GIni.GIMacsFound == 2)) {
  3023. pAC->RlmtMode = SK_RLMT_CHECK_LINK;
  3024. pAC->RlmtNets = 2;
  3025. }
  3026. else {
  3027. printk("%s: Illegal value for"
  3028. " RlmtMode, using defaultn", pAC->dev[0]->name);
  3029. printk("MacFound = %dnRlmtMode = %s", pAC->GIni.GIMacsFound, RlmtMode[pAC->Index]);
  3030. pAC->RlmtMode = 0;
  3031. }
  3032. }
  3033. else {
  3034. pAC->RlmtMode = 0;
  3035. }
  3036. } /* GetConfiguration */
  3037. /*****************************************************************************
  3038.  *
  3039.  *  ProductStr - return a adapter identification string from vpd
  3040.  *
  3041.  * Description:
  3042.  * This function reads the product name string from the vpd area
  3043.  * and puts it the field pAC->DeviceString.
  3044.  *
  3045.  * Returns: N/A
  3046.  */
  3047. static void ProductStr(
  3048. SK_AC *pAC /* pointer to adapter context */
  3049. )
  3050. {
  3051. int StrLen = 80; /* length of the string, defined in SK_AC */
  3052. char Keyword[] = VPD_NAME; /* vpd productname identifier */
  3053. int ReturnCode; /* return code from vpd_read */
  3054. unsigned long Flags;
  3055. spin_lock_irqsave(&pAC->SlowPathLock, Flags);
  3056. ReturnCode = VpdRead(pAC, pAC->IoBase, Keyword, pAC->DeviceStr,
  3057. &StrLen);
  3058. spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
  3059. if (ReturnCode != 0) {
  3060. /* there was an error reading the vpd data */
  3061. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ERROR,
  3062. ("Error reading VPD data: %dn", ReturnCode));
  3063. pAC->DeviceStr[0] = '';
  3064. }
  3065. } /* ProductStr */
  3066. /****************************************************************************/
  3067. /* functions for common modules *********************************************/
  3068. /****************************************************************************/
  3069. /*****************************************************************************
  3070.  *
  3071.  * SkDrvAllocRlmtMbuf - allocate an RLMT mbuf
  3072.  *
  3073.  * Description:
  3074.  * This routine returns an RLMT mbuf or NULL. The RLMT Mbuf structure
  3075.  * is embedded into a socket buff data area.
  3076.  *
  3077.  * Context:
  3078.  * runtime
  3079.  *
  3080.  * Returns:
  3081.  * NULL or pointer to Mbuf.
  3082.  */
  3083. SK_MBUF *SkDrvAllocRlmtMbuf(
  3084. SK_AC *pAC, /* pointer to adapter context */
  3085. SK_IOC IoC, /* the IO-context */
  3086. unsigned BufferSize) /* size of the requested buffer */
  3087. {
  3088. SK_MBUF *pRlmtMbuf; /* pointer to a new rlmt-mbuf structure */
  3089. struct sk_buff *pMsgBlock; /* pointer to a new message block */
  3090. pMsgBlock = alloc_skb(BufferSize + sizeof(SK_MBUF), GFP_ATOMIC);
  3091. if (pMsgBlock == NULL) {
  3092. return (NULL);
  3093. }
  3094. pRlmtMbuf = (SK_MBUF*) pMsgBlock->data;
  3095. skb_reserve(pMsgBlock, sizeof(SK_MBUF));
  3096. pRlmtMbuf->pNext = NULL;
  3097. pRlmtMbuf->pOs = pMsgBlock;
  3098. pRlmtMbuf->pData = pMsgBlock->data; /* Data buffer. */
  3099. pRlmtMbuf->Size = BufferSize; /* Data buffer size. */
  3100. pRlmtMbuf->Length = 0; /* Length of packet (<= Size). */
  3101. return (pRlmtMbuf);
  3102. } /* SkDrvAllocRlmtMbuf */
  3103. /*****************************************************************************
  3104.  *
  3105.  * SkDrvFreeRlmtMbuf - free an RLMT mbuf
  3106.  *
  3107.  * Description:
  3108.  * This routine frees one or more RLMT mbuf(s).
  3109.  *
  3110.  * Context:
  3111.  * runtime
  3112.  *
  3113.  * Returns:
  3114.  * Nothing
  3115.  */
  3116. void  SkDrvFreeRlmtMbuf(
  3117. SK_AC *pAC, /* pointer to adapter context */  
  3118. SK_IOC IoC, /* the IO-context */              
  3119. SK_MBUF *pMbuf) /* size of the requested buffer */
  3120. {
  3121. SK_MBUF *pFreeMbuf;
  3122. SK_MBUF *pNextMbuf;
  3123. pFreeMbuf = pMbuf;
  3124. do {
  3125. pNextMbuf = pFreeMbuf->pNext;
  3126. DEV_KFREE_SKB_ANY(pFreeMbuf->pOs);
  3127. pFreeMbuf = pNextMbuf;
  3128. } while ( pFreeMbuf != NULL );
  3129. } /* SkDrvFreeRlmtMbuf */
  3130. /*****************************************************************************
  3131.  *
  3132.  * SkOsGetTime - provide a time value
  3133.  *
  3134.  * Description:
  3135.  * This routine provides a time value. The unit is 1/HZ (defined by Linux).
  3136.  * It is not used for absolute time, but only for time differences.
  3137.  *
  3138.  *
  3139.  * Returns:
  3140.  * Time value
  3141.  */
  3142. SK_U64 SkOsGetTime(SK_AC *pAC)
  3143. {
  3144. return jiffies;
  3145. } /* SkOsGetTime */
  3146. /*****************************************************************************
  3147.  *
  3148.  * SkPciReadCfgDWord - read a 32 bit value from pci config space
  3149.  *
  3150.  * Description:
  3151.  * This routine reads a 32 bit value from the pci configuration
  3152.  * space.
  3153.  *
  3154.  * Returns:
  3155.  * 0 - indicate everything worked ok.
  3156.  * != 0 - error indication
  3157.  */
  3158. int SkPciReadCfgDWord(
  3159. SK_AC *pAC, /* Adapter Control structure pointer */
  3160. int PciAddr, /* PCI register address */
  3161. SK_U32 *pVal) /* pointer to store the read value */
  3162. {
  3163. pci_read_config_dword(&pAC->PciDev, PciAddr, pVal);
  3164. return(0);
  3165. } /* SkPciReadCfgDWord */
  3166. /*****************************************************************************
  3167.  *
  3168.  * SkPciReadCfgWord - read a 16 bit value from pci config space
  3169.  *
  3170.  * Description:
  3171.  * This routine reads a 16 bit value from the pci configuration
  3172.  * space.
  3173.  *
  3174.  * Returns:
  3175.  * 0 - indicate everything worked ok.
  3176.  * != 0 - error indication
  3177.  */
  3178. int SkPciReadCfgWord(
  3179. SK_AC *pAC, /* Adapter Control structure pointer */
  3180. int PciAddr, /* PCI register address */
  3181. SK_U16 *pVal) /* pointer to store the read value */
  3182. {
  3183. pci_read_config_word(&pAC->PciDev, PciAddr, pVal);
  3184. return(0);
  3185. } /* SkPciReadCfgWord */
  3186. /*****************************************************************************
  3187.  *
  3188.  * SkPciReadCfgByte - read a 8 bit value from pci config space
  3189.  *
  3190.  * Description:
  3191.  * This routine reads a 8 bit value from the pci configuration
  3192.  * space.
  3193.  *
  3194.  * Returns:
  3195.  * 0 - indicate everything worked ok.
  3196.  * != 0 - error indication
  3197.  */
  3198. int SkPciReadCfgByte(
  3199. SK_AC *pAC, /* Adapter Control structure pointer */
  3200. int PciAddr, /* PCI register address */
  3201. SK_U8 *pVal) /* pointer to store the read value */
  3202. {
  3203. pci_read_config_byte(&pAC->PciDev, PciAddr, pVal);
  3204. return(0);
  3205. } /* SkPciReadCfgByte */
  3206. /*****************************************************************************
  3207.  *
  3208.  * SkPciWriteCfgDWord - write a 32 bit value to pci config space
  3209.  *
  3210.  * Description:
  3211.  * This routine writes a 32 bit value to the pci configuration
  3212.  * space.
  3213.  *
  3214.  * Returns:
  3215.  * 0 - indicate everything worked ok.
  3216.  * != 0 - error indication
  3217.  */
  3218. int SkPciWriteCfgDWord(
  3219. SK_AC *pAC, /* Adapter Control structure pointer */
  3220. int PciAddr, /* PCI register address */
  3221. SK_U32 Val) /* pointer to store the read value */
  3222. {
  3223. pci_write_config_dword(&pAC->PciDev, PciAddr, Val);
  3224. return(0);
  3225. } /* SkPciWriteCfgDWord */
  3226. /*****************************************************************************
  3227.  *
  3228.  * SkPciWriteCfgWord - write a 16 bit value to pci config space
  3229.  *
  3230.  * Description:
  3231.  * This routine writes a 16 bit value to the pci configuration
  3232.  * space. The flag PciConfigUp indicates whether the config space
  3233.  * is accesible or must be set up first.
  3234.  *
  3235.  * Returns:
  3236.  * 0 - indicate everything worked ok.
  3237.  * != 0 - error indication
  3238.  */
  3239. int SkPciWriteCfgWord(
  3240. SK_AC *pAC, /* Adapter Control structure pointer */
  3241. int PciAddr, /* PCI register address */
  3242. SK_U16 Val) /* pointer to store the read value */
  3243. {
  3244. pci_write_config_word(&pAC->PciDev, PciAddr, Val);
  3245. return(0);
  3246. } /* SkPciWriteCfgWord */
  3247. /*****************************************************************************
  3248.  *
  3249.  * SkPciWriteCfgWord - write a 8 bit value to pci config space
  3250.  *
  3251.  * Description:
  3252.  * This routine writes a 8 bit value to the pci configuration
  3253.  * space. The flag PciConfigUp indicates whether the config space
  3254.  * is accesible or must be set up first.
  3255.  *
  3256.  * Returns:
  3257.  * 0 - indicate everything worked ok.
  3258.  * != 0 - error indication
  3259.  */
  3260. int SkPciWriteCfgByte(
  3261. SK_AC *pAC, /* Adapter Control structure pointer */
  3262. int PciAddr, /* PCI register address */
  3263. SK_U8 Val) /* pointer to store the read value */
  3264. {
  3265. pci_write_config_byte(&pAC->PciDev, PciAddr, Val);
  3266. return(0);
  3267. } /* SkPciWriteCfgByte */
  3268. /*****************************************************************************
  3269.  *
  3270.  * SkDrvEvent - handle driver events
  3271.  *
  3272.  * Description:
  3273.  * This function handles events from all modules directed to the driver
  3274.  *
  3275.  * Context:
  3276.  * Is called under protection of slow path lock.
  3277.  *
  3278.  * Returns:
  3279.  * 0 if everything ok
  3280.  * < 0  on error
  3281.  *
  3282.  */
  3283. int SkDrvEvent(
  3284. SK_AC *pAC, /* pointer to adapter context */
  3285. SK_IOC IoC, /* io-context */
  3286. SK_U32 Event, /* event-id */
  3287. SK_EVPARA Param) /* event-parameter */
  3288. {
  3289. SK_MBUF *pRlmtMbuf; /* pointer to a rlmt-mbuf structure */
  3290. struct sk_buff *pMsg; /* pointer to a message block */
  3291. int FromPort; /* the port from which we switch away */
  3292. int ToPort; /* the port we switch to */
  3293. SK_EVPARA NewPara; /* parameter for further events */
  3294. int Stat;
  3295. unsigned long Flags;
  3296. switch (Event) {
  3297. case SK_DRV_ADAP_FAIL:
  3298. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
  3299. ("ADAPTER FAIL EVENTn"));
  3300. printk("%s: Adapter failed.n", pAC->dev[0]->name);
  3301. /* disable interrupts */
  3302. SK_OUT32(pAC->IoBase, B0_IMSK, 0);
  3303. /* cgoos */
  3304. break;
  3305. case SK_DRV_PORT_FAIL:
  3306. FromPort = Param.Para32[0];
  3307. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
  3308. ("PORT FAIL EVENT, Port: %dn", FromPort));
  3309. if (FromPort == 0) {
  3310. printk("%s: Port A failed.n", pAC->dev[0]->name);
  3311. } else {
  3312. printk("%s: Port B failed.n", pAC->dev[1]->name);
  3313. }
  3314. /* cgoos */
  3315. break;
  3316. case SK_DRV_PORT_RESET:  /* SK_U32 PortIdx */
  3317. /* action list 4 */
  3318. FromPort = Param.Para32[0];
  3319. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
  3320. ("PORT RESET EVENT, Port: %d ", FromPort));
  3321. NewPara.Para64 = FromPort;
  3322. SkPnmiEvent(pAC, IoC, SK_PNMI_EVT_XMAC_RESET, NewPara);
  3323. spin_lock_irqsave(
  3324. &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
  3325. Flags);
  3326. SkGeStopPort(pAC, IoC, FromPort, SK_STOP_ALL, SK_HARD_RST);
  3327. spin_unlock_irqrestore(
  3328. &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
  3329. Flags);
  3330. /* clear rx ring from received frames */
  3331. ReceiveIrq(pAC, &pAC->RxPort[FromPort]);
  3332. ClearTxRing(pAC, &pAC->TxPort[FromPort][TX_PRIO_LOW]);
  3333. spin_lock_irqsave(
  3334. &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
  3335. Flags);
  3336. SkGeInitPort(pAC, IoC, FromPort);
  3337. SkAddrMcUpdate(pAC,IoC, FromPort);
  3338. PortReInitBmu(pAC, FromPort);
  3339. SkGePollTxD(pAC, IoC, FromPort, SK_TRUE);
  3340. ClearAndStartRx(pAC, FromPort);
  3341. spin_unlock_irqrestore(
  3342. &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
  3343. Flags);
  3344. break;
  3345. case SK_DRV_NET_UP:  /* SK_U32 PortIdx */
  3346. /* action list 5 */
  3347. FromPort = Param.Para32[0];
  3348. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
  3349. ("NET UP EVENT, Port: %d ", Param.Para32[0]));
  3350. printk("%s: network connection up using"
  3351. " port %cn", pAC->dev[Param.Para32[0]]->name, 'A'+Param.Para32[0]);
  3352. printk("    speed:           1000n");
  3353. Stat = pAC->GIni.GP[FromPort].PLinkModeStatus;
  3354. if (Stat == SK_LMODE_STAT_AUTOHALF ||
  3355. Stat == SK_LMODE_STAT_AUTOFULL) {
  3356. printk("    autonegotiation: yesn");
  3357. }
  3358. else {
  3359. printk("    autonegotiation: non");
  3360. }
  3361. if (Stat == SK_LMODE_STAT_AUTOHALF ||
  3362. Stat == SK_LMODE_STAT_HALF) {
  3363. printk("    duplex mode:     halfn");
  3364. }
  3365. else {
  3366. printk("    duplex mode:     fulln");
  3367. }
  3368. Stat = pAC->GIni.GP[FromPort].PFlowCtrlStatus;
  3369. if (Stat == SK_FLOW_STAT_REM_SEND ) {
  3370. printk("    flowctrl:        remote sendn");
  3371. }
  3372. else if (Stat == SK_FLOW_STAT_LOC_SEND ){
  3373. printk("    flowctrl:        local sendn");
  3374. }
  3375. else if (Stat == SK_FLOW_STAT_SYMMETRIC ){
  3376. printk("    flowctrl:        symmetricn");
  3377. }
  3378. else {
  3379. printk("    flowctrl:        nonen");
  3380. }
  3381. if (pAC->GIni.GP[FromPort].PhyType != SK_PHY_XMAC) {
  3382. Stat = pAC->GIni.GP[FromPort].PMSStatus;
  3383. if (Stat == SK_MS_STAT_MASTER ) {
  3384. printk("    role:            mastern");
  3385. }
  3386. else if (Stat == SK_MS_STAT_SLAVE ) {
  3387. printk("    role:            slaven");
  3388. }
  3389. else {
  3390. printk("    role:            ???n");
  3391. }
  3392. }
  3393. if ((Param.Para32[0] != pAC->ActivePort) && 
  3394. (pAC->RlmtNets == 1)) {
  3395. NewPara.Para32[0] = pAC->ActivePort;
  3396. NewPara.Para32[1] = Param.Para32[0];
  3397. SkEventQueue(pAC, SKGE_DRV, SK_DRV_SWITCH_INTERN,
  3398. NewPara);
  3399. }
  3400. break;
  3401. case SK_DRV_NET_DOWN:  /* SK_U32 Reason */
  3402. /* action list 7 */
  3403. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
  3404. ("NET DOWN EVENT "));
  3405. printk("%s: network connection downn", pAC->dev[Param.Para32[1]]->name);
  3406. break;
  3407. case SK_DRV_SWITCH_HARD: /* SK_U32 FromPortIdx SK_U32 ToPortIdx */
  3408. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
  3409. ("PORT SWITCH HARD "));
  3410. case SK_DRV_SWITCH_SOFT: /* SK_U32 FromPortIdx SK_U32 ToPortIdx */
  3411. /* action list 6 */
  3412. printk("%s: switching to port %cn", pAC->dev[0]->name,
  3413. 'A'+Param.Para32[1]);
  3414. case SK_DRV_SWITCH_INTERN: /* SK_U32 FromPortIdx SK_U32 ToPortIdx */
  3415. FromPort = Param.Para32[0];
  3416. ToPort = Param.Para32[1];
  3417. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
  3418. ("PORT SWITCH EVENT, From: %d  To: %d (Pref %d) ",
  3419. FromPort, ToPort, pAC->Rlmt.Net[0].PrefPort));
  3420. NewPara.Para64 = FromPort;
  3421. SkPnmiEvent(pAC, IoC, SK_PNMI_EVT_XMAC_RESET, NewPara);
  3422. NewPara.Para64 = ToPort;
  3423. SkPnmiEvent(pAC, IoC, SK_PNMI_EVT_XMAC_RESET, NewPara);
  3424. spin_lock_irqsave(
  3425. &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
  3426. Flags);
  3427. spin_lock_irqsave(
  3428. &pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock, Flags);
  3429. SkGeStopPort(pAC, IoC, FromPort, SK_STOP_ALL, SK_SOFT_RST);
  3430. SkGeStopPort(pAC, IoC, ToPort, SK_STOP_ALL, SK_SOFT_RST);
  3431. spin_unlock_irqrestore(
  3432. &pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock, Flags);
  3433. spin_unlock_irqrestore(
  3434. &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
  3435. Flags);
  3436. ReceiveIrq(pAC, &pAC->RxPort[FromPort]); /* clears rx ring */
  3437. ReceiveIrq(pAC, &pAC->RxPort[ToPort]); /* clears rx ring */
  3438. ClearTxRing(pAC, &pAC->TxPort[FromPort][TX_PRIO_LOW]);
  3439. ClearTxRing(pAC, &pAC->TxPort[ToPort][TX_PRIO_LOW]);
  3440. spin_lock_irqsave(
  3441. &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, 
  3442. Flags);
  3443. spin_lock_irqsave(
  3444. &pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock, Flags);
  3445. pAC->ActivePort = ToPort;
  3446. SetQueueSizes(pAC);
  3447. SkGeInitPort(pAC, IoC, FromPort);
  3448. SkGeInitPort(pAC, IoC, ToPort);
  3449. if (Event == SK_DRV_SWITCH_SOFT) {
  3450. SkXmRxTxEnable(pAC, IoC, FromPort);
  3451. }
  3452. SkXmRxTxEnable(pAC, IoC, ToPort);
  3453. SkAddrSwap(pAC, IoC, FromPort, ToPort);
  3454. SkAddrMcUpdate(pAC, IoC, FromPort);
  3455. SkAddrMcUpdate(pAC, IoC, ToPort);
  3456. PortReInitBmu(pAC, FromPort);
  3457. PortReInitBmu(pAC, ToPort);
  3458. SkGePollTxD(pAC, IoC, FromPort, SK_TRUE);
  3459. SkGePollTxD(pAC, IoC, ToPort, SK_TRUE);
  3460. ClearAndStartRx(pAC, FromPort);
  3461. ClearAndStartRx(pAC, ToPort);
  3462. spin_unlock_irqrestore(
  3463. &pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock, Flags);
  3464. spin_unlock_irqrestore(
  3465. &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock,
  3466. Flags);
  3467. break;
  3468. case SK_DRV_RLMT_SEND:  /* SK_MBUF *pMb */
  3469. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
  3470. ("RLS "));
  3471. pRlmtMbuf = (SK_MBUF*) Param.pParaPtr;
  3472. pMsg = (struct sk_buff*) pRlmtMbuf->pOs;
  3473. skb_put(pMsg, pRlmtMbuf->Length);
  3474. if (XmitFrame(pAC, &pAC->TxPort[pRlmtMbuf->PortIdx][TX_PRIO_LOW],
  3475.       pMsg) < 0)
  3476. DEV_KFREE_SKB_ANY(pMsg);
  3477. break;
  3478. default:
  3479. break;
  3480. }
  3481. SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
  3482. ("END EVENT "));
  3483. return (0);
  3484. } /* SkDrvEvent */
  3485. /*****************************************************************************
  3486.  *
  3487.  * SkErrorLog - log errors
  3488.  *
  3489.  * Description:
  3490.  * This function logs errors to the system buffer and to the console
  3491.  *
  3492.  * Returns:
  3493.  * 0 if everything ok
  3494.  * < 0  on error
  3495.  *
  3496.  */
  3497. void SkErrorLog(
  3498. SK_AC *pAC,
  3499. int ErrClass,
  3500. int ErrNum,
  3501. char *pErrorMsg)
  3502. {
  3503. char ClassStr[80];
  3504. switch (ErrClass) {
  3505. case SK_ERRCL_OTHER:
  3506. strcpy(ClassStr, "Other error");
  3507. break;
  3508. case SK_ERRCL_CONFIG:
  3509. strcpy(ClassStr, "Configuration error");
  3510. break;
  3511. case SK_ERRCL_INIT:
  3512. strcpy(ClassStr, "Initialization error");
  3513. break;
  3514. case SK_ERRCL_NORES:
  3515. strcpy(ClassStr, "Out of resources error");
  3516. break;
  3517. case SK_ERRCL_SW:
  3518. strcpy(ClassStr, "internal Software error");
  3519. break;
  3520. case SK_ERRCL_HW:
  3521. strcpy(ClassStr, "Hardware failure");
  3522. break;
  3523. case SK_ERRCL_COMM:
  3524. strcpy(ClassStr, "Communication error");
  3525. break;
  3526. }
  3527. printk(KERN_INFO "%s: -- ERROR --n        Class:  %sn"
  3528. "        Nr:  0x%xn        Msg:  %sn", pAC->dev[0]->name,
  3529. ClassStr, ErrNum, pErrorMsg);
  3530. } /* SkErrorLog */
  3531. #ifdef DEBUG /***************************************************************/
  3532. /* "debug only" section *****************************************************/
  3533. /****************************************************************************/
  3534. /*****************************************************************************
  3535.  *
  3536.  * DumpMsg - print a frame
  3537.  *
  3538.  * Description:
  3539.  * This function prints frames to the system logfile/to the console.
  3540.  *
  3541.  * Returns: N/A
  3542.  *
  3543.  */
  3544. static void DumpMsg(struct sk_buff *skb, char *str)
  3545. {
  3546. int msglen;
  3547. if (skb == NULL) {
  3548. printk("DumpMsg(): NULL-Messagen");
  3549. return;
  3550. }
  3551. if (skb->data == NULL) {
  3552. printk("DumpMsg(): Message emptyn");
  3553. return;
  3554. }
  3555. msglen = skb->len;
  3556. if (msglen > 64)
  3557. msglen = 64;
  3558. printk("--- Begin of message from %s , len %d (from %d) ----n", str, msglen, skb->len);
  3559. DumpData((char *)skb->data, msglen);
  3560. printk("------- End of message ---------n");
  3561. } /* DumpMsg */
  3562. /*****************************************************************************
  3563.  *
  3564.  * DumpData - print a data area
  3565.  *
  3566.  * Description:
  3567.  * This function prints a area of data to the system logfile/to the 
  3568.  * console.
  3569.  *
  3570.  * Returns: N/A
  3571.  *
  3572.  */
  3573. static void DumpData(char *p, int size)
  3574. {
  3575. register int    i;
  3576. int haddr, addr;
  3577. char hex_buffer[180];
  3578. char asc_buffer[180];
  3579. char HEXCHAR[] = "0123456789ABCDEF";
  3580. addr = 0;
  3581. haddr = 0;
  3582. hex_buffer[0] = 0;
  3583. asc_buffer[0] = 0;
  3584. for (i=0; i < size; ) {
  3585. if (*p >= '0' && *p <='z')
  3586. asc_buffer[addr] = *p;
  3587. else
  3588. asc_buffer[addr] = '.';
  3589. addr++;
  3590. asc_buffer[addr] = 0;
  3591. hex_buffer[haddr] = HEXCHAR[(*p & 0xf0) >> 4];
  3592. haddr++;
  3593. hex_buffer[haddr] = HEXCHAR[*p & 0x0f];
  3594. haddr++;
  3595. hex_buffer[haddr] = ' ';
  3596. haddr++;
  3597. hex_buffer[haddr] = 0;
  3598. p++;
  3599. i++;
  3600. if (i%16 == 0) {
  3601. printk("%s  %sn", hex_buffer, asc_buffer);
  3602. addr = 0;
  3603. haddr = 0;
  3604. }
  3605. }
  3606. } /* DumpData */
  3607. /*****************************************************************************
  3608.  *
  3609.  * DumpLong - print a data area as long values
  3610.  *
  3611.  * Description:
  3612.  * This function prints a area of data to the system logfile/to the 
  3613.  * console.
  3614.  *
  3615.  * Returns: N/A
  3616.  *
  3617.  */
  3618. static void DumpLong(char *pc, int size)
  3619. {
  3620. register int    i;
  3621. int haddr, addr;
  3622. char hex_buffer[180];
  3623. char asc_buffer[180];
  3624. char HEXCHAR[] = "0123456789ABCDEF";
  3625. long *p;
  3626. int l;
  3627. addr = 0;
  3628. haddr = 0;
  3629. hex_buffer[0] = 0;
  3630. asc_buffer[0] = 0;
  3631. p = (long*) pc;
  3632. for (i=0; i < size; ) {
  3633. l = (long) *p;
  3634. hex_buffer[haddr] = HEXCHAR[(l >> 28) & 0xf];
  3635. haddr++;
  3636. hex_buffer[haddr] = HEXCHAR[(l >> 24) & 0xf];
  3637. haddr++;
  3638. hex_buffer[haddr] = HEXCHAR[(l >> 20) & 0xf];
  3639. haddr++;
  3640. hex_buffer[haddr] = HEXCHAR[(l >> 16) & 0xf];
  3641. haddr++;
  3642. hex_buffer[haddr] = HEXCHAR[(l >> 12) & 0xf];
  3643. haddr++;
  3644. hex_buffer[haddr] = HEXCHAR[(l >> 8) & 0xf];
  3645. haddr++;
  3646. hex_buffer[haddr] = HEXCHAR[(l >> 4) & 0xf];
  3647. haddr++;
  3648. hex_buffer[haddr] = HEXCHAR[l & 0x0f];
  3649. haddr++;
  3650. hex_buffer[haddr] = ' ';
  3651. haddr++;
  3652. hex_buffer[haddr] = 0;
  3653. p++;
  3654. i++;
  3655. if (i%8 == 0) {
  3656. printk("%4x %sn", (i-8)*4, hex_buffer);
  3657. haddr = 0;
  3658. }
  3659. }
  3660. printk("------------------------n");
  3661. } /* DumpLong */
  3662. #endif /* DEBUG */
  3663. /*
  3664.  * Local variables:
  3665.  * compile-command: "make"
  3666.  * End:
  3667.  */