/*********************************** * Adapter.h ************************************/ #ifndef __ADAPTER_H__ #define __ADAPTER_H__ #define MAX_FRAGMENTEDIP_CLASSIFICATION_ENTRIES 256 #include "Debug.h" struct _LEADER { USHORT Vcid; USHORT PLength; UCHAR Status; UCHAR Unused[3]; }__attribute__((packed)); typedef struct _LEADER LEADER,*PLEADER; struct _PACKETTOSEND { LEADER Leader; UCHAR ucPayload; }__attribute__((packed)); typedef struct _PACKETTOSEND PACKETTOSEND, *PPACKETTOSEND; struct _CONTROL_PACKET { PVOID ControlBuff; UINT ControlBuffLen; struct _CONTROL_PACKET* next; }__attribute__((packed)); typedef struct _CONTROL_PACKET CONTROL_PACKET,*PCONTROL_PACKET; struct link_request { LEADER Leader; UCHAR szData[4]; }__attribute__((packed)); typedef struct link_request LINK_REQUEST, *PLINK_REQUEST; //classification extension is added typedef struct _ADD_CONNECTION { ULONG SrcIpAddressCount; ULONG SrcIpAddress[MAX_CONNECTIONS]; ULONG SrcIpMask[MAX_CONNECTIONS]; ULONG DestIpAddressCount; ULONG DestIpAddress[MAX_CONNECTIONS]; ULONG DestIpMask[MAX_CONNECTIONS]; USHORT SrcPortBegin; USHORT SrcPortEnd; USHORT DestPortBegin; USHORT DestPortEnd; UCHAR SrcTOS; UCHAR SrcProtocol; } ADD_CONNECTION,*PADD_CONNECTION; typedef struct _CLASSIFICATION_RULE { UCHAR ucIPSrcAddrLen; UCHAR ucIPSrcAddr[32]; UCHAR ucIPDestAddrLen; UCHAR ucIPDestAddr[32]; UCHAR ucSrcPortRangeLen; UCHAR ucSrcPortRange[4]; UCHAR ucDestPortRangeLen; UCHAR ucDestPortRange[4]; USHORT usVcid; } CLASSIFICATION_RULE,*PCLASSIFICATION_RULE; typedef struct _CLASSIFICATION_ONLY { USHORT usVcid; ULONG DestIpAddress; ULONG DestIpMask; USHORT usPortLo; USHORT usPortHi; BOOLEAN bIpVersion; UCHAR ucDestinationAddress[16]; } CLASSIFICATION_ONLY, *PCLASSIFICATION_ONLY; #define MAX_IP_RANGE_LENGTH 4 #define MAX_PORT_RANGE 4 #define MAX_PROTOCOL_LENGTH 32 #define IPV6_ADDRESS_SIZEINBYTES 0x10 typedef union _U_IP_ADDRESS { struct { ULONG ulIpv4Addr[MAX_IP_RANGE_LENGTH];//Source Ip Address Range ULONG ulIpv4Mask[MAX_IP_RANGE_LENGTH];//Source Ip Mask Address Range }; struct { ULONG ulIpv6Addr[MAX_IP_RANGE_LENGTH * 4];//Source Ip Address Range ULONG ulIpv6Mask[MAX_IP_RANGE_LENGTH * 4];//Source Ip Mask Address Range }; struct { UCHAR ucIpv4Address[MAX_IP_RANGE_LENGTH * IP_LENGTH_OF_ADDRESS]; UCHAR ucIpv4Mask[MAX_IP_RANGE_LENGTH * IP_LENGTH_OF_ADDRESS]; }; struct { UCHAR ucIpv6Address[MAX_IP_RANGE_LENGTH * IPV6_ADDRESS_SIZEINBYTES]; UCHAR ucIpv6Mask[MAX_IP_RANGE_LENGTH * IPV6_ADDRESS_SIZEINBYTES]; }; }U_IP_ADDRESS; struct _packet_info; typedef struct _S_HDR_SUPRESSION_CONTEXTINFO { UCHAR ucaHdrSupressionInBuf[MAX_PHS_LENGTHS]; //Intermediate buffer to accumulate pkt Header for PHS UCHAR ucaHdrSupressionOutBuf[MAX_PHS_LENGTHS + PHSI_LEN]; //Intermediate buffer containing pkt Header after PHS }S_HDR_SUPRESSION_CONTEXTINFO; typedef struct _S_CLASSIFIER_RULE { ULONG ulSFID; UCHAR ucReserved[2]; B_UINT16 uiClassifierRuleIndex; BOOLEAN bUsed; USHORT usVCID_Value; B_UINT8 u8ClassifierRulePriority; //This field detemines the Classifier Priority U_IP_ADDRESS stSrcIpAddress; UCHAR ucIPSourceAddressLength;//Ip Source Address Length U_IP_ADDRESS stDestIpAddress; UCHAR ucIPDestinationAddressLength;//Ip Destination Address Length UCHAR ucIPTypeOfServiceLength;//Type of service Length UCHAR ucTosLow;//Tos Low UCHAR ucTosHigh;//Tos High UCHAR ucTosMask;//Tos Mask UCHAR ucProtocolLength;//protocol Length UCHAR ucProtocol[MAX_PROTOCOL_LENGTH];//protocol Length USHORT usSrcPortRangeLo[MAX_PORT_RANGE]; USHORT usSrcPortRangeHi[MAX_PORT_RANGE]; UCHAR ucSrcPortRangeLength; USHORT usDestPortRangeLo[MAX_PORT_RANGE]; USHORT usDestPortRangeHi[MAX_PORT_RANGE]; UCHAR ucDestPortRangeLength; BOOLEAN bProtocolValid; BOOLEAN bTOSValid; BOOLEAN bDestIpValid; BOOLEAN bSrcIpValid; //For IPv6 Addressing UCHAR ucDirection; BOOLEAN bIpv6Protocol; UINT32 u32PHSRuleID; S_PHS_RULE sPhsRule; UCHAR u8AssociatedPHSI; //Classification fields for ETH CS UCHAR ucEthCSSrcMACLen; UCHAR au8EThCSSrcMAC[MAC_ADDRESS_SIZE]; UCHAR au8EThCSSrcMACMask[MAC_ADDRESS_SIZE]; UCHAR ucEthCSDestMACLen; UCHAR au8EThCSDestMAC[MAC_ADDRESS_SIZE]; UCHAR au8EThCSDestMACMask[MAC_ADDRESS_SIZE]; UCHAR ucEtherTypeLen; UCHAR au8EthCSEtherType[NUM_ETHERTYPE_BYTES]; UCHAR usUserPriority[2]; USHORT usVLANID; USHORT usValidityBitMap; }S_CLASSIFIER_RULE; //typedef struct _S_CLASSIFIER_RULE S_CLASSIFIER_RULE; typedef struct _S_FRAGMENTED_PACKET_INFO { BOOLEAN bUsed; ULONG ulSrcIpAddress; USHORT usIpIdentification; S_CLASSIFIER_RULE *pstMatchedClassifierEntry; BOOLEAN bOutOfOrderFragment; }S_FRAGMENTED_PACKET_INFO,*PS_FRAGMENTED_PACKET_INFO; struct _packet_info { //classification extension Rule ULONG ulSFID; USHORT usVCID_Value; UINT uiThreshold; // This field determines the priority of the SF Queues B_UINT8 u8TrafficPriority; BOOLEAN bValid; BOOLEAN bActive; BOOLEAN bActivateRequestSent; B_UINT8 u8QueueType;//BE or rtPS UINT uiMaxBucketSize;//maximum size of the bucket for the queue UINT uiCurrentQueueDepthOnTarget; UINT uiCurrentBytesOnHost; UINT uiCurrentPacketsOnHost; UINT uiDroppedCountBytes; UINT uiDroppedCountPackets; UINT uiSentBytes; UINT uiSentPackets; UINT uiCurrentDrainRate; UINT uiThisPeriodSentBytes; LARGE_INTEGER liDrainCalculated; UINT uiCurrentTokenCount; LARGE_INTEGER liLastUpdateTokenAt; UINT uiMaxAllowedRate; UINT NumOfPacketsSent; UCHAR ucDirection; USHORT usCID; S_MIBS_EXTSERVICEFLOW_PARAMETERS stMibsExtServiceFlowTable; UINT uiCurrentRxRate; UINT uiThisPeriodRxBytes; UINT uiTotalRxBytes; UINT uiTotalTxBytes; UINT uiPendedLast; UCHAR ucIpVersion; union { struct { struct sk_buff* FirstTxQueue; struct sk_buff* LastTxQueue; }; struct { struct sk_buff* ControlHead; struct sk_buff* ControlTail; }; }; BOOLEAN bProtocolValid; BOOLEAN bTOSValid; BOOLEAN bDestIpValid; BOOLEAN bSrcIpValid; BOOLEAN bActiveSet; BOOLEAN bAdmittedSet; BOOLEAN bAuthorizedSet; BOOLEAN bClassifierPriority; UCHAR ucServiceClassName[MAX_CLASS_NAME_LENGTH]; BOOLEAN bHeaderSuppressionEnabled; spinlock_t SFQueueLock; void *pstSFIndication; struct timeval stLastUpdateTokenAt; atomic_t uiPerSFTxResourceCount; UINT uiMaxLatency; UCHAR bIPCSSupport; UCHAR bEthCSSupport; }; typedef struct _packet_info PacketInfo; typedef struct _PER_TARANG_DATA { struct _PER_TARANG_DATA * next; struct _MINI_ADAPTER * Adapter; struct sk_buff* RxAppControlHead; struct sk_buff* RxAppControlTail; volatile INT AppCtrlQueueLen; BOOLEAN MacTracingEnabled; BOOLEAN bApplicationToExit; S_MIBS_DROPPED_APP_CNTRL_MESSAGES stDroppedAppCntrlMsgs; ULONG RxCntrlMsgBitMask; } PER_TARANG_DATA, *PPER_TARANG_DATA; #ifdef REL_4_1 typedef struct _TARGET_PARAMS { B_UINT32 m_u32CfgVersion; // Scanning Related Params B_UINT32 m_u32CenterFrequency; B_UINT32 m_u32BandAScan; B_UINT32 m_u32BandBScan; B_UINT32 m_u32BandCScan; // QoS Params B_UINT32 m_u32minGrantsize; // size of minimum grant is 0 or 6 B_UINT32 m_u32PHSEnable; // HO Params B_UINT32 m_u32HoEnable; B_UINT32 m_u32HoReserved1; B_UINT32 m_u32HoReserved2; // Power Control Params B_UINT32 m_u32MimoEnable; B_UINT32 m_u32SecurityEnable; /* * bit 1: 1 Idlemode enable; * bit 2: 1 Sleepmode Enable */ B_UINT32 m_u32PowerSavingModesEnable; /* PowerSaving Mode Options: bit 0 = 1: CPE mode - to keep pcmcia if alive; bit 1 = 1: CINR reporing in Idlemode Msg bit 2 = 1: Default PSC Enable in sleepmode*/ B_UINT32 m_u32PowerSavingModeOptions; B_UINT32 m_u32ArqEnable; // From Version #3, the HARQ section renamed as general B_UINT32 m_u32HarqEnable; // EEPROM Param Location B_UINT32 m_u32EEPROMFlag; /* BINARY TYPE - 4th MSByte: * Interface Type - 3rd MSByte: * Vendor Type - 2nd MSByte */ // Unused - LSByte B_UINT32 m_u32Customize; B_UINT32 m_u32ConfigBW; /* In Hz */ B_UINT32 m_u32ShutDownTimer; B_UINT32 m_u32RadioParameter; B_UINT32 m_u32PhyParameter1; B_UINT32 m_u32PhyParameter2; B_UINT32 m_u32PhyParameter3; /* in eval mode only; * lower 16bits = basic cid for testing; * then bit 16 is test cqich, * bit 17 test init rang; * bit 18 test periodic rang * bit 19 is test harq ack/nack */ B_UINT32 m_u32TestOptions; B_UINT32 m_u32MaxMACDataperDLFrame; B_UINT32 m_u32MaxMACDataperULFrame; B_UINT32 m_u32Corr2MacFlags; //adding driver params. B_UINT32 HostDrvrConfig1; B_UINT32 HostDrvrConfig2; B_UINT32 HostDrvrConfig3; B_UINT32 HostDrvrConfig4; B_UINT32 HostDrvrConfig5; B_UINT32 HostDrvrConfig6; B_UINT32 m_u32SegmentedPUSCenable; // BAMC enable - but 4.x does not support this feature // This is added just to sync 4.x and 5.x CFGs B_UINT32 m_u32BandAMCEnable; } STARGETPARAMS, *PSTARGETPARAMS; #endif typedef struct _STTARGETDSXBUFFER { ULONG ulTargetDsxBuffer; B_UINT16 tid; BOOLEAN valid; }STTARGETDSXBUFFER, *PSTTARGETDSXBUFFER; typedef INT (*FP_FLASH_WRITE)(struct _MINI_ADAPTER*,UINT,PVOID); typedef INT (*FP_FLASH_WRITE_STATUS)(struct _MINI_ADAPTER*,UINT,PVOID); /** Driver adapter data structure */ struct _MINI_ADAPTER { struct _MINI_ADAPTER *next; struct net_device *dev; u32 msg_enable; CHAR *caDsxReqResp; atomic_t ApplicationRunning; volatile INT CtrlQueueLen; atomic_t AppCtrlQueueLen; BOOLEAN AppCtrlQueueOverFlow; atomic_t CurrentApplicationCount; atomic_t RegisteredApplicationCount; BOOLEAN LinkUpStatus; BOOLEAN TimerActive; u32 StatisticsPointer; struct sk_buff *RxControlHead; struct sk_buff *RxControlTail; struct semaphore RxAppControlQueuelock; struct semaphore fw_download_sema; PPER_TARANG_DATA pTarangs; spinlock_t control_queue_lock; wait_queue_head_t process_read_wait_queue; ULONG bcm_jiffies; /* Store Jiffies value */ // the pointer to the first packet we have queued in send // deserialized miniport support variables atomic_t TotalPacketCount; atomic_t TxPktAvail; // this to keep track of the Tx and Rx MailBox Registers. atomic_t CurrNumFreeTxDesc; // to keep track the no of byte recieved USHORT PrevNumRecvDescs; USHORT CurrNumRecvDescs; UINT u32TotalDSD; PacketInfo PackInfo[NO_OF_QUEUES]; S_CLASSIFIER_RULE astClassifierTable[MAX_CLASSIFIERS]; BOOLEAN TransferMode; /*************** qos ******************/ BOOLEAN bETHCSEnabled; ULONG BEBucketSize; ULONG rtPSBucketSize; UCHAR LinkStatus; BOOLEAN AutoLinkUp; BOOLEAN AutoSyncup; int major; int minor; wait_queue_head_t tx_packet_wait_queue; wait_queue_head_t process_rx_cntrlpkt; atomic_t process_waiting; BOOLEAN fw_download_done; char *txctlpacket[MAX_CNTRL_PKTS]; atomic_t cntrlpktCnt ; atomic_t index_app_read_cntrlpkt; atomic_t index_wr_txcntrlpkt; atomic_t index_rd_txcntrlpkt; UINT index_datpkt; struct semaphore rdmwrmsync; STTARGETDSXBUFFER astTargetDsxBuffer[MAX_TARGET_DSX_BUFFERS]; ULONG ulFreeTargetBufferCnt; ULONG ulCurrentTargetBuffer; ULONG ulTotalTargetBuffersAvailable; unsigned long chip_id; wait_queue_head_t lowpower_mode_wait_queue; BOOLEAN bFlashBoot; BOOLEAN bBinDownloaded; BOOLEAN bCfgDownloaded; BOOLEAN bSyncUpRequestSent; USHORT usBestEffortQueueIndex; wait_queue_head_t ioctl_fw_dnld_wait_queue; BOOLEAN waiting_to_fw_download_done; pid_t fw_download_process_pid; PSTARGETPARAMS pstargetparams; BOOLEAN device_removed; BOOLEAN DeviceAccess; BOOLEAN bIsAutoCorrectEnabled; BOOLEAN bDDRInitDone; INT DDRSetting; ULONG ulPowerSaveMode; spinlock_t txtransmitlock; B_UINT8 txtransmit_running; /* Thread for control packet handling */ struct task_struct *control_packet_handler; /* thread for transmitting packets. */ struct task_struct *transmit_packet_thread; /* LED Related Structures */ LED_INFO_STRUCT LEDInfo; /* Driver State for LED Blinking */ LedEventInfo_t DriverState; /* Interface Specific */ PVOID pvInterfaceAdapter; int (*bcm_file_download)( PVOID, struct file *, unsigned int); int (*bcm_file_readback_from_chip)( PVOID, struct file *, unsigned int); INT (*interface_rdm)(PVOID, UINT , PVOID , INT); INT (*interface_wrm)(PVOID, UINT , PVOID , INT); int (*interface_transmit)(PVOID, PVOID , UINT); BOOLEAN IdleMode; BOOLEAN bDregRequestSentInIdleMode; BOOLEAN bTriedToWakeUpFromlowPowerMode; BOOLEAN bShutStatus; BOOLEAN bWakeUpDevice; unsigned int usIdleModePattern; //BOOLEAN bTriedToWakeUpFromShutdown; BOOLEAN bLinkDownRequested; int downloadDDR; PHS_DEVICE_EXTENSION stBCMPhsContext; S_HDR_SUPRESSION_CONTEXTINFO stPhsTxContextInfo; uint8_t ucaPHSPktRestoreBuf[2048]; uint8_t bPHSEnabled; BOOLEAN AutoFirmDld; BOOLEAN bMipsConfig; BOOLEAN bDPLLConfig; UINT32 aTxPktSizeHist[MIBS_MAX_HIST_ENTRIES]; UINT32 aRxPktSizeHist[MIBS_MAX_HIST_ENTRIES]; S_FRAGMENTED_PACKET_INFO astFragmentedPktClassifierTable[MAX_FRAGMENTEDIP_CLASSIFICATION_ENTRIES]; atomic_t uiMBupdate; UINT32 PmuMode; NVM_TYPE eNVMType; UINT uiSectorSize; UINT uiSectorSizeInCFG; BOOLEAN bSectorSizeOverride; BOOLEAN bStatusWrite; UINT uiNVMDSDSize; UINT uiVendorExtnFlag; //it will always represent choosed DSD at any point of time. // Generally it is Active DSD but in case of NVM RD/WR it might be different. UINT ulFlashCalStart; ULONG ulFlashControlSectionStart; ULONG ulFlashWriteSize; ULONG ulFlashID; FP_FLASH_WRITE fpFlashWrite; FP_FLASH_WRITE_STATUS fpFlashWriteWithStatusCheck; struct semaphore NVMRdmWrmLock; struct device *pstCreatedClassDevice; // BOOLEAN InterfaceUpStatus; PFLASH2X_CS_INFO psFlash2xCSInfo; PFLASH_CS_INFO psFlashCSInfo ; PFLASH2X_VENDORSPECIFIC_INFO psFlash2xVendorInfo; UINT uiFlashBaseAdd; //Flash start address UINT uiActiveISOOffset; //Active ISO offset choosen before f/w download FLASH2X_SECTION_VAL eActiveISO; //Active ISO section val FLASH2X_SECTION_VAL eActiveDSD; //Active DSD val choosen before f/w download UINT uiActiveDSDOffsetAtFwDld; //For accessing Active DSD choosen before f/w download UINT uiFlashLayoutMajorVersion ; UINT uiFlashLayoutMinorVersion; BOOLEAN bAllDSDWriteAllow ; BOOLEAN bSigCorrupted ; //this should be set who so ever want to change the Headers. after Wrtie it should be reset immediately. BOOLEAN bHeaderChangeAllowed ; INT SelectedChip ; BOOLEAN bEndPointHalted; //while bFlashRawRead will be true, Driver ignore map lay out and consider flash as of without any map. BOOLEAN bFlashRawRead; BOOLEAN bPreparingForLowPowerMode ; BOOLEAN bDoSuspend ; UINT syscfgBefFwDld ; BOOLEAN StopAllXaction ; UINT32 liTimeSinceLastNetEntry; //Used to Support extended CAPI requirements from struct semaphore LowPowerModeSync; ULONG liDrainCalculated; UINT gpioBitMap; S_BCM_DEBUG_STATE stDebugState; }; typedef struct _MINI_ADAPTER MINI_ADAPTER, *PMINI_ADAPTER; #define GET_BCM_ADAPTER(net_dev) netdev_priv(net_dev) struct _ETH_HEADER_STRUC { UCHAR au8DestinationAddress[6]; UCHAR au8SourceAddress[6]; USHORT u16Etype; }__attribute__((packed)); typedef struct _ETH_HEADER_STRUC ETH_HEADER_STRUC, *PETH_HEADER_STRUC; typedef struct FirmwareInfo { void __user * pvMappedFirmwareAddress; ULONG u32FirmwareLength; ULONG u32StartingAddress; }__attribute__((packed)) FIRMWARE_INFO, *PFIRMWARE_INFO; // holds the value of net_device structure.. extern struct net_device *gblpnetdev; typedef struct _cntl_pkt{ PMINI_ADAPTER Adapter; PLEADER PLeader; }cntl_pkt; typedef LINK_REQUEST CONTROL_MESSAGE; typedef struct _DDR_SETTING { ULONG ulRegAddress; ULONG ulRegValue; }DDR_SETTING, *PDDR_SETTING; typedef DDR_SETTING DDR_SET_NODE, *PDDR_SET_NODE; INT InitAdapter(PMINI_ADAPTER psAdapter); // ===================================================================== // Beceem vendor request codes for EP0 // ===================================================================== #define BCM_REQUEST_READ 0x2 #define BCM_REQUEST_WRITE 0x1 #define EP2_MPS_REG 0x0F0110A0 #define EP2_MPS 0x40 #define EP2_CFG_REG 0x0F0110A8 #define EP2_CFG_INT 0x27 #define EP2_CFG_BULK 0x25 #define EP4_MPS_REG 0x0F0110F0 #define EP4_MPS 0x8C #define EP4_CFG_REG 0x0F0110F8 #define ISO_MPS_REG 0x0F0110C8 #define ISO_MPS 0x00000000 #define EP1 0 #define EP2 1 #define EP3 2 #define EP4 3 #define EP5 4 #define EP6 5 typedef enum eInterface_setting { DEFAULT_SETTING_0 = 0, ALTERNATE_SETTING_1 = 1, }INTERFACE_SETTING; #endif //__ADAPTER_H__