kernel/eka/include/drivers/ethernet.h
changeset 9 96e5fb8b040d
equal deleted inserted replaced
-1:000000000000 9:96e5fb8b040d
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:
       
    15 *
       
    16 */
       
    17 // Ethernet.h
       
    18 //
       
    19 //
       
    20 /** @file ethernet.h
       
    21 Base classes for implementating ethernet support (Kernel-side only)
       
    22 @internalComponent
       
    23 */
       
    24 
       
    25 #ifndef __ETHERNET_H__
       
    26 #define __ETHERNET_H__
       
    27 #include <platform.h>
       
    28 #include <d32ethernet.h>
       
    29 #include <e32ver.h>
       
    30 
       
    31 /** @addtogroup enet Ethernet Drivers
       
    32  *  Kernel Ethernet Support
       
    33  */
       
    34 
       
    35 /** @addtogroup enet_ldd Driver LDD's
       
    36  * @ingroup enet
       
    37  */
       
    38 
       
    39 const TInt KEthernetMajorVersionNumber = 1;
       
    40 const TInt KEthernetMinorVersionNumber = 0;
       
    41 const TInt KEthernetBuildVersionNumber = KE32BuildVersionNumber;
       
    42 
       
    43 /**
       
    44 	@publishedPartner
       
    45 	@released
       
    46 */
       
    47 const TInt KTxWorkBudgetLimit  = 10;
       
    48 
       
    49 // Card Rx constants.
       
    50 const TInt KNumRXBuffers       = 40;
       
    51 /**
       
    52 	@publishedPartner
       
    53 	@released
       
    54 */
       
    55 const TInt KIRQWorkBudgetLimit = 4;
       
    56 /**
       
    57 	@publishedPartner
       
    58 	@released
       
    59 */
       
    60 const TInt KRxWorkBudgetLimit  = 6;
       
    61 
       
    62 /**
       
    63 	@publishedPartner
       
    64 	@released
       
    65 */
       
    66 const TInt KMaxEthernetPacket = 1518;
       
    67 /**
       
    68 	@publishedPartner
       
    69 	@released
       
    70 */
       
    71 const TUint16 CRC_LEN = 4;
       
    72 
       
    73 /** @addtogroup enet_pdd Driver PDD's
       
    74  * @ingroup enet
       
    75  * @{
       
    76  */
       
    77 
       
    78 /**
       
    79     Different Stop Modes
       
    80 	@publishedPartner
       
    81 	@released
       
    82  */
       
    83 enum TStopMode 
       
    84     {
       
    85     EStopNormal,    /**< Finish sending and then stop */
       
    86     EStopEmergency  /**< Just stop now */
       
    87     };
       
    88 
       
    89 
       
    90 class DChannelEthernet;
       
    91 
       
    92 
       
    93 /**
       
    94 	Ethernet driver base class
       
    95 	The base class for an ethernet driver that doesn't support power control
       
    96 	@publishedPartner
       
    97 	@released
       
    98 */
       
    99 class DEthernet : public DBase
       
   100     {
       
   101     public:
       
   102     /**
       
   103      * Start receiving frames
       
   104      * @return KErrNone if driver started
       
   105      */
       
   106     virtual TInt Start() =0;
       
   107     /**
       
   108      * Stop receiving frames
       
   109      * @param aMode The stop mode
       
   110      */
       
   111     virtual void Stop(TStopMode aMode) =0;
       
   112 
       
   113     /**
       
   114      * Validate a new config
       
   115      * Validates a new configuration should be called before Configure
       
   116      * @param aConfig is the configuration to be validated
       
   117      * @return ETrue or EFalse if the Configuration is allowed
       
   118      * @see Configure()
       
   119      */
       
   120     virtual TInt ValidateConfig(const TEthernetConfigV01 &aConfig) const =0;
       
   121     /**
       
   122      * Configure the device
       
   123      * Reconfigure the device using the new configuration supplied.
       
   124      * This should not change the MAC address.
       
   125      * @param aConfig The new configuration
       
   126      * @see ValidateConfig()
       
   127      * @see MacConfigure()
       
   128      */
       
   129     virtual TInt Configure(TEthernetConfigV01 &aConfig) =0;
       
   130     /**
       
   131      * Change the MAC address
       
   132      * Attempt to change the MAC address of the device
       
   133      * @param aConfig A Configuration containing the new MAC
       
   134      * @see Configure()
       
   135      */
       
   136     virtual void MacConfigure(TEthernetConfigV01 &aConfig) =0;
       
   137     /**
       
   138      * Get the current config from the chip
       
   139      * This returns the current configuration of the chip with the folling fields
       
   140      * The Transmit Speed
       
   141      * The Duplex Setting
       
   142      * The MAC address
       
   143      * @param aConfig is a TEthernetConfigV01 referance that will be filled in
       
   144      */
       
   145     virtual void GetConfig(TEthernetConfigV01 &aConfig) const =0;
       
   146     /**
       
   147      * Check a configuration
       
   148      * @param aConfig	a reference to the structure TEthernetConfigV01 with configuration to check
       
   149      */
       
   150     virtual void CheckConfig(TEthernetConfigV01& aConfig)=0;
       
   151 
       
   152     /**
       
   153      * Querie the device's capibilitys
       
   154      * @param aCaps To be filled in with the capibilites
       
   155      */
       
   156     virtual void Caps(TDes8 &aCaps) const =0;
       
   157 
       
   158     /**
       
   159      * Transmit data
       
   160      * @param aBuffer referance to the data to be sent
       
   161      * @return KErrNone if the data has been sent
       
   162      */
       
   163     virtual TInt Send(TBuf8<KMaxEthernetPacket+32> &aBuffer) =0;
       
   164     /**
       
   165      * Retrieve data from the device
       
   166      * Pull the received data out of the device and into the supplied buffer. 
       
   167      * Need to be told if the buffer is OK to use as if it not we could dump 
       
   168      * the waiting frame in order to clear the interrupt if necessory.
       
   169      * @param aBuffer Referance to the buffer to be used to store the data in
       
   170      * @param okToUse Bool to indicate if the buffer is usable
       
   171      * @return KErrNone if the buffer has been filled.
       
   172      */
       
   173     virtual TInt ReceiveFrame(TBuf8<KMaxEthernetPacket+32> &aBuffer, 
       
   174                               TBool okToUse) =0;
       
   175 
       
   176     /**
       
   177      * Disables all IRQ's
       
   178      * @return The IRQ level before it was changed
       
   179      * @see RestoreIrqs()
       
   180      */
       
   181     virtual TInt DisableIrqs()=0;
       
   182     /**
       
   183      * Restore the IRQ's to the supplied level
       
   184      * @param aIrq The level to set the irqs to.
       
   185      * @see DisableIrqs()
       
   186      */
       
   187     virtual void RestoreIrqs(TInt aIrq)=0;
       
   188     /**
       
   189      * Return the DFC Queue that this device should use
       
   190      * @param aUnit The Channel number
       
   191      * @return Then DFC Queue to use
       
   192      */
       
   193     virtual TDfcQue* DfcQ(TInt aUnit)=0;
       
   194     /**
       
   195      * The Receive Isr for the device
       
   196      */
       
   197     inline void ReceiveIsr();
       
   198     
       
   199 #ifdef ETH_CHIP_IO_ENABLED
       
   200     virtual TInt BgeChipIOCtrl(TPckgBuf<TChipIOInfo> &aIOData)=0;
       
   201 #endif
       
   202     /**
       
   203      * A pointer to the logical device drivers channel that owns this device
       
   204      */
       
   205     DChannelEthernet * iLdd ;
       
   206     };
       
   207 
       
   208 /** @} */ // End of pdd group
       
   209 
       
   210 /**
       
   211  * @addtogroup enet_ldd_nopm_nopccard Ethernet LDD Not PCMCIA and No Power Managment
       
   212  * @ingroup enet_ldd
       
   213  * @ingroup enet_misa
       
   214  * @ingroup enet_wins
       
   215  * @{
       
   216  */
       
   217 
       
   218 /**
       
   219 	Ethernet logical device
       
   220 	The class representing the ethernet logical device
       
   221 	@internalComponent
       
   222 */
       
   223 class DDeviceEthernet : public DLogicalDevice
       
   224     {
       
   225     public:
       
   226     /**
       
   227      * The constructor
       
   228      */
       
   229     DDeviceEthernet();
       
   230     /**
       
   231      * Install the device
       
   232      */
       
   233     virtual TInt Install();
       
   234     /**
       
   235      * Get the Capabilites of the device
       
   236      * @param aDes descriptor that will contain the returned capibilites
       
   237      */
       
   238     virtual void GetCaps(TDes8 &aDes) const;
       
   239     /**
       
   240      * Create a logical channel to the device
       
   241      */
       
   242     virtual TInt Create(DLogicalChannelBase*& aChannel);
       
   243     };
       
   244 
       
   245 
       
   246 /**
       
   247 	Stores the Tx and RX buffers for use in a ethernet logical channel
       
   248 	@internalComponent
       
   249  */
       
   250 class DChannelEthernetFIFO 
       
   251     {
       
   252     public:
       
   253     /**
       
   254      * The TX Buffer
       
   255      */
       
   256     TBuf8<KMaxEthernetPacket+32> iTxBuf;
       
   257 
       
   258     /**
       
   259      * The constructor
       
   260      */
       
   261     DChannelEthernetFIFO();
       
   262     /**
       
   263      * The destructor
       
   264      */
       
   265     ~DChannelEthernetFIFO();
       
   266     /**
       
   267      * Get a empty receive buffer
       
   268      * @return NULL or a pointer to the free buffer
       
   269      */
       
   270     TBuf8<KMaxEthernetPacket+32> * GetFree();
       
   271     /**
       
   272      * Get the next full buffer
       
   273      * @return NULL or a pointer to the full buffer
       
   274      */ 
       
   275     TBuf8<KMaxEthernetPacket+32> * GetNext();
       
   276     /**
       
   277      * Move on to the next full buffer
       
   278      */
       
   279     void SetNext();
       
   280 
       
   281     private:
       
   282     /**
       
   283      * The array of receive buffers
       
   284      */
       
   285     TBuf8<KMaxEthernetPacket+32> iRxBuf[KNumRXBuffers];
       
   286     /**
       
   287      * Index into the array of the next full buffer
       
   288      */
       
   289     TInt iRxQueIterNext;
       
   290     /**
       
   291      * Index into the array of the next empty buffer
       
   292      */
       
   293     TInt iRxQueIterFree;
       
   294     /**
       
   295      * Count of the number of empty buffers
       
   296      */
       
   297     TInt iNumFree;
       
   298     };
       
   299 
       
   300 /**
       
   301 	The logical channel for ethernet devices
       
   302 	The basic ethernet logical channel that doesn't support
       
   303 	power control or PCCard ethernet devices
       
   304 	@internalComponent
       
   305  */
       
   306 class DChannelEthernet : public DLogicalChannel
       
   307     {
       
   308     public:
       
   309     /**
       
   310      * The state of the logical channel
       
   311      */
       
   312     enum TState 
       
   313         {
       
   314         EOpen,    /**< The channel is open */
       
   315         EActive,  /**< The channel is open and busy */
       
   316         EClosed   /**< The channel is closed */
       
   317         };
       
   318 
       
   319     /**
       
   320      * Requests that can be made on the channel
       
   321      */
       
   322     enum TRequest 
       
   323         {
       
   324         ERx=1,      /**< Receive a frame */
       
   325         ETx=2,      /**< Transmit a frame */
       
   326         EAll=0xff   /**< Complete/cancel all outstanding requests */
       
   327         };
       
   328 
       
   329     /**
       
   330      * The constructor 
       
   331      */
       
   332     DChannelEthernet();
       
   333     /**
       
   334      * The destructor
       
   335      */
       
   336     ~DChannelEthernet();
       
   337 
       
   338     /**
       
   339      * The ISR function for the channel
       
   340      * This is called by the pycical channels ISR when data is received
       
   341      * It passes a empty buffer to the PDD for it to store the frame in
       
   342      */
       
   343     virtual void ReceiveIsr();
       
   344 
       
   345     protected:
       
   346     /**
       
   347      * Create a logical ethernet channel
       
   348      * @param aUnit The channel number to create
       
   349      * @param anInfo not used, can be NULL
       
   350      * @param aVer The minimun driver version allowed
       
   351      * @return KErrNone if channel created
       
   352      */
       
   353     virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
       
   354     /**
       
   355      * Handle a message from the channels user
       
   356      * @param aMsg The message to handle
       
   357      */
       
   358     virtual void HandleMsg(TMessageBase* aMsg);
       
   359     /**
       
   360      * Cancel an outstanding request
       
   361      * @param aMask A mask containing the requests to be canceled
       
   362      */
       
   363     void DoCancel(TInt aMask);
       
   364     /**
       
   365      * Preform a control operation on the channel
       
   366      * Control operations are:
       
   367      * - Get the current configuration
       
   368      * - Configure the channel
       
   369      * - Set the MAC address for the channel
       
   370      * - Get the capibilities of the channel
       
   371      * @param aId The operation to preform
       
   372      * @param a1 The data to use with the operation
       
   373      * @param a2 can be NULL - not used
       
   374      * @return KErrNone if operation done
       
   375      */
       
   376     TInt DoControl(TInt aId, TAny* a1, TAny* a2);
       
   377     /**
       
   378      * Preform an asynchros operation on the channel
       
   379      * Operations are:
       
   380      * - Read data from the channel
       
   381      * - Write data to the channel
       
   382      * @param aId The operation to perform
       
   383      * @param aStatus The status object to use when complete
       
   384      * @param a1 The data to use
       
   385      * @param a2 The length of the data to use
       
   386      * @return KErrNone if operation started ok
       
   387      * @see Complete()
       
   388      */
       
   389     TInt DoRequest(TInt aId, TRequestStatus* aStatus, TAny* a1, TAny* a2);
       
   390 
       
   391 	//Override sendMsg to copy clients memory in client context for WDP.
       
   392 	virtual TInt SendMsg(TMessageBase* aMsg);
       
   393 
       
   394 	TInt SendControl(TMessageBase* aMsg);
       
   395 
       
   396 	TInt SendRequest(TMessageBase* aMsg);
       
   397 
       
   398     /**
       
   399      * Start the channel receiving
       
   400      */
       
   401     void Start();
       
   402     /**
       
   403      * Shutdown the channel
       
   404      */
       
   405     void Shutdown();
       
   406 
       
   407     /**
       
   408      * Complete an RX request
       
   409      * Is run as the RX DFC and reads a buffer from the receive FIFO into
       
   410      * the users buffer
       
   411      */
       
   412     void DoCompleteRx();
       
   413     /** 
       
   414      * Completes an outstanding request
       
   415      * @param aMask Specifies what request to complete
       
   416      * @param aReason The reason the request is complete
       
   417      * @see DoRequest()
       
   418      */
       
   419     void Complete(TInt aMask, TInt aReason);
       
   420 
       
   421     /**
       
   422      * Disables all IRQ's
       
   423      * @return The IRQ level before it was changed
       
   424      * @see RestoreIrqs()
       
   425      */
       
   426     inline TInt DisableIrqs();
       
   427     /**
       
   428      * Restore the IRQ's to the supplied level
       
   429      * @param aIrq The level to set the irqs to.
       
   430      * @see DisableIrqs()
       
   431      */
       
   432     inline void RestoreIrqs(TInt aIrq);
       
   433 
       
   434     /**
       
   435      * Calls the PDD's start method
       
   436      * @return KErrNone if the PDD started ok
       
   437      */
       
   438     inline TInt PddStart();
       
   439     /**
       
   440      * Calls the PDD's Validate method
       
   441      * @param aConfig The configuration to be validated
       
   442      * @return KErrNone if config is valid
       
   443      */
       
   444     inline TInt ValidateConfig(const TEthernetConfigV01 &aConfig) const;
       
   445     /**
       
   446      * Calls the PDD's Configure method
       
   447      * Should call Validate first
       
   448      * Will not change the MAC address
       
   449      * @param aConfig The new configuration
       
   450      * @see ValidateConfig()
       
   451      */
       
   452     inline void PddConfigure(TEthernetConfigV01 &aConfig);
       
   453     /**
       
   454      * Calls the PDD's MacConfigure method
       
   455      * Will not change anything but the MAC address
       
   456      * @param aConfig A configuration containing the new MAC address
       
   457      */
       
   458     inline void MacConfigure(TEthernetConfigV01 &aConfig);
       
   459     /**
       
   460      * Calls the PDD's ChheckConfig Method
       
   461      * @param aConfig The config to check
       
   462      */
       
   463     inline void PddCheckConfig(TEthernetConfigV01 &aConfig);
       
   464 
       
   465     /**
       
   466      * Calls the PDD's get capibilities method
       
   467      * @param aCaps Filled in with the PDD capibilites on return
       
   468      */
       
   469     inline void PddCaps(TDes8 &aCaps) const;
       
   470 
       
   471     /**
       
   472      * Sends data using the PDD
       
   473      * @param aBuffer A referance to a buffer to be sent
       
   474      * @return KErrNone if buffer sent
       
   475      */
       
   476     inline TInt PddSend(TBuf8<KMaxEthernetPacket+32> &aBuffer);
       
   477     /**
       
   478      * Receive a frame from the PDD
       
   479      * @param aBuffer A referance to the buffer that the frame is to be put in
       
   480      * @param okToUse Flag to say if the buffer is valid
       
   481      * @return KErrNone if the buffer now contains a frame
       
   482      */
       
   483     inline TInt PddReceive(TBuf8<KMaxEthernetPacket+32> &aBuffer, TBool okToUse);
       
   484 
       
   485     private:
       
   486     /**
       
   487      * The DFC called by the kernel
       
   488      * @param aPtr A pointer to the channel object
       
   489      */
       
   490     static void CompleteRxDfc(TAny* aPtr);
       
   491 
       
   492     /**
       
   493      * Start a read request
       
   494      * @param aRxDes The buffer to be filled with data
       
   495      * @param aLength The max size frame that can fit in the buffer
       
   496      */
       
   497     void InitiateRead(TAny* aRxDes, TInt aLength);
       
   498     /**
       
   499      * Start a write request
       
   500      * @param aTxDes The buffer containing the frame to be sent
       
   501      * @param aLength The length of the frame to be sent
       
   502      */
       
   503     void InitiateWrite(TAny* aTxDes, TInt aLength);
       
   504     /**
       
   505      * Validates and set a new configuration
       
   506      * @param c The configuration to try
       
   507      * @return KErrNone if new configuration set
       
   508      */
       
   509     TInt SetConfig(TEthernetConfigV01& c);
       
   510     /**
       
   511      * Validates and sets a new MAC address
       
   512      * @param c The configuration containing the MAC to be set
       
   513      * @return KErrNone if the MAC is set ok
       
   514      */
       
   515     TInt SetMAC(TEthernetConfigV01& c);
       
   516 
       
   517     /**
       
   518      * The current channel configuration
       
   519      */
       
   520     TEthernetConfigV01 iConfig;
       
   521 
       
   522     /**
       
   523      * Pointer to the client thread
       
   524      */
       
   525     DThread* iClient;
       
   526 
       
   527     /**
       
   528      * Current state of the LDD
       
   529      */
       
   530     TState iStatus;
       
   531 
       
   532     /**
       
   533      * The receive complete DFC
       
   534      */
       
   535     TDfc iRxCompleteDfc;
       
   536     
       
   537     /**
       
   538      * Records if the channel is being shutdown
       
   539      */
       
   540     TBool iShutdown;			// ETrue means device is being closed
       
   541 
       
   542     /**
       
   543      * The length of the clients buffer
       
   544      */
       
   545     TInt iRxLength;
       
   546 
       
   547     /**
       
   548      * The TX and RX buffers
       
   549      */
       
   550     DChannelEthernetFIFO iFIFO;
       
   551 
       
   552 	//Read request to store user request status for WDP
       
   553 	TClientBufferRequest* iReadRequest;
       
   554 	//Read buffer to pin client buffer in client context for WDP
       
   555 	TClientBuffer* iClientReadBuffer;
       
   556 
       
   557 	//Write request to store user request status for WDP
       
   558 	TClientRequest* iWriteRequest;
       
   559 
       
   560 #ifdef ETH_CHIP_IO_ENABLED
       
   561 	TPckgBuf<TChipIOInfo> iChipInfo;
       
   562 #endif
       
   563     };
       
   564 /** @} */
       
   565 
       
   566 #include <drivers/ethernet.inl>
       
   567 
       
   568 #endif