skge.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:114k
源码类别:

嵌入式Linux

开发平台:

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