Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * Network device driver for Cell Processor-Based Blade and Celleb platform
0004  *
0005  * (C) Copyright IBM Corp. 2005
0006  * (C) Copyright 2006 TOSHIBA CORPORATION
0007  *
0008  * Authors : Utz Bacher <utz.bacher@de.ibm.com>
0009  *           Jens Osterkamp <Jens.Osterkamp@de.ibm.com>
0010  */
0011 
0012 #ifndef _SPIDER_NET_H
0013 #define _SPIDER_NET_H
0014 
0015 #define VERSION "2.0 B"
0016 
0017 #include <linux/sungem_phy.h>
0018 
0019 int spider_net_stop(struct net_device *netdev);
0020 int spider_net_open(struct net_device *netdev);
0021 
0022 extern const struct ethtool_ops spider_net_ethtool_ops;
0023 
0024 extern char spider_net_driver_name[];
0025 
0026 #define SPIDER_NET_MAX_FRAME            2312
0027 #define SPIDER_NET_MAX_MTU          2294
0028 #define SPIDER_NET_MIN_MTU          64
0029 
0030 #define SPIDER_NET_RXBUF_ALIGN          128
0031 
0032 #define SPIDER_NET_RX_DESCRIPTORS_DEFAULT   256
0033 #define SPIDER_NET_RX_DESCRIPTORS_MIN       16
0034 #define SPIDER_NET_RX_DESCRIPTORS_MAX       512
0035 
0036 #define SPIDER_NET_TX_DESCRIPTORS_DEFAULT   256
0037 #define SPIDER_NET_TX_DESCRIPTORS_MIN       16
0038 #define SPIDER_NET_TX_DESCRIPTORS_MAX       512
0039 
0040 #define SPIDER_NET_TX_TIMER         (HZ/5)
0041 #define SPIDER_NET_ANEG_TIMER           (HZ)
0042 #define SPIDER_NET_ANEG_TIMEOUT         5
0043 
0044 #define SPIDER_NET_RX_CSUM_DEFAULT      1
0045 
0046 #define SPIDER_NET_WATCHDOG_TIMEOUT     50*HZ
0047 
0048 #define SPIDER_NET_FIRMWARE_SEQS    6
0049 #define SPIDER_NET_FIRMWARE_SEQWORDS    1024
0050 #define SPIDER_NET_FIRMWARE_LEN     (SPIDER_NET_FIRMWARE_SEQS * \
0051                      SPIDER_NET_FIRMWARE_SEQWORDS * \
0052                      sizeof(u32))
0053 #define SPIDER_NET_FIRMWARE_NAME    "spider_fw.bin"
0054 
0055 /** spider_net SMMIO registers */
0056 #define SPIDER_NET_GHIINT0STS       0x00000000
0057 #define SPIDER_NET_GHIINT1STS       0x00000004
0058 #define SPIDER_NET_GHIINT2STS       0x00000008
0059 #define SPIDER_NET_GHIINT0MSK       0x00000010
0060 #define SPIDER_NET_GHIINT1MSK       0x00000014
0061 #define SPIDER_NET_GHIINT2MSK       0x00000018
0062 
0063 #define SPIDER_NET_GRESUMINTNUM     0x00000020
0064 #define SPIDER_NET_GREINTNUM        0x00000024
0065 
0066 #define SPIDER_NET_GFFRMNUM     0x00000028
0067 #define SPIDER_NET_GFAFRMNUM        0x0000002c
0068 #define SPIDER_NET_GFBFRMNUM        0x00000030
0069 #define SPIDER_NET_GFCFRMNUM        0x00000034
0070 #define SPIDER_NET_GFDFRMNUM        0x00000038
0071 
0072 /* clear them (don't use it) */
0073 #define SPIDER_NET_GFREECNNUM       0x0000003c
0074 #define SPIDER_NET_GONETIMENUM      0x00000040
0075 
0076 #define SPIDER_NET_GTOUTFRMNUM      0x00000044
0077 
0078 #define SPIDER_NET_GTXMDSET     0x00000050
0079 #define SPIDER_NET_GPCCTRL      0x00000054
0080 #define SPIDER_NET_GRXMDSET     0x00000058
0081 #define SPIDER_NET_GIPSECINIT       0x0000005c
0082 #define SPIDER_NET_GFTRESTRT        0x00000060
0083 #define SPIDER_NET_GRXDMAEN     0x00000064
0084 #define SPIDER_NET_GMRWOLCTRL       0x00000068
0085 #define SPIDER_NET_GPCWOPCMD        0x0000006c
0086 #define SPIDER_NET_GPCROPCMD        0x00000070
0087 #define SPIDER_NET_GTTFRMCNT        0x00000078
0088 #define SPIDER_NET_GTESTMD      0x0000007c
0089 
0090 #define SPIDER_NET_GSINIT       0x00000080
0091 #define SPIDER_NET_GSnPRGADR        0x00000084
0092 #define SPIDER_NET_GSnPRGDAT        0x00000088
0093 
0094 #define SPIDER_NET_GMACOPEMD        0x00000100
0095 #define SPIDER_NET_GMACLENLMT       0x00000108
0096 #define SPIDER_NET_GMACST       0x00000110
0097 #define SPIDER_NET_GMACINTEN        0x00000118
0098 #define SPIDER_NET_GMACPHYCTRL      0x00000120
0099 
0100 #define SPIDER_NET_GMACAPAUSE       0x00000154
0101 #define SPIDER_NET_GMACTXPAUSE      0x00000164
0102 
0103 #define SPIDER_NET_GMACMODE     0x000001b0
0104 #define SPIDER_NET_GMACBSTLMT       0x000001b4
0105 
0106 #define SPIDER_NET_GMACUNIMACU      0x000001c0
0107 #define SPIDER_NET_GMACUNIMACL      0x000001c8
0108 
0109 #define SPIDER_NET_GMRMHFILnR       0x00000400
0110 #define SPIDER_NET_MULTICAST_HASHES 256
0111 
0112 #define SPIDER_NET_GMRUAFILnR       0x00000500
0113 #define SPIDER_NET_GMRUA0FIL15R     0x00000578
0114 
0115 #define SPIDER_NET_GTTQMSK      0x00000934
0116 
0117 /* RX DMA controller registers, all 0x00000a.. are for DMA controller A,
0118  * 0x00000b.. for DMA controller B, etc. */
0119 #define SPIDER_NET_GDADCHA      0x00000a00
0120 #define SPIDER_NET_GDADMACCNTR      0x00000a04
0121 #define SPIDER_NET_GDACTDPA     0x00000a08
0122 #define SPIDER_NET_GDACTDCNT        0x00000a0c
0123 #define SPIDER_NET_GDACDBADDR       0x00000a20
0124 #define SPIDER_NET_GDACDBSIZE       0x00000a24
0125 #define SPIDER_NET_GDACNEXTDA       0x00000a28
0126 #define SPIDER_NET_GDACCOMST        0x00000a2c
0127 #define SPIDER_NET_GDAWBCOMST       0x00000a30
0128 #define SPIDER_NET_GDAWBRSIZE       0x00000a34
0129 #define SPIDER_NET_GDAWBVSIZE       0x00000a38
0130 #define SPIDER_NET_GDAWBTRST        0x00000a3c
0131 #define SPIDER_NET_GDAWBTRERR       0x00000a40
0132 
0133 /* TX DMA controller registers */
0134 #define SPIDER_NET_GDTDCHA      0x00000e00
0135 #define SPIDER_NET_GDTDMACCNTR      0x00000e04
0136 #define SPIDER_NET_GDTCDPA      0x00000e08
0137 #define SPIDER_NET_GDTDMASEL        0x00000e14
0138 
0139 #define SPIDER_NET_ECMODE       0x00000f00
0140 /* clock and reset control register */
0141 #define SPIDER_NET_CKRCTRL      0x00000ff0
0142 
0143 /** SCONFIG registers */
0144 #define SPIDER_NET_SCONFIG_IOACTE   0x00002810
0145 
0146 /** interrupt mask registers */
0147 #define SPIDER_NET_INT0_MASK_VALUE  0x3f7fe2c7
0148 #define SPIDER_NET_INT1_MASK_VALUE  0x0000fff2
0149 #define SPIDER_NET_INT2_MASK_VALUE  0x000003f1
0150 
0151 /* we rely on flagged descriptor interrupts */
0152 #define SPIDER_NET_FRAMENUM_VALUE   0x00000000
0153 /* set this first, then the FRAMENUM_VALUE */
0154 #define SPIDER_NET_GFXFRAMES_VALUE  0x00000000
0155 
0156 #define SPIDER_NET_STOP_SEQ_VALUE   0x00000000
0157 #define SPIDER_NET_RUN_SEQ_VALUE    0x0000007e
0158 
0159 #define SPIDER_NET_PHY_CTRL_VALUE   0x00040040
0160 /* #define SPIDER_NET_PHY_CTRL_VALUE    0x01070080*/
0161 #define SPIDER_NET_RXMODE_VALUE     0x00000011
0162 /* auto retransmission in case of MAC aborts */
0163 #define SPIDER_NET_TXMODE_VALUE     0x00010000
0164 #define SPIDER_NET_RESTART_VALUE    0x00000000
0165 #define SPIDER_NET_WOL_VALUE        0x00001111
0166 #if 0
0167 #define SPIDER_NET_WOL_VALUE        0x00000000
0168 #endif
0169 #define SPIDER_NET_IPSECINIT_VALUE  0x6f716f71
0170 
0171 /* pause frames: automatic, no upper retransmission count */
0172 /* outside loopback mode: ETOMOD signal dont matter, not connected */
0173 /* ETOMOD signal is brought to PHY reset. bit 2 must be 1 in Celleb */
0174 #define SPIDER_NET_OPMODE_VALUE     0x00000067
0175 /*#define SPIDER_NET_OPMODE_VALUE       0x001b0062*/
0176 #define SPIDER_NET_LENLMT_VALUE     0x00000908
0177 
0178 #define SPIDER_NET_MACAPAUSE_VALUE  0x00000800 /* about 1 ms */
0179 #define SPIDER_NET_TXPAUSE_VALUE    0x00000000
0180 
0181 #define SPIDER_NET_MACMODE_VALUE    0x00000001
0182 #define SPIDER_NET_BURSTLMT_VALUE   0x00000200 /* about 16 us */
0183 
0184 /* DMAC control register GDMACCNTR
0185  *
0186  * 1(0)             enable r/tx dma
0187  *  0000000             fixed to 0
0188  *
0189  *         000000           fixed to 0
0190  *               0(1)           en/disable descr writeback on force end
0191  *                0(1)          force end
0192  *
0193  *                 000000       fixed to 0
0194  *                       00     burst alignment: 128 bytes
0195  *                       11     burst alignment: 1024 bytes
0196  *
0197  *                         00000    fixed to 0
0198  *                              0   descr writeback size 32 bytes
0199  *                               0(1)   descr chain end interrupt enable
0200  *                                0(1)  descr status writeback enable */
0201 
0202 /* to set RX_DMA_EN */
0203 #define SPIDER_NET_DMA_RX_VALUE     0x80000000
0204 #define SPIDER_NET_DMA_RX_FEND_VALUE    0x00030003
0205 /* to set TX_DMA_EN */
0206 #define SPIDER_NET_TX_DMA_EN           0x80000000
0207 #define SPIDER_NET_GDTBSTA             0x00000300
0208 #define SPIDER_NET_GDTDCEIDIS          0x00000002
0209 #define SPIDER_NET_DMA_TX_VALUE        SPIDER_NET_TX_DMA_EN | \
0210                                        SPIDER_NET_GDTDCEIDIS | \
0211                                        SPIDER_NET_GDTBSTA
0212 
0213 #define SPIDER_NET_DMA_TX_FEND_VALUE    0x00030003
0214 
0215 /* SPIDER_NET_UA_DESCR_VALUE is OR'ed with the unicast address */
0216 #define SPIDER_NET_UA_DESCR_VALUE   0x00080000
0217 #define SPIDER_NET_PROMISC_VALUE    0x00080000
0218 #define SPIDER_NET_NONPROMISC_VALUE 0x00000000
0219 
0220 #define SPIDER_NET_DMASEL_VALUE     0x00000001
0221 
0222 #define SPIDER_NET_ECMODE_VALUE     0x00000000
0223 
0224 #define SPIDER_NET_CKRCTRL_RUN_VALUE    0x1fff010f
0225 #define SPIDER_NET_CKRCTRL_STOP_VALUE   0x0000010f
0226 
0227 #define SPIDER_NET_SBIMSTATE_VALUE  0x00000000
0228 #define SPIDER_NET_SBTMSTATE_VALUE  0x00000000
0229 
0230 /* SPIDER_NET_GHIINT0STS bits, in reverse order so that they can be used
0231  * with 1 << SPIDER_NET_... */
0232 enum spider_net_int0_status {
0233     SPIDER_NET_GPHYINT = 0,
0234     SPIDER_NET_GMAC2INT,
0235     SPIDER_NET_GMAC1INT,
0236     SPIDER_NET_GIPSINT,
0237     SPIDER_NET_GFIFOINT,
0238     SPIDER_NET_GDMACINT,
0239     SPIDER_NET_GSYSINT,
0240     SPIDER_NET_GPWOPCMPINT,
0241     SPIDER_NET_GPROPCMPINT,
0242     SPIDER_NET_GPWFFINT,
0243     SPIDER_NET_GRMDADRINT,
0244     SPIDER_NET_GRMARPINT,
0245     SPIDER_NET_GRMMPINT,
0246     SPIDER_NET_GDTDEN0INT,
0247     SPIDER_NET_GDDDEN0INT,
0248     SPIDER_NET_GDCDEN0INT,
0249     SPIDER_NET_GDBDEN0INT,
0250     SPIDER_NET_GDADEN0INT,
0251     SPIDER_NET_GDTFDCINT,
0252     SPIDER_NET_GDDFDCINT,
0253     SPIDER_NET_GDCFDCINT,
0254     SPIDER_NET_GDBFDCINT,
0255     SPIDER_NET_GDAFDCINT,
0256     SPIDER_NET_GTTEDINT,
0257     SPIDER_NET_GDTDCEINT,
0258     SPIDER_NET_GRFDNMINT,
0259     SPIDER_NET_GRFCNMINT,
0260     SPIDER_NET_GRFBNMINT,
0261     SPIDER_NET_GRFANMINT,
0262     SPIDER_NET_GRFNMINT,
0263     SPIDER_NET_G1TMCNTINT,
0264     SPIDER_NET_GFREECNTINT
0265 };
0266 /* GHIINT1STS bits */
0267 enum spider_net_int1_status {
0268     SPIDER_NET_GTMFLLINT = 0,
0269     SPIDER_NET_GRMFLLINT,
0270     SPIDER_NET_GTMSHTINT,
0271     SPIDER_NET_GDTINVDINT,
0272     SPIDER_NET_GRFDFLLINT,
0273     SPIDER_NET_GDDDCEINT,
0274     SPIDER_NET_GDDINVDINT,
0275     SPIDER_NET_GRFCFLLINT,
0276     SPIDER_NET_GDCDCEINT,
0277     SPIDER_NET_GDCINVDINT,
0278     SPIDER_NET_GRFBFLLINT,
0279     SPIDER_NET_GDBDCEINT,
0280     SPIDER_NET_GDBINVDINT,
0281     SPIDER_NET_GRFAFLLINT,
0282     SPIDER_NET_GDADCEINT,
0283     SPIDER_NET_GDAINVDINT,
0284     SPIDER_NET_GDTRSERINT,
0285     SPIDER_NET_GDDRSERINT,
0286     SPIDER_NET_GDCRSERINT,
0287     SPIDER_NET_GDBRSERINT,
0288     SPIDER_NET_GDARSERINT,
0289     SPIDER_NET_GDSERINT,
0290     SPIDER_NET_GDTPTERINT,
0291     SPIDER_NET_GDDPTERINT,
0292     SPIDER_NET_GDCPTERINT,
0293     SPIDER_NET_GDBPTERINT,
0294     SPIDER_NET_GDAPTERINT
0295 };
0296 /* GHIINT2STS bits */
0297 enum spider_net_int2_status {
0298     SPIDER_NET_GPROPERINT = 0,
0299     SPIDER_NET_GMCTCRSNGINT,
0300     SPIDER_NET_GMCTLCOLINT,
0301     SPIDER_NET_GMCTTMOTINT,
0302     SPIDER_NET_GMCRCAERINT,
0303     SPIDER_NET_GMCRCALERINT,
0304     SPIDER_NET_GMCRALNERINT,
0305     SPIDER_NET_GMCROVRINT,
0306     SPIDER_NET_GMCRRNTINT,
0307     SPIDER_NET_GMCRRXERINT,
0308     SPIDER_NET_GTITCSERINT,
0309     SPIDER_NET_GTIFMTERINT,
0310     SPIDER_NET_GTIPKTRVKINT,
0311     SPIDER_NET_GTISPINGINT,
0312     SPIDER_NET_GTISADNGINT,
0313     SPIDER_NET_GTISPDNGINT,
0314     SPIDER_NET_GRIFMTERINT,
0315     SPIDER_NET_GRIPKTRVKINT,
0316     SPIDER_NET_GRISPINGINT,
0317     SPIDER_NET_GRISADNGINT,
0318     SPIDER_NET_GRISPDNGINT
0319 };
0320 
0321 #define SPIDER_NET_TXINT    (1 << SPIDER_NET_GDTFDCINT)
0322 
0323 /* We rely on flagged descriptor interrupts */
0324 #define SPIDER_NET_RXINT    ( (1 << SPIDER_NET_GDAFDCINT) )
0325 
0326 #define SPIDER_NET_LINKINT  ( 1 << SPIDER_NET_GMAC2INT )
0327 
0328 #define SPIDER_NET_ERRINT   ( 0xffffffff & \
0329                   (~SPIDER_NET_TXINT) & \
0330                   (~SPIDER_NET_RXINT) & \
0331                   (~SPIDER_NET_LINKINT) )
0332 
0333 #define SPIDER_NET_GPREXEC          0x80000000
0334 #define SPIDER_NET_GPRDAT_MASK          0x0000ffff
0335 
0336 #define SPIDER_NET_DMAC_NOINTR_COMPLETE     0x00800000
0337 #define SPIDER_NET_DMAC_TXFRMTL     0x00040000
0338 #define SPIDER_NET_DMAC_TCP         0x00020000
0339 #define SPIDER_NET_DMAC_UDP         0x00030000
0340 #define SPIDER_NET_TXDCEST          0x08000000
0341 
0342 #define SPIDER_NET_DESCR_RXFDIS        0x00000001
0343 #define SPIDER_NET_DESCR_RXDCEIS       0x00000002
0344 #define SPIDER_NET_DESCR_RXDEN0IS      0x00000004
0345 #define SPIDER_NET_DESCR_RXINVDIS      0x00000008
0346 #define SPIDER_NET_DESCR_RXRERRIS      0x00000010
0347 #define SPIDER_NET_DESCR_RXFDCIMS      0x00000100
0348 #define SPIDER_NET_DESCR_RXDCEIMS      0x00000200
0349 #define SPIDER_NET_DESCR_RXDEN0IMS     0x00000400
0350 #define SPIDER_NET_DESCR_RXINVDIMS     0x00000800
0351 #define SPIDER_NET_DESCR_RXRERRMIS     0x00001000
0352 #define SPIDER_NET_DESCR_UNUSED        0x077fe0e0
0353 
0354 #define SPIDER_NET_DESCR_IND_PROC_MASK      0xF0000000
0355 #define SPIDER_NET_DESCR_COMPLETE       0x00000000 /* used in rx and tx */
0356 #define SPIDER_NET_DESCR_RESPONSE_ERROR     0x10000000 /* used in rx and tx */
0357 #define SPIDER_NET_DESCR_PROTECTION_ERROR   0x20000000 /* used in rx and tx */
0358 #define SPIDER_NET_DESCR_FRAME_END      0x40000000 /* used in rx */
0359 #define SPIDER_NET_DESCR_FORCE_END      0x50000000 /* used in rx and tx */
0360 #define SPIDER_NET_DESCR_CARDOWNED      0xA0000000 /* used in rx and tx */
0361 #define SPIDER_NET_DESCR_NOT_IN_USE     0xF0000000
0362 #define SPIDER_NET_DESCR_TXDESFLG       0x00800000
0363 
0364 #define SPIDER_NET_DESCR_BAD_STATUS   (SPIDER_NET_DESCR_RXDEN0IS | \
0365                                        SPIDER_NET_DESCR_RXRERRIS | \
0366                                        SPIDER_NET_DESCR_RXDEN0IMS | \
0367                                        SPIDER_NET_DESCR_RXINVDIMS | \
0368                                        SPIDER_NET_DESCR_RXRERRMIS | \
0369                                        SPIDER_NET_DESCR_UNUSED)
0370 
0371 /* Descriptor, as defined by the hardware */
0372 struct spider_net_hw_descr {
0373     u32 buf_addr;
0374     u32 buf_size;
0375     u32 next_descr_addr;
0376     u32 dmac_cmd_status;
0377     u32 result_size;
0378     u32 valid_size; /* all zeroes for tx */
0379     u32 data_status;
0380     u32 data_error; /* all zeroes for tx */
0381 } __attribute__((aligned(32)));
0382 
0383 struct spider_net_descr {
0384     struct spider_net_hw_descr *hwdescr;
0385     struct sk_buff *skb;
0386     u32 bus_addr;
0387     struct spider_net_descr *next;
0388     struct spider_net_descr *prev;
0389 };
0390 
0391 struct spider_net_descr_chain {
0392     spinlock_t lock;
0393     struct spider_net_descr *head;
0394     struct spider_net_descr *tail;
0395     struct spider_net_descr *ring;
0396     int num_desc;
0397     struct spider_net_hw_descr *hwring;
0398     dma_addr_t dma_addr;
0399 };
0400 
0401 /* descriptor data_status bits */
0402 #define SPIDER_NET_RX_IPCHK     29
0403 #define SPIDER_NET_RX_TCPCHK        28
0404 #define SPIDER_NET_VLAN_PACKET      21
0405 #define SPIDER_NET_DATA_STATUS_CKSUM_MASK ( (1 << SPIDER_NET_RX_IPCHK) | \
0406                       (1 << SPIDER_NET_RX_TCPCHK) )
0407 
0408 /* descriptor data_error bits */
0409 #define SPIDER_NET_RX_IPCHKERR      27
0410 #define SPIDER_NET_RX_RXTCPCHKERR   28
0411 
0412 #define SPIDER_NET_DATA_ERR_CKSUM_MASK  (1 << SPIDER_NET_RX_IPCHKERR)
0413 
0414 /* the cases we don't pass the packet to the stack.
0415  * 701b8000 would be correct, but every packets gets that flag */
0416 #define SPIDER_NET_DESTROY_RX_FLAGS 0x700b8000
0417 
0418 #define SPIDER_NET_DEFAULT_MSG      ( NETIF_MSG_DRV | \
0419                       NETIF_MSG_PROBE | \
0420                       NETIF_MSG_LINK | \
0421                       NETIF_MSG_TIMER | \
0422                       NETIF_MSG_IFDOWN | \
0423                       NETIF_MSG_IFUP | \
0424                       NETIF_MSG_RX_ERR | \
0425                       NETIF_MSG_TX_ERR | \
0426                       NETIF_MSG_TX_QUEUED | \
0427                       NETIF_MSG_INTR | \
0428                       NETIF_MSG_TX_DONE | \
0429                       NETIF_MSG_RX_STATUS | \
0430                       NETIF_MSG_PKTDATA | \
0431                       NETIF_MSG_HW | \
0432                       NETIF_MSG_WOL )
0433 
0434 struct spider_net_extra_stats {
0435     unsigned long rx_desc_error;
0436     unsigned long tx_timeouts;
0437     unsigned long alloc_rx_skb_error;
0438     unsigned long rx_iommu_map_error;
0439     unsigned long tx_iommu_map_error;
0440     unsigned long rx_desc_unk_state;
0441 };
0442 
0443 struct spider_net_card {
0444     struct net_device *netdev;
0445     struct pci_dev *pdev;
0446     struct mii_phy phy;
0447 
0448     struct napi_struct napi;
0449 
0450     int medium;
0451 
0452     void __iomem *regs;
0453 
0454     struct spider_net_descr_chain tx_chain;
0455     struct spider_net_descr_chain rx_chain;
0456     struct spider_net_descr *low_watermark;
0457 
0458     int aneg_count;
0459     struct timer_list aneg_timer;
0460     struct timer_list tx_timer;
0461     struct work_struct tx_timeout_task;
0462     atomic_t tx_timeout_task_counter;
0463     wait_queue_head_t waitq;
0464     int num_rx_ints;
0465     int ignore_rx_ramfull;
0466 
0467     /* for ethtool */
0468     int msg_enable;
0469     struct spider_net_extra_stats spider_stats;
0470 
0471     /* Must be last item in struct */
0472     struct spider_net_descr darray[];
0473 };
0474 
0475 #endif