459 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			459 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/*===========================================================================
 | 
						|
FILE:
 | 
						|
   Structs.h
 | 
						|
 | 
						|
DESCRIPTION:
 | 
						|
   Declaration of structures used by the Qualcomm Linux USB Network driver
 | 
						|
   
 | 
						|
FUNCTIONS:
 | 
						|
   none
 | 
						|
 | 
						|
Copyright (c) 2011, Code Aurora Forum. All rights reserved.
 | 
						|
 | 
						|
Redistribution and use in source and binary forms, with or without
 | 
						|
modification, are permitted provided that the following conditions are met:
 | 
						|
    * Redistributions of source code must retain the above copyright
 | 
						|
      notice, this list of conditions and the following disclaimer.
 | 
						|
    * Redistributions in binary form must reproduce the above copyright
 | 
						|
      notice, this list of conditions and the following disclaimer in the
 | 
						|
      documentation and/or other materials provided with the distribution.
 | 
						|
    * Neither the name of Code Aurora Forum nor
 | 
						|
      the names of its contributors may be used to endorse or promote
 | 
						|
      products derived from this software without specific prior written
 | 
						|
      permission.
 | 
						|
 | 
						|
 | 
						|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
						|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
						|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
						|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
						|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
						|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
						|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
						|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
						|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
						|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
						|
POSSIBILITY OF SUCH DAMAGE.
 | 
						|
===========================================================================*/
 | 
						|
 | 
						|
//---------------------------------------------------------------------------
 | 
						|
// Pragmas
 | 
						|
//---------------------------------------------------------------------------
 | 
						|
#pragma once
 | 
						|
 | 
						|
//---------------------------------------------------------------------------
 | 
						|
// Include Files
 | 
						|
//---------------------------------------------------------------------------
 | 
						|
#include <linux/etherdevice.h>
 | 
						|
#include <linux/ethtool.h>
 | 
						|
#include <linux/mii.h>
 | 
						|
#include <linux/usb.h>
 | 
						|
#include <linux/version.h>
 | 
						|
#include <linux/cdev.h>
 | 
						|
#include <linux/kthread.h>
 | 
						|
#include <linux/poll.h>
 | 
						|
#include <linux/completion.h>
 | 
						|
 | 
						|
#define QUECTEL_WWAN_QMAP 8
 | 
						|
#ifdef QUECTEL_WWAN_QMAP
 | 
						|
#define QUECTEL_QMAP_MUX_ID 0x81
 | 
						|
#endif
 | 
						|
 | 
						|
#if (LINUX_VERSION_CODE <= KERNEL_VERSION( 2,6,21 ))
 | 
						|
static inline void skb_reset_mac_header(struct sk_buff *skb)
 | 
						|
{
 | 
						|
    skb->mac.raw = skb->data;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#if (LINUX_VERSION_CODE <= KERNEL_VERSION( 2,6,22 ))
 | 
						|
#define bool      u8
 | 
						|
#ifndef URB_FREE_BUFFER
 | 
						|
#define URB_FREE_BUFFER_BY_SELF //usb_free_urb will not free, should free by self
 | 
						|
#define URB_FREE_BUFFER		0x0100	/* Free transfer buffer with the URB */
 | 
						|
#endif
 | 
						|
 | 
						|
/**
 | 
						|
 * usb_endpoint_type - get the endpoint's transfer type
 | 
						|
 * @epd: endpoint to be checked
 | 
						|
 *
 | 
						|
 * Returns one of USB_ENDPOINT_XFER_{CONTROL, ISOC, BULK, INT} according
 | 
						|
 * to @epd's transfer type.
 | 
						|
 */
 | 
						|
static inline int usb_endpoint_type(const struct usb_endpoint_descriptor *epd)
 | 
						|
{
 | 
						|
	return epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#if (LINUX_VERSION_CODE <= KERNEL_VERSION( 2,6,18 ))
 | 
						|
/**
 | 
						|
 * usb_endpoint_dir_in - check if the endpoint has IN direction
 | 
						|
 * @epd: endpoint to be checked
 | 
						|
 *
 | 
						|
 * Returns true if the endpoint is of type IN, otherwise it returns false.
 | 
						|
 */
 | 
						|
static inline int usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd)
 | 
						|
{
 | 
						|
	return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * usb_endpoint_dir_out - check if the endpoint has OUT direction
 | 
						|
 * @epd: endpoint to be checked
 | 
						|
 *
 | 
						|
 * Returns true if the endpoint is of type OUT, otherwise it returns false.
 | 
						|
 */
 | 
						|
static inline int usb_endpoint_dir_out(
 | 
						|
				const struct usb_endpoint_descriptor *epd)
 | 
						|
{
 | 
						|
	return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * usb_endpoint_xfer_int - check if the endpoint has interrupt transfer type
 | 
						|
 * @epd: endpoint to be checked
 | 
						|
 *
 | 
						|
 * Returns true if the endpoint is of type interrupt, otherwise it returns
 | 
						|
 * false.
 | 
						|
 */
 | 
						|
static inline int usb_endpoint_xfer_int(
 | 
						|
				const struct usb_endpoint_descriptor *epd)
 | 
						|
{
 | 
						|
	return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
 | 
						|
		USB_ENDPOINT_XFER_INT);
 | 
						|
}
 | 
						|
 | 
						|
static inline int usb_autopm_set_interface(struct usb_interface *intf)
 | 
						|
{ return 0; }
 | 
						|
 | 
						|
static inline int usb_autopm_get_interface(struct usb_interface *intf)
 | 
						|
{ return 0; }
 | 
						|
 | 
						|
static inline int usb_autopm_get_interface_async(struct usb_interface *intf)
 | 
						|
{ return 0; }
 | 
						|
 | 
						|
static inline void usb_autopm_put_interface(struct usb_interface *intf)
 | 
						|
{ }
 | 
						|
static inline void usb_autopm_put_interface_async(struct usb_interface *intf)
 | 
						|
{ }
 | 
						|
static inline void usb_autopm_enable(struct usb_interface *intf)
 | 
						|
{ }
 | 
						|
static inline void usb_autopm_disable(struct usb_interface *intf)
 | 
						|
{ }
 | 
						|
static inline void usb_mark_last_busy(struct usb_device *udev)
 | 
						|
{ }
 | 
						|
#endif
 | 
						|
 | 
						|
#if (LINUX_VERSION_CODE <= KERNEL_VERSION( 2,6,24 ))
 | 
						|
   #include "usbnet.h"
 | 
						|
#else
 | 
						|
   #include <linux/usb/usbnet.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#if (LINUX_VERSION_CODE > KERNEL_VERSION( 2,6,25 ))
 | 
						|
   #include <linux/fdtable.h>
 | 
						|
#else
 | 
						|
   #include <linux/file.h>
 | 
						|
#endif
 | 
						|
 | 
						|
// Used in recursion, defined later below
 | 
						|
struct sGobiUSBNet;
 | 
						|
 | 
						|
/*=========================================================================*/
 | 
						|
// Struct sReadMemList
 | 
						|
//
 | 
						|
//    Structure that defines an entry in a Read Memory linked list
 | 
						|
/*=========================================================================*/
 | 
						|
typedef struct sReadMemList
 | 
						|
{
 | 
						|
   /* Data buffer */
 | 
						|
   void *                     mpData;
 | 
						|
   
 | 
						|
   /* Transaction ID */
 | 
						|
   u16                        mTransactionID;
 | 
						|
 | 
						|
   /* Size of data buffer */
 | 
						|
   u16                        mDataSize;
 | 
						|
 | 
						|
   /* Next entry in linked list */
 | 
						|
   struct sReadMemList *      mpNext;
 | 
						|
 | 
						|
} sReadMemList;
 | 
						|
 | 
						|
/*=========================================================================*/
 | 
						|
// Struct sNotifyList
 | 
						|
//
 | 
						|
//    Structure that defines an entry in a Notification linked list
 | 
						|
/*=========================================================================*/
 | 
						|
typedef struct sNotifyList
 | 
						|
{
 | 
						|
   /* Function to be run when data becomes available */
 | 
						|
   void                  (* mpNotifyFunct)(struct sGobiUSBNet *, u16, void *);
 | 
						|
   
 | 
						|
   /* Transaction ID */
 | 
						|
   u16                   mTransactionID;
 | 
						|
 | 
						|
   /* Data to provide as parameter to mpNotifyFunct */
 | 
						|
   void *                mpData;
 | 
						|
   
 | 
						|
   /* Next entry in linked list */
 | 
						|
   struct sNotifyList *  mpNext;
 | 
						|
 | 
						|
} sNotifyList;
 | 
						|
 | 
						|
/*=========================================================================*/
 | 
						|
// Struct sURBList
 | 
						|
//
 | 
						|
//    Structure that defines an entry in a URB linked list
 | 
						|
/*=========================================================================*/
 | 
						|
typedef struct sURBList
 | 
						|
{
 | 
						|
   /* The current URB */
 | 
						|
   struct urb *       mpURB;
 | 
						|
 | 
						|
   /* Next entry in linked list */
 | 
						|
   struct sURBList *  mpNext;
 | 
						|
 | 
						|
} sURBList;
 | 
						|
 | 
						|
/*=========================================================================*/
 | 
						|
// Struct sClientMemList
 | 
						|
//
 | 
						|
//    Structure that defines an entry in a Client Memory linked list
 | 
						|
//      Stores data specific to a Service Type and Client ID
 | 
						|
/*=========================================================================*/
 | 
						|
typedef struct sClientMemList
 | 
						|
{
 | 
						|
   /* Client ID for this Client */
 | 
						|
   u16                          mClientID;
 | 
						|
 | 
						|
   /* Linked list of Read entries */
 | 
						|
   /*    Stores data read from device before sending to client */
 | 
						|
   sReadMemList *               mpList;
 | 
						|
   
 | 
						|
   /* Linked list of Notification entries */
 | 
						|
   /*    Stores notification functions to be run as data becomes 
 | 
						|
         available or the device is removed */
 | 
						|
   sNotifyList *                mpReadNotifyList;
 | 
						|
 | 
						|
   /* Linked list of URB entries */
 | 
						|
   /*    Stores pointers to outstanding URBs which need canceled 
 | 
						|
         when the client is deregistered or the device is removed */
 | 
						|
   sURBList *                   mpURBList;
 | 
						|
   
 | 
						|
   /* Next entry in linked list */
 | 
						|
   struct sClientMemList *      mpNext;
 | 
						|
 | 
						|
   /* Wait queue object for poll() */
 | 
						|
   wait_queue_head_t    mWaitQueue;
 | 
						|
 | 
						|
} sClientMemList;
 | 
						|
 | 
						|
/*=========================================================================*/
 | 
						|
// Struct sURBSetupPacket
 | 
						|
//
 | 
						|
//    Structure that defines a USB Setup packet for Control URBs
 | 
						|
//    Taken from USB CDC specifications
 | 
						|
/*=========================================================================*/
 | 
						|
typedef struct sURBSetupPacket
 | 
						|
{
 | 
						|
   /* Request type */
 | 
						|
   u8    mRequestType;
 | 
						|
 | 
						|
   /* Request code */
 | 
						|
   u8    mRequestCode;
 | 
						|
 | 
						|
   /* Value */
 | 
						|
   u16   mValue;
 | 
						|
 | 
						|
   /* Index */
 | 
						|
   u16   mIndex;
 | 
						|
 | 
						|
   /* Length of Control URB */
 | 
						|
   u16   mLength;
 | 
						|
 | 
						|
} sURBSetupPacket;
 | 
						|
 | 
						|
// Common value for sURBSetupPacket.mLength
 | 
						|
#define DEFAULT_READ_URB_LENGTH 0x1000
 | 
						|
 | 
						|
#ifdef CONFIG_PM
 | 
						|
#if (LINUX_VERSION_CODE < KERNEL_VERSION( 2,6,29 ))
 | 
						|
/*=========================================================================*/
 | 
						|
// Struct sAutoPM
 | 
						|
//
 | 
						|
//    Structure used to manage AutoPM thread which determines whether the
 | 
						|
//    device is in use or may enter autosuspend.  Also submits net 
 | 
						|
//    transmissions asynchronously.
 | 
						|
/*=========================================================================*/
 | 
						|
typedef struct sAutoPM
 | 
						|
{
 | 
						|
   /* Thread for atomic autopm function */
 | 
						|
   struct task_struct *       mpThread;
 | 
						|
 | 
						|
   /* Signal for completion when it's time for the thread to work */
 | 
						|
   struct completion          mThreadDoWork;
 | 
						|
 | 
						|
   /* Time to exit? */
 | 
						|
   bool                       mbExit;
 | 
						|
 | 
						|
   /* List of URB's queued to be sent to the device */
 | 
						|
   sURBList *                 mpURBList;
 | 
						|
 | 
						|
   /* URB list lock (for adding and removing elements) */
 | 
						|
   spinlock_t                 mURBListLock;
 | 
						|
 | 
						|
   /* Length of the URB list */
 | 
						|
   atomic_t                   mURBListLen;
 | 
						|
   
 | 
						|
   /* Active URB */
 | 
						|
   struct urb *               mpActiveURB;
 | 
						|
 | 
						|
   /* Active URB lock (for adding and removing elements) */
 | 
						|
   spinlock_t                 mActiveURBLock;
 | 
						|
   
 | 
						|
   /* Duplicate pointer to USB device interface */
 | 
						|
   struct usb_interface *     mpIntf;
 | 
						|
 | 
						|
} sAutoPM;
 | 
						|
#endif
 | 
						|
#endif /* CONFIG_PM */
 | 
						|
 | 
						|
/*=========================================================================*/
 | 
						|
// Struct sQMIDev
 | 
						|
//
 | 
						|
//    Structure that defines the data for the QMI device
 | 
						|
/*=========================================================================*/
 | 
						|
typedef struct sQMIDev
 | 
						|
{
 | 
						|
   /* Device number */
 | 
						|
   dev_t                      mDevNum;
 | 
						|
 | 
						|
   /* Device class */
 | 
						|
   struct class *             mpDevClass;
 | 
						|
 | 
						|
   /* cdev struct */
 | 
						|
   struct cdev                mCdev;
 | 
						|
 | 
						|
   /* is mCdev initialized? */
 | 
						|
   bool                       mbCdevIsInitialized;
 | 
						|
 | 
						|
   /* Pointer to read URB */
 | 
						|
   struct urb *               mpReadURB;
 | 
						|
 | 
						|
//#define READ_QMI_URB_ERROR
 | 
						|
#ifdef READ_QMI_URB_ERROR
 | 
						|
   struct timer_list mReadUrbTimer;
 | 
						|
#endif
 | 
						|
 | 
						|
   /* Read setup packet */
 | 
						|
   sURBSetupPacket *          mpReadSetupPacket;
 | 
						|
 | 
						|
   /* Read buffer attached to current read URB */
 | 
						|
   void *                     mpReadBuffer;
 | 
						|
   
 | 
						|
   /* Inturrupt URB */
 | 
						|
   /*    Used to asynchronously notify when read data is available */
 | 
						|
   struct urb *               mpIntURB;
 | 
						|
 | 
						|
   /* Buffer used by Inturrupt URB */
 | 
						|
   void *                     mpIntBuffer;
 | 
						|
   
 | 
						|
   /* Pointer to memory linked list for all clients */
 | 
						|
   sClientMemList *           mpClientMemList;
 | 
						|
   
 | 
						|
   /* Spinlock for client Memory entries */
 | 
						|
   spinlock_t                 mClientMemLock;
 | 
						|
 | 
						|
   /* Transaction ID associated with QMICTL "client" */
 | 
						|
   atomic_t                   mQMICTLTransactionID;
 | 
						|
 | 
						|
} sQMIDev;
 | 
						|
 | 
						|
/*=========================================================================*/
 | 
						|
// Struct sGobiUSBNet
 | 
						|
//
 | 
						|
//    Structure that defines the data associated with the Qualcomm USB device
 | 
						|
/*=========================================================================*/
 | 
						|
typedef struct sGobiUSBNet
 | 
						|
{
 | 
						|
    atomic_t refcount;
 | 
						|
 | 
						|
   /* Net device structure */
 | 
						|
   struct usbnet *        mpNetDev;
 | 
						|
#ifdef QUECTEL_WWAN_QMAP
 | 
						|
   int m_qmap_mode;
 | 
						|
   struct net_device	*mpQmapNetDev[QUECTEL_WWAN_QMAP];
 | 
						|
#ifdef CONFIG_BRIDGE
 | 
						|
   int m_qmap_bridge_mode[QUECTEL_WWAN_QMAP];
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
#if 1 //def DATA_MODE_RP
 | 
						|
    bool                   mbMdm9x07;  
 | 
						|
    bool                   mbMdm9x06;	//for BG96
 | 
						|
   /* QMI "device" work in IP Mode or ETH Mode */
 | 
						|
   bool                   mbRawIPMode;
 | 
						|
#ifdef CONFIG_BRIDGE
 | 
						|
   int m_bridge_mode;
 | 
						|
   uint m_bridge_ipv4;
 | 
						|
   unsigned char     mHostMAC[6];
 | 
						|
#endif
 | 
						|
   int m_qcrmcall_mode;
 | 
						|
#endif
 | 
						|
 | 
						|
   struct completion mQMIReadyCompletion;
 | 
						|
   bool                   mbQMIReady;
 | 
						|
 | 
						|
   /* Usb device interface */
 | 
						|
   struct usb_interface * mpIntf;
 | 
						|
 | 
						|
   /* Pointers to usbnet_open and usbnet_stop functions */
 | 
						|
   int                  (* mpUSBNetOpen)(struct net_device *);
 | 
						|
   int                  (* mpUSBNetStop)(struct net_device *);
 | 
						|
   
 | 
						|
   /* Reason(s) why interface is down */
 | 
						|
   /* Used by Gobi*DownReason */
 | 
						|
   unsigned long          mDownReason;
 | 
						|
#define NO_NDIS_CONNECTION    0
 | 
						|
#define CDC_CONNECTION_SPEED  1
 | 
						|
#define DRIVER_SUSPENDED      2
 | 
						|
#define NET_IFACE_STOPPED     3
 | 
						|
 | 
						|
   /* QMI "device" status */
 | 
						|
   bool                   mbQMIValid;
 | 
						|
 | 
						|
   bool                   mbDeregisterQMIDevice;
 | 
						|
 | 
						|
   /* QMI "device" memory */
 | 
						|
   sQMIDev                mQMIDev;
 | 
						|
 | 
						|
   /* Device MEID */
 | 
						|
   char                   mMEID[14];
 | 
						|
   
 | 
						|
#ifdef CONFIG_PM
 | 
						|
   #if (LINUX_VERSION_CODE < KERNEL_VERSION( 2,6,29 ))   
 | 
						|
   /* AutoPM thread */
 | 
						|
   sAutoPM                mAutoPM;
 | 
						|
#endif
 | 
						|
#endif /* CONFIG_PM */
 | 
						|
} sGobiUSBNet;
 | 
						|
 | 
						|
/*=========================================================================*/
 | 
						|
// Struct sQMIFilpStorage
 | 
						|
//
 | 
						|
//    Structure that defines the storage each file handle contains
 | 
						|
//       Relates the file handle to a client
 | 
						|
/*=========================================================================*/
 | 
						|
typedef struct sQMIFilpStorage
 | 
						|
{
 | 
						|
   /* Client ID */
 | 
						|
   u16                  mClientID;
 | 
						|
   
 | 
						|
   /* Device pointer */
 | 
						|
   sGobiUSBNet *        mpDev;
 | 
						|
 | 
						|
} sQMIFilpStorage;
 | 
						|
 |