/*********************************** * Adapter.h ************************************/ #ifndef __ADAPTER_H__ #define __ADAPTER_H__ #define MAX_FRAGMENTEDIP_CLASSIFICATION_ENTRIES 256 #include "Debug.h" struct bcm_leader { USHORT Vcid; USHORT PLength; UCHAR Status; UCHAR Unused[3]; } __packed; struct bcm_packettosend { struct bcm_leader Leader; UCHAR ucPayload; } __packed; struct bcm_control_packet { PVOID ControlBuff; UINT ControlBuffLen; struct bcm_control_packet *next; } __packed; struct bcm_link_request { struct bcm_leader Leader; UCHAR szData[4]; } __packed; #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 bcm_hdr_suppression_contextinfo { UCHAR ucaHdrSuppressionInBuf[MAX_PHS_LENGTHS]; /* Intermediate buffer to accumulate pkt Header for PHS */ UCHAR ucaHdrSuppressionOutBuf[MAX_PHS_LENGTHS + PHSI_LEN]; /* Intermediate buffer containing pkt Header after PHS */ }; struct bcm_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; struct bcm_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; }; struct bcm_fragmented_packet_info { BOOLEAN bUsed; ULONG ulSrcIpAddress; USHORT usIpIdentification; struct bcm_classifier_rule *pstMatchedClassifierEntry; BOOLEAN bOutOfOrderFragment; }; struct bcm_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; struct bcm_mibs_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; }; struct bcm_tarang_data { struct bcm_tarang_data *next; struct bcm_mini_adapter *Adapter; struct sk_buff *RxAppControlHead; struct sk_buff *RxAppControlTail; int AppCtrlQueueLen; BOOLEAN MacTracingEnabled; BOOLEAN bApplicationToExit; struct bcm_mibs_dropped_cntrl_msg stDroppedAppCntrlMsgs; ULONG RxCntrlMsgBitMask; }; struct bcm_targetdsx_buffer { ULONG ulTargetDsxBuffer; B_UINT16 tid; BOOLEAN valid; }; typedef int (*FP_FLASH_WRITE)(struct bcm_mini_adapter *, UINT, PVOID); typedef int (*FP_FLASH_WRITE_STATUS)(struct bcm_mini_adapter *, UINT, PVOID); /* * Driver adapter data structure */ struct bcm_mini_adapter { struct bcm_mini_adapter *next; struct net_device *dev; u32 msg_enable; CHAR *caDsxReqResp; atomic_t ApplicationRunning; 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; struct bcm_tarang_data *pTarangs; spinlock_t control_queue_lock; wait_queue_head_t process_read_wait_queue; /* 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 received */ USHORT PrevNumRecvDescs; USHORT CurrNumRecvDescs; UINT u32TotalDSD; struct bcm_packet_info PackInfo[NO_OF_QUEUES]; struct bcm_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; struct bcm_targetdsx_buffer 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; struct bcm_target_params *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 */ struct bcm_led_info LEDInfo; /* Driver State for LED Blinking */ enum bcm_led_events 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; struct bcm_phs_extension stBCMPhsContext; struct bcm_hdr_suppression_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]; struct bcm_fragmented_packet_info astFragmentedPktClassifierTable[MAX_FRAGMENTEDIP_CLASSIFICATION_ENTRIES]; atomic_t uiMBupdate; UINT32 PmuMode; enum bcm_nvm_type eNVMType; UINT uiSectorSize; UINT uiSectorSizeInCFG; BOOLEAN bSectorSizeOverride; BOOLEAN bStatusWrite; UINT uiNVMDSDSize; UINT uiVendorExtnFlag; /* it will always represent chosen 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; */ struct bcm_flash2x_cs_info *psFlash2xCSInfo; struct bcm_flash_cs_info *psFlashCSInfo; struct bcm_flash2x_vendor_info *psFlash2xVendorInfo; UINT uiFlashBaseAdd; /* Flash start address */ UINT uiActiveISOOffset; /* Active ISO offset chosen before f/w download */ enum bcm_flash2x_section_val eActiveISO; /* Active ISO section val */ enum bcm_flash2x_section_val eActiveDSD; /* Active DSD val chosen before f/w download */ UINT uiActiveDSDOffsetAtFwDld; /* For accessing Active DSD chosen 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; struct bcm_debug_state stDebugState; }; #define GET_BCM_ADAPTER(net_dev) netdev_priv(net_dev) struct bcm_eth_header { UCHAR au8DestinationAddress[6]; UCHAR au8SourceAddress[6]; USHORT u16Etype; } __packed; struct bcm_firmware_info { void __user *pvMappedFirmwareAddress; ULONG u32FirmwareLength; ULONG u32StartingAddress; } __packed; /* holds the value of net_device structure.. */ extern struct net_device *gblpnetdev; struct bcm_ddr_setting { UINT ulRegAddress; UINT ulRegValue; }; int InitAdapter(struct bcm_mini_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 enum bcm_einterface_setting { DEFAULT_SETTING_0 = 0, ALTERNATE_SETTING_1 = 1, }; #endif /* __ADAPTER_H__ */