di_defs.h revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Copyright (c) Eicon Networks, 2002.
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  This source file is supplied for the use with
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Eicon Networks range of DIVA Server Adapters.
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Eicon File Revision :    2.1
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  This program is free software; you can redistribute it and/or modify
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  it under the terms of the GNU General Public License as published by
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  the Free Software Foundation; either version 2, or (at your option)
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  any later version.
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  This program is distributed in the hope that it will be useful,
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  See the GNU General Public License for more details.
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  You should have received a copy of the GNU General Public License
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  along with this program; if not, write to the Free Software
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _DI_DEFS_
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _DI_DEFS_
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        /* typedefs for our data structures                         */
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct get_name_s GET_NAME;
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*  The entity_s structure is used to pass all
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    parameters between application and IDI   */
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct entity_s ENTITY;
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct buffers_s BUFFERS;
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct postcall_s POSTCALL;
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct get_para_s GET_PARA;
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BOARD_NAME_LENGTH 9
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IDI_CALL_LINK_T
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IDI_CALL_ENTITY_T
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* typedef void ( * IDI_CALL)(ENTITY *); */
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* --------------------------------------------------------
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    IDI_CALL
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   -------------------------------------------------------- */
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef void (IDI_CALL_LINK_T * IDI_CALL)(ENTITY IDI_CALL_ENTITY_T *);
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word length;          /* length of data/parameter field           */
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte P[270];          /* data/parameter field                     */
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} DBUFFER;
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct get_name_s {
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word command;         /* command = 0x0100 */
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte name[BOARD_NAME_LENGTH];
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct postcall_s {
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word      command;                           /* command = 0x0300 */
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word      dummy;                             /* not used */
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  void      (  * callback)(void   *);      /* call back */
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  void    *context;                          /* context pointer */
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define REQ_PARA            0x0600   /* request command line parameters */
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define REQ_PARA_LEN             1   /* number of data bytes */
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define L1_STARTUP_DOWN_POS      0   /* '-y' command line parameter in......*/
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define L1_STARTUP_DOWN_MSK   0x01   /* first byte position (index 0) with value 0x01 */
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct get_para_s {
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word  command;            /* command = 0x0600 */
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte  len;                /* max length of para field in bytes */
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte  para[REQ_PARA_LEN]; /* parameter field */
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct buffers_s {
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word PLength;
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte   * P;
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct entity_s {
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  Req;            /* pending request          */
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  Rc;             /* return code received     */
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  Ind;            /* indication received      */
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  ReqCh;          /* channel of current Req   */
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  RcCh;           /* channel of current Rc    */
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  IndCh;          /* channel of current Ind   */
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  Id;             /* ID used by this entity   */
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  GlobalId;       /* reserved field           */
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  XNum;           /* number of X-buffers      */
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  RNum;           /* number of R-buffers      */
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  BUFFERS                 * X;        /* pointer to X-buffer list */
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  BUFFERS                 * R;        /* pointer to R-buffer list */
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word                  RLength;        /* length of current R-data */
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  DBUFFER   *         RBuffer;        /* buffer of current R-data */
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  RNR;            /* receive not ready flag   */
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  complete;       /* receive complete status  */
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  IDI_CALL              callback;
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word                  user[2];
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        /* fields used by the driver internally                     */
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  No;             /* entity number            */
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  reserved2;      /* reserved field           */
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  More;           /* R/X More flags           */
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  MInd;           /* MDATA coding for this ID */
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  XCurrent;       /* current transmit buffer  */
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  RCurrent;       /* current receive buffer   */
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word                  XOffset;        /* offset in x-buffer       */
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word                  ROffset;        /* offset in r-buffer       */
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  type;
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte                  channels;
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word                  features;
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  IDI_CALL              request;
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} DESCRIPTOR;
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        /* descriptor type field coding */
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IDI_ADAPTER_S           1
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IDI_ADAPTER_PR          2
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IDI_ADAPTER_DIVA        3
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IDI_ADAPTER_MAESTRA     4
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IDI_VADAPTER            0x40
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IDI_DRIVER              0x80
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IDI_DADAPTER            0xfd
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IDI_DIDDPNP             0xfe
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IDI_DIMAINT             0xff
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        /* Hardware IDs ISA PNP */
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA_PRO     3    /* same as IDI_ADAPTER_DIVA    */
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_MAESTRA      4    /* same as IDI_ADAPTER_MAESTRA */
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_PICCOLA      5
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA_PRO20   6
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA20       7
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA_PRO20_U 8
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA20_U     9
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA30       10
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA30_U     11
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        /* Hardware IDs PCI */
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_EICON_PCI              0x1133
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_SIEMENS_PCI            0x8001 /* unused SubVendor ID for Siemens Cornet-N cards */
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_PROTTYPE_CORNETN       0x0014 /* SubDevice ID for Siemens Cornet-N cards */
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_FUJITSU_SIEMENS_PCI    0x110A /* SubVendor ID for Fujitsu Siemens */
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_GS03_PCI               0x0021 /* SubDevice ID for Fujitsu Siemens ISDN S0 card */
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA_PRO20_PCI         0xe001
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA20_PCI             0xe002
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA_PRO20_PCI_U       0xe003
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA20_PCI_U           0xe004
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA201_PCI            0xe005
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA_CT_ST             0xe006
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA_CT_U              0xe007
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA_CTL_ST            0xe008
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA_CTL_U             0xe009
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA_ISDN_V90_PCI      0xe00a
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA202_PCI_ST         0xe00b
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA202_PCI_U          0xe00c
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA_PRO30_PCI         0xe00d
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_MAESTRA_PCI            0xe010
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_MAESTRAQ_PCI           0xe012
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DSRV_Q8M_V2_PCI        0xe013
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_MAESTRAP_PCI           0xe014
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DSRV_P30M_V2_PCI       0xe015
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DSRV_VOICE_Q8M_PCI     0xe016
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DSRV_VOICE_Q8M_V2_PCI  0xe017
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DSRV_B2M_V2_PCI        0xe018
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DSRV_VOICE_P30M_V2_PCI 0xe019
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DSRV_B2F_PCI           0xe01a
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DSRV_VOICE_B2M_V2_PCI  0xe01b
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        /* Hardware IDs USB */
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EICON_USB_VENDOR_ID          0x071D
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA_USB_REV1          0x1000
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_DIVA_USB_REV2          0x1003
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_TELEDAT_SURF_USB_REV2  0x1004
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HW_ID_TELEDAT_SURF_USB_REV1  0x2000
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* --------------------------------------------------------------------------
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Adapter array change notification framework
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  -------------------------------------------------------------------------- */
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef void (IDI_CALL_LINK_T* didd_adapter_change_callback_t)(     void IDI_CALL_ENTITY_T * context, DESCRIPTOR* adapter, int removal);
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* -------------------------------------------------------------------------- */
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DI_VOICE          0x0 /* obsolete define */
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DI_FAX3           0x1
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DI_MODEM          0x2
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DI_POST           0x4
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DI_V110           0x8
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DI_V120           0x10
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DI_POTS           0x20
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DI_CODEC          0x40
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DI_MANAGE         0x80
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DI_V_42           0x0100
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DI_EXTD_FAX       0x0200 /* Extended FAX (ECM, 2D, T.6, Polling) */
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DI_AT_PARSER      0x0400 /* Build-in AT Parser in the L2 */
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DI_VOICE_OVER_IP  0x0800 /* Voice over IP support */
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef void (IDI_CALL_LINK_T* _IDI_CALL)(void*, ENTITY*);
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
182