1 /*********************************** 2 * Adapter.h 3 ************************************/ 4 #ifndef __ADAPTER_H__ 5 #define __ADAPTER_H__ 6 7 #define MAX_FRAGMENTEDIP_CLASSIFICATION_ENTRIES 256 8 #include "Debug.h" 9 10 struct bcm_leader { 11 USHORT Vcid; 12 USHORT PLength; 13 UCHAR Status; 14 UCHAR Unused[3]; 15 } __packed; 16 17 struct bcm_packettosend { 18 struct bcm_leader Leader; 19 UCHAR ucPayload; 20 } __packed; 21 22 struct bcm_control_packet { 23 PVOID ControlBuff; 24 UINT ControlBuffLen; 25 struct bcm_control_packet *next; 26 } __packed; 27 28 struct bcm_link_request { 29 struct bcm_leader Leader; 30 UCHAR szData[4]; 31 } __packed; 32 33 #define MAX_IP_RANGE_LENGTH 4 34 #define MAX_PORT_RANGE 4 35 #define MAX_PROTOCOL_LENGTH 32 36 #define IPV6_ADDRESS_SIZEINBYTES 0x10 37 38 typedef union _U_IP_ADDRESS { 39 struct { 40 ULONG ulIpv4Addr[MAX_IP_RANGE_LENGTH]; /* Source Ip Address Range */ 41 ULONG ulIpv4Mask[MAX_IP_RANGE_LENGTH]; /* Source Ip Mask Address Range */ 42 }; 43 struct { 44 ULONG ulIpv6Addr[MAX_IP_RANGE_LENGTH * 4]; /* Source Ip Address Range */ 45 ULONG ulIpv6Mask[MAX_IP_RANGE_LENGTH * 4]; /* Source Ip Mask Address Range */ 46 }; 47 struct { 48 UCHAR ucIpv4Address[MAX_IP_RANGE_LENGTH * IP_LENGTH_OF_ADDRESS]; 49 UCHAR ucIpv4Mask[MAX_IP_RANGE_LENGTH * IP_LENGTH_OF_ADDRESS]; 50 }; 51 struct { 52 UCHAR ucIpv6Address[MAX_IP_RANGE_LENGTH * IPV6_ADDRESS_SIZEINBYTES]; 53 UCHAR ucIpv6Mask[MAX_IP_RANGE_LENGTH * IPV6_ADDRESS_SIZEINBYTES]; 54 }; 55 } U_IP_ADDRESS; 56 57 struct bcm_hdr_suppression_contextinfo { 58 UCHAR ucaHdrSuppressionInBuf[MAX_PHS_LENGTHS]; /* Intermediate buffer to accumulate pkt Header for PHS */ 59 UCHAR ucaHdrSuppressionOutBuf[MAX_PHS_LENGTHS + PHSI_LEN]; /* Intermediate buffer containing pkt Header after PHS */ 60 }; 61 62 struct bcm_classifier_rule { 63 ULONG ulSFID; 64 UCHAR ucReserved[2]; 65 B_UINT16 uiClassifierRuleIndex; 66 BOOLEAN bUsed; 67 USHORT usVCID_Value; 68 B_UINT8 u8ClassifierRulePriority; /* This field detemines the Classifier Priority */ 69 U_IP_ADDRESS stSrcIpAddress; 70 UCHAR ucIPSourceAddressLength; /* Ip Source Address Length */ 71 72 U_IP_ADDRESS stDestIpAddress; 73 UCHAR ucIPDestinationAddressLength; /* Ip Destination Address Length */ 74 UCHAR ucIPTypeOfServiceLength; /* Type of service Length */ 75 UCHAR ucTosLow; /* Tos Low */ 76 UCHAR ucTosHigh; /* Tos High */ 77 UCHAR ucTosMask; /* Tos Mask */ 78 79 UCHAR ucProtocolLength; /* protocol Length */ 80 UCHAR ucProtocol[MAX_PROTOCOL_LENGTH]; /* protocol Length */ 81 USHORT usSrcPortRangeLo[MAX_PORT_RANGE]; 82 USHORT usSrcPortRangeHi[MAX_PORT_RANGE]; 83 UCHAR ucSrcPortRangeLength; 84 85 USHORT usDestPortRangeLo[MAX_PORT_RANGE]; 86 USHORT usDestPortRangeHi[MAX_PORT_RANGE]; 87 UCHAR ucDestPortRangeLength; 88 89 BOOLEAN bProtocolValid; 90 BOOLEAN bTOSValid; 91 BOOLEAN bDestIpValid; 92 BOOLEAN bSrcIpValid; 93 94 /* For IPv6 Addressing */ 95 UCHAR ucDirection; 96 BOOLEAN bIpv6Protocol; 97 UINT32 u32PHSRuleID; 98 struct bcm_phs_rule sPhsRule; 99 UCHAR u8AssociatedPHSI; 100 101 /* Classification fields for ETH CS */ 102 UCHAR ucEthCSSrcMACLen; 103 UCHAR au8EThCSSrcMAC[MAC_ADDRESS_SIZE]; 104 UCHAR au8EThCSSrcMACMask[MAC_ADDRESS_SIZE]; 105 UCHAR ucEthCSDestMACLen; 106 UCHAR au8EThCSDestMAC[MAC_ADDRESS_SIZE]; 107 UCHAR au8EThCSDestMACMask[MAC_ADDRESS_SIZE]; 108 UCHAR ucEtherTypeLen; 109 UCHAR au8EthCSEtherType[NUM_ETHERTYPE_BYTES]; 110 UCHAR usUserPriority[2]; 111 USHORT usVLANID; 112 USHORT usValidityBitMap; 113 }; 114 115 struct bcm_fragmented_packet_info { 116 BOOLEAN bUsed; 117 ULONG ulSrcIpAddress; 118 USHORT usIpIdentification; 119 struct bcm_classifier_rule *pstMatchedClassifierEntry; 120 BOOLEAN bOutOfOrderFragment; 121 }; 122 123 struct bcm_packet_info { 124 /* classification extension Rule */ 125 ULONG ulSFID; 126 USHORT usVCID_Value; 127 UINT uiThreshold; 128 /* This field determines the priority of the SF Queues */ 129 B_UINT8 u8TrafficPriority; 130 131 BOOLEAN bValid; 132 BOOLEAN bActive; 133 BOOLEAN bActivateRequestSent; 134 135 B_UINT8 u8QueueType; /* BE or rtPS */ 136 137 UINT uiMaxBucketSize; /* maximum size of the bucket for the queue */ 138 UINT uiCurrentQueueDepthOnTarget; 139 UINT uiCurrentBytesOnHost; 140 UINT uiCurrentPacketsOnHost; 141 UINT uiDroppedCountBytes; 142 UINT uiDroppedCountPackets; 143 UINT uiSentBytes; 144 UINT uiSentPackets; 145 UINT uiCurrentDrainRate; 146 UINT uiThisPeriodSentBytes; 147 LARGE_INTEGER liDrainCalculated; 148 UINT uiCurrentTokenCount; 149 LARGE_INTEGER liLastUpdateTokenAt; 150 UINT uiMaxAllowedRate; 151 UINT NumOfPacketsSent; 152 UCHAR ucDirection; 153 USHORT usCID; 154 struct bcm_mibs_parameters stMibsExtServiceFlowTable; 155 UINT uiCurrentRxRate; 156 UINT uiThisPeriodRxBytes; 157 UINT uiTotalRxBytes; 158 UINT uiTotalTxBytes; 159 UINT uiPendedLast; 160 UCHAR ucIpVersion; 161 162 union { 163 struct { 164 struct sk_buff *FirstTxQueue; 165 struct sk_buff *LastTxQueue; 166 }; 167 struct { 168 struct sk_buff *ControlHead; 169 struct sk_buff *ControlTail; 170 }; 171 }; 172 173 BOOLEAN bProtocolValid; 174 BOOLEAN bTOSValid; 175 BOOLEAN bDestIpValid; 176 BOOLEAN bSrcIpValid; 177 178 BOOLEAN bActiveSet; 179 BOOLEAN bAdmittedSet; 180 BOOLEAN bAuthorizedSet; 181 BOOLEAN bClassifierPriority; 182 UCHAR ucServiceClassName[MAX_CLASS_NAME_LENGTH]; 183 BOOLEAN bHeaderSuppressionEnabled; 184 spinlock_t SFQueueLock; 185 void *pstSFIndication; 186 struct timeval stLastUpdateTokenAt; 187 atomic_t uiPerSFTxResourceCount; 188 UINT uiMaxLatency; 189 UCHAR bIPCSSupport; 190 UCHAR bEthCSSupport; 191 }; 192 193 struct bcm_tarang_data { 194 struct bcm_tarang_data *next; 195 struct bcm_mini_adapter *Adapter; 196 struct sk_buff *RxAppControlHead; 197 struct sk_buff *RxAppControlTail; 198 int AppCtrlQueueLen; 199 BOOLEAN MacTracingEnabled; 200 BOOLEAN bApplicationToExit; 201 struct bcm_mibs_dropped_cntrl_msg stDroppedAppCntrlMsgs; 202 ULONG RxCntrlMsgBitMask; 203 }; 204 205 struct bcm_targetdsx_buffer { 206 ULONG ulTargetDsxBuffer; 207 B_UINT16 tid; 208 BOOLEAN valid; 209 }; 210 211 typedef int (*FP_FLASH_WRITE)(struct bcm_mini_adapter *, UINT, PVOID); 212 213 typedef int (*FP_FLASH_WRITE_STATUS)(struct bcm_mini_adapter *, UINT, PVOID); 214 215 /* 216 * Driver adapter data structure 217 */ 218 struct bcm_mini_adapter { 219 struct bcm_mini_adapter *next; 220 struct net_device *dev; 221 u32 msg_enable; 222 CHAR *caDsxReqResp; 223 atomic_t ApplicationRunning; 224 BOOLEAN AppCtrlQueueOverFlow; 225 atomic_t CurrentApplicationCount; 226 atomic_t RegisteredApplicationCount; 227 BOOLEAN LinkUpStatus; 228 BOOLEAN TimerActive; 229 u32 StatisticsPointer; 230 struct sk_buff *RxControlHead; 231 struct sk_buff *RxControlTail; 232 struct semaphore RxAppControlQueuelock; 233 struct semaphore fw_download_sema; 234 struct bcm_tarang_data *pTarangs; 235 spinlock_t control_queue_lock; 236 wait_queue_head_t process_read_wait_queue; 237 238 /* the pointer to the first packet we have queued in send 239 * deserialized miniport support variables 240 */ 241 atomic_t TotalPacketCount; 242 atomic_t TxPktAvail; 243 244 /* this to keep track of the Tx and Rx MailBox Registers. */ 245 atomic_t CurrNumFreeTxDesc; 246 /* to keep track the no of byte received */ 247 USHORT PrevNumRecvDescs; 248 USHORT CurrNumRecvDescs; 249 UINT u32TotalDSD; 250 struct bcm_packet_info PackInfo[NO_OF_QUEUES]; 251 struct bcm_classifier_rule astClassifierTable[MAX_CLASSIFIERS]; 252 BOOLEAN TransferMode; 253 254 /*************** qos ******************/ 255 BOOLEAN bETHCSEnabled; 256 ULONG BEBucketSize; 257 ULONG rtPSBucketSize; 258 UCHAR LinkStatus; 259 BOOLEAN AutoLinkUp; 260 BOOLEAN AutoSyncup; 261 262 int major; 263 int minor; 264 wait_queue_head_t tx_packet_wait_queue; 265 wait_queue_head_t process_rx_cntrlpkt; 266 atomic_t process_waiting; 267 BOOLEAN fw_download_done; 268 269 char *txctlpacket[MAX_CNTRL_PKTS]; 270 atomic_t cntrlpktCnt ; 271 atomic_t index_app_read_cntrlpkt; 272 atomic_t index_wr_txcntrlpkt; 273 atomic_t index_rd_txcntrlpkt; 274 UINT index_datpkt; 275 struct semaphore rdmwrmsync; 276 277 struct bcm_targetdsx_buffer astTargetDsxBuffer[MAX_TARGET_DSX_BUFFERS]; 278 ULONG ulFreeTargetBufferCnt; 279 ULONG ulCurrentTargetBuffer; 280 ULONG ulTotalTargetBuffersAvailable; 281 unsigned long chip_id; 282 wait_queue_head_t lowpower_mode_wait_queue; 283 BOOLEAN bFlashBoot; 284 BOOLEAN bBinDownloaded; 285 BOOLEAN bCfgDownloaded; 286 BOOLEAN bSyncUpRequestSent; 287 USHORT usBestEffortQueueIndex; 288 wait_queue_head_t ioctl_fw_dnld_wait_queue; 289 BOOLEAN waiting_to_fw_download_done; 290 pid_t fw_download_process_pid; 291 struct bcm_target_params *pstargetparams; 292 BOOLEAN device_removed; 293 BOOLEAN DeviceAccess; 294 BOOLEAN bIsAutoCorrectEnabled; 295 BOOLEAN bDDRInitDone; 296 int DDRSetting; 297 ULONG ulPowerSaveMode; 298 spinlock_t txtransmitlock; 299 B_UINT8 txtransmit_running; 300 /* Thread for control packet handling */ 301 struct task_struct *control_packet_handler; 302 /* thread for transmitting packets. */ 303 struct task_struct *transmit_packet_thread; 304 305 /* LED Related Structures */ 306 struct bcm_led_info LEDInfo; 307 308 /* Driver State for LED Blinking */ 309 enum bcm_led_events DriverState; 310 /* Interface Specific */ 311 PVOID pvInterfaceAdapter; 312 int (*bcm_file_download)(PVOID, 313 struct file *, 314 unsigned int); 315 int (*bcm_file_readback_from_chip)(PVOID, 316 struct file *, 317 unsigned int); 318 int (*interface_rdm)(PVOID, 319 UINT, 320 PVOID, 321 int); 322 int (*interface_wrm)(PVOID, 323 UINT, 324 PVOID, 325 int); 326 int (*interface_transmit)(PVOID, PVOID , UINT); 327 BOOLEAN IdleMode; 328 BOOLEAN bDregRequestSentInIdleMode; 329 BOOLEAN bTriedToWakeUpFromlowPowerMode; 330 BOOLEAN bShutStatus; 331 BOOLEAN bWakeUpDevice; 332 unsigned int usIdleModePattern; 333 /* BOOLEAN bTriedToWakeUpFromShutdown; */ 334 BOOLEAN bLinkDownRequested; 335 int downloadDDR; 336 struct bcm_phs_extension stBCMPhsContext; 337 struct bcm_hdr_suppression_contextinfo stPhsTxContextInfo; 338 uint8_t ucaPHSPktRestoreBuf[2048]; 339 uint8_t bPHSEnabled; 340 BOOLEAN AutoFirmDld; 341 BOOLEAN bMipsConfig; 342 BOOLEAN bDPLLConfig; 343 UINT32 aTxPktSizeHist[MIBS_MAX_HIST_ENTRIES]; 344 UINT32 aRxPktSizeHist[MIBS_MAX_HIST_ENTRIES]; 345 struct bcm_fragmented_packet_info astFragmentedPktClassifierTable[MAX_FRAGMENTEDIP_CLASSIFICATION_ENTRIES]; 346 atomic_t uiMBupdate; 347 UINT32 PmuMode; 348 enum bcm_nvm_type eNVMType; 349 UINT uiSectorSize; 350 UINT uiSectorSizeInCFG; 351 BOOLEAN bSectorSizeOverride; 352 BOOLEAN bStatusWrite; 353 UINT uiNVMDSDSize; 354 UINT uiVendorExtnFlag; 355 /* it will always represent chosen DSD at any point of time. 356 * Generally it is Active DSD but in case of NVM RD/WR it might be different. 357 */ 358 UINT ulFlashCalStart; 359 ULONG ulFlashControlSectionStart; 360 ULONG ulFlashWriteSize; 361 ULONG ulFlashID; 362 FP_FLASH_WRITE fpFlashWrite; 363 FP_FLASH_WRITE_STATUS fpFlashWriteWithStatusCheck; 364 365 struct semaphore NVMRdmWrmLock; 366 struct device *pstCreatedClassDevice; 367 368 /* BOOLEAN InterfaceUpStatus; */ 369 struct bcm_flash2x_cs_info *psFlash2xCSInfo; 370 struct bcm_flash_cs_info *psFlashCSInfo; 371 struct bcm_flash2x_vendor_info *psFlash2xVendorInfo; 372 UINT uiFlashBaseAdd; /* Flash start address */ 373 UINT uiActiveISOOffset; /* Active ISO offset chosen before f/w download */ 374 enum bcm_flash2x_section_val eActiveISO; /* Active ISO section val */ 375 enum bcm_flash2x_section_val eActiveDSD; /* Active DSD val chosen before f/w download */ 376 UINT uiActiveDSDOffsetAtFwDld; /* For accessing Active DSD chosen before f/w download */ 377 UINT uiFlashLayoutMajorVersion; 378 UINT uiFlashLayoutMinorVersion; 379 BOOLEAN bAllDSDWriteAllow; 380 BOOLEAN bSigCorrupted; 381 /* this should be set who so ever want to change the Headers. after Wrtie it should be reset immediately. */ 382 BOOLEAN bHeaderChangeAllowed; 383 int SelectedChip; 384 BOOLEAN bEndPointHalted; 385 /* while bFlashRawRead will be true, Driver ignore map lay out and consider flash as of without any map. */ 386 BOOLEAN bFlashRawRead; 387 BOOLEAN bPreparingForLowPowerMode; 388 BOOLEAN bDoSuspend; 389 UINT syscfgBefFwDld; 390 BOOLEAN StopAllXaction; 391 UINT32 liTimeSinceLastNetEntry; /* Used to Support extended CAPI requirements from */ 392 struct semaphore LowPowerModeSync; 393 ULONG liDrainCalculated; 394 UINT gpioBitMap; 395 struct bcm_debug_state stDebugState; 396 }; 397 398 #define GET_BCM_ADAPTER(net_dev) netdev_priv(net_dev) 399 400 struct bcm_eth_header { 401 UCHAR au8DestinationAddress[6]; 402 UCHAR au8SourceAddress[6]; 403 USHORT u16Etype; 404 } __packed; 405 406 struct bcm_firmware_info { 407 void __user *pvMappedFirmwareAddress; 408 ULONG u32FirmwareLength; 409 ULONG u32StartingAddress; 410 } __packed; 411 412 /* holds the value of net_device structure.. */ 413 extern struct net_device *gblpnetdev; 414 415 struct bcm_ddr_setting { 416 UINT ulRegAddress; 417 UINT ulRegValue; 418 }; 419 int InitAdapter(struct bcm_mini_adapter *psAdapter); 420 421 /* ===================================================================== 422 * Beceem vendor request codes for EP0 423 * ===================================================================== 424 */ 425 426 #define BCM_REQUEST_READ 0x2 427 #define BCM_REQUEST_WRITE 0x1 428 #define EP2_MPS_REG 0x0F0110A0 429 #define EP2_MPS 0x40 430 431 #define EP2_CFG_REG 0x0F0110A8 432 #define EP2_CFG_INT 0x27 433 #define EP2_CFG_BULK 0x25 434 435 #define EP4_MPS_REG 0x0F0110F0 436 #define EP4_MPS 0x8C 437 438 #define EP4_CFG_REG 0x0F0110F8 439 440 #define ISO_MPS_REG 0x0F0110C8 441 #define ISO_MPS 0x00000000 442 443 #define EP1 0 444 #define EP2 1 445 #define EP3 2 446 #define EP4 3 447 #define EP5 4 448 #define EP6 5 449 450 enum bcm_einterface_setting { 451 DEFAULT_SETTING_0 = 0, 452 ALTERNATE_SETTING_1 = 1, 453 }; 454 455 #endif /* __ADAPTER_H__ */ 456