📄 tigon3.c
字号:
__raw_writel(0xffffffff, &(pDevice->pMemView->uIntMem.MemBlock32K[0x301])); if (__raw_readl(&(pDevice->pMemView->uIntMem.MemBlock32K[0x300]))) { pDevice->EnablePciXFix = TRUE; } } }#endif#if 1 /* * This code was at the beginning of else block below, but that's * a bug if node address in shared memory. */ MM_Wait(50); LM_NvramInit(pDevice);#endif /* Get the node address. First try to get in from the shared memory. */ /* If the signature is not present, then get it from the NVRAM. */ Value32 = MEM_RD_OFFSET(pDevice, T3_MAC_ADDR_HIGH_MAILBOX); if((Value32 >> 16) == 0x484b) { pDevice->NodeAddress[0] = (LM_UINT8) (Value32 >> 8); pDevice->NodeAddress[1] = (LM_UINT8) Value32; Value32 = MEM_RD_OFFSET(pDevice, T3_MAC_ADDR_LOW_MAILBOX); pDevice->NodeAddress[2] = (LM_UINT8) (Value32 >> 24); pDevice->NodeAddress[3] = (LM_UINT8) (Value32 >> 16); pDevice->NodeAddress[4] = (LM_UINT8) (Value32 >> 8); pDevice->NodeAddress[5] = (LM_UINT8) Value32; Status = LM_STATUS_SUCCESS; } else { Status = LM_NvramRead(pDevice, 0x7c, &Value32); if(Status == LM_STATUS_SUCCESS) { pDevice->NodeAddress[0] = (LM_UINT8) (Value32 >> 16); pDevice->NodeAddress[1] = (LM_UINT8) (Value32 >> 24); Status = LM_NvramRead(pDevice, 0x80, &Value32); pDevice->NodeAddress[2] = (LM_UINT8) Value32; pDevice->NodeAddress[3] = (LM_UINT8) (Value32 >> 8); pDevice->NodeAddress[4] = (LM_UINT8) (Value32 >> 16); pDevice->NodeAddress[5] = (LM_UINT8) (Value32 >> 24); } } /* Assign a default address. */ if(Status != LM_STATUS_SUCCESS) {#ifndef EMBEDDED printk(KERN_ERR "Cannot get MAC addr from NVRAM. Using default.\n");#endif pDevice->NodeAddress[0] = 0x00; pDevice->NodeAddress[1] = 0x10; pDevice->NodeAddress[2] = 0x18; pDevice->NodeAddress[3] = 0x68; pDevice->NodeAddress[4] = 0x61; pDevice->NodeAddress[5] = 0x76; } pDevice->PermanentNodeAddress[0] = pDevice->NodeAddress[0]; pDevice->PermanentNodeAddress[1] = pDevice->NodeAddress[1]; pDevice->PermanentNodeAddress[2] = pDevice->NodeAddress[2]; pDevice->PermanentNodeAddress[3] = pDevice->NodeAddress[3]; pDevice->PermanentNodeAddress[4] = pDevice->NodeAddress[4]; pDevice->PermanentNodeAddress[5] = pDevice->NodeAddress[5]; /* Initialize the default values. */ pDevice->NoTxPseudoHdrChksum = FALSE; pDevice->NoRxPseudoHdrChksum = FALSE; pDevice->NicSendBd = FALSE; pDevice->TxPacketDescCnt = DEFAULT_TX_PACKET_DESC_COUNT; pDevice->RxStdDescCnt = DEFAULT_STD_RCV_DESC_COUNT; pDevice->RxCoalescingTicks = DEFAULT_RX_COALESCING_TICKS; pDevice->TxCoalescingTicks = DEFAULT_TX_COALESCING_TICKS; pDevice->RxMaxCoalescedFrames = DEFAULT_RX_MAX_COALESCED_FRAMES; pDevice->TxMaxCoalescedFrames = DEFAULT_TX_MAX_COALESCED_FRAMES; pDevice->RxCoalescingTicksDuringInt = BAD_DEFAULT_VALUE; pDevice->TxCoalescingTicksDuringInt = BAD_DEFAULT_VALUE; pDevice->RxMaxCoalescedFramesDuringInt = BAD_DEFAULT_VALUE; pDevice->TxMaxCoalescedFramesDuringInt = BAD_DEFAULT_VALUE; pDevice->StatsCoalescingTicks = DEFAULT_STATS_COALESCING_TICKS; pDevice->EnableMWI = FALSE; pDevice->TxMtu = MAX_ETHERNET_PACKET_SIZE_NO_CRC; pDevice->RxMtu = MAX_ETHERNET_PACKET_SIZE_NO_CRC; pDevice->DisableAutoNeg = FALSE; pDevice->PhyIntMode = T3_PHY_INT_MODE_AUTO; pDevice->LinkChngMode = T3_LINK_CHNG_MODE_AUTO; pDevice->LedMode = LED_MODE_AUTO; pDevice->ResetPhyOnInit = TRUE; pDevice->DelayPciGrant = TRUE; pDevice->UseTaggedStatus = FALSE; pDevice->OneDmaAtOnce = BAD_DEFAULT_VALUE; pDevice->DmaMbufLowMark = T3_DEF_DMA_MBUF_LOW_WMARK_JUMBO; pDevice->RxMacMbufLowMark = T3_DEF_RX_MAC_MBUF_LOW_WMARK_JUMBO; pDevice->MbufHighMark = T3_DEF_MBUF_HIGH_WMARK_JUMBO; pDevice->RequestedMediaType = LM_REQUESTED_MEDIA_TYPE_AUTO; pDevice->TaskOffloadCap = LM_TASK_OFFLOAD_NONE; pDevice->FlowControlCap = LM_FLOW_CONTROL_AUTO_PAUSE; pDevice->EnableTbi = FALSE;#if INCLUDE_TBI_SUPPORT pDevice->PollTbiLink = BAD_DEFAULT_VALUE;#endif switch (T3_ASIC_REV(pDevice->ChipRevId)) { case T3_ASIC_REV_5704: pDevice->MbufBase = T3_NIC_MBUF_POOL_ADDR; pDevice->MbufSize = T3_NIC_MBUF_POOL_SIZE64; break; default: pDevice->MbufBase = T3_NIC_MBUF_POOL_ADDR; pDevice->MbufSize = T3_NIC_MBUF_POOL_SIZE96; break; } pDevice->LinkStatus = LM_STATUS_LINK_DOWN; pDevice->QueueRxPackets = TRUE; pDevice->EnableWireSpeed = TRUE;#if T3_JUMBO_RCV_RCB_ENTRY_COUNT pDevice->RxJumboDescCnt = DEFAULT_JUMBO_RCV_DESC_COUNT;#endif /* T3_JUMBO_RCV_RCB_ENTRY_COUNT */ /* Make this is a known adapter. */ pAdapterInfo = LM_GetAdapterInfoBySsid(pDevice->SubsystemVendorId, pDevice->SubsystemId); pDevice->BondId = REG_RD(pDevice, Grc.MiscCfg) & GRC_MISC_BD_ID_MASK; if (pDevice->BondId != GRC_MISC_BD_ID_5700 && pDevice->BondId != GRC_MISC_BD_ID_5701 && pDevice->BondId != GRC_MISC_BD_ID_5702FE && pDevice->BondId != GRC_MISC_BD_ID_5703 && pDevice->BondId != GRC_MISC_BD_ID_5703S && pDevice->BondId != GRC_MISC_BD_ID_5704 && pDevice->BondId != GRC_MISC_BD_ID_5704CIOBE) { return LM_STATUS_UNKNOWN_ADAPTER; } pDevice->SplitModeEnable = SPLIT_MODE_DISABLE; if ((pDevice->ChipRevId == T3_CHIP_ID_5704_A0) && (pDevice->BondId == GRC_MISC_BD_ID_5704CIOBE)) { pDevice->SplitModeEnable = SPLIT_MODE_ENABLE; pDevice->SplitModeMaxReq = SPLIT_MODE_5704_MAX_REQ; } /* Get Eeprom info. */ Value32 = MEM_RD_OFFSET(pDevice, T3_NIC_DATA_SIG_ADDR); if (Value32 == T3_NIC_DATA_SIG) { EeSigFound = TRUE; Value32 = MEM_RD_OFFSET(pDevice, T3_NIC_DATA_NIC_CFG_ADDR); /* Determine PHY type. */ switch (Value32 & T3_NIC_CFG_PHY_TYPE_MASK) { case T3_NIC_CFG_PHY_TYPE_COPPER: EePhyTypeSerdes = FALSE; break; case T3_NIC_CFG_PHY_TYPE_FIBER: EePhyTypeSerdes = TRUE; break; default: EePhyTypeSerdes = FALSE; break; } /* Determine PHY led mode. */ if(T3_ASIC_REV(pDevice->ChipRevId) == T3_ASIC_REV_5700 || T3_ASIC_REV(pDevice->ChipRevId) == T3_ASIC_REV_5701) { switch(Value32 & T3_NIC_CFG_LED_MODE_MASK) { case T3_NIC_CFG_LED_MODE_TRIPLE_SPEED: EePhyLedMode = LED_MODE_THREE_LINK; break; case T3_NIC_CFG_LED_MODE_LINK_SPEED: EePhyLedMode = LED_MODE_LINK10; break; default: EePhyLedMode = LED_MODE_AUTO; break; } } else { switch(Value32 & T3_NIC_CFG_LED_MODE_MASK) { case T3_NIC_CFG_LED_MODE_OPEN_DRAIN: EePhyLedMode = LED_MODE_OPEN_DRAIN; break; case T3_NIC_CFG_LED_MODE_OUTPUT: EePhyLedMode = LED_MODE_OUTPUT; break; default: EePhyLedMode = LED_MODE_AUTO; break; } } if(pDevice->ChipRevId == T3_CHIP_ID_5703_A1 || pDevice->ChipRevId == T3_CHIP_ID_5703_A2) { /* Enable EEPROM write protection. */ if(Value32 & T3_NIC_EEPROM_WP) { pDevice->EepromWp = TRUE; } } /* Get the PHY Id. */ Value32 = MEM_RD_OFFSET(pDevice, T3_NIC_DATA_PHY_ID_ADDR); if (Value32) { EePhyId = (((Value32 & T3_NIC_PHY_ID1_MASK) >> 16) & PHY_ID1_OUI_MASK) << 10; Value32 = Value32 & T3_NIC_PHY_ID2_MASK; EePhyId |= ((Value32 & PHY_ID2_OUI_MASK) << 16) | (Value32 & PHY_ID2_MODEL_MASK) | (Value32 & PHY_ID2_REV_MASK); } else { EePhyId = 0; } } else { EeSigFound = FALSE; } /* Set the PHY address. */ pDevice->PhyAddr = PHY_DEVICE_ID; /* Disable auto polling. */ pDevice->MiMode = 0xc0000; REG_WR(pDevice, MacCtrl.MiMode, pDevice->MiMode); MM_Wait(40); /* Get the PHY id. */ LM_ReadPhy(pDevice, PHY_ID1_REG, &Value32); pDevice->PhyId = (Value32 & PHY_ID1_OUI_MASK) << 10; LM_ReadPhy(pDevice, PHY_ID2_REG, &Value32); pDevice->PhyId |= ((Value32 & PHY_ID2_OUI_MASK) << 16) | (Value32 & PHY_ID2_MODEL_MASK) | (Value32 & PHY_ID2_REV_MASK); /* Set the EnableTbi flag to false if we have a copper PHY. */ switch(pDevice->PhyId & PHY_ID_MASK) { case PHY_BCM5400_PHY_ID: pDevice->EnableTbi = FALSE; break; case PHY_BCM5401_PHY_ID: pDevice->EnableTbi = FALSE; break; case PHY_BCM5411_PHY_ID: pDevice->EnableTbi = FALSE; break; case PHY_BCM5701_PHY_ID: pDevice->EnableTbi = FALSE; break; case PHY_BCM5703_PHY_ID: pDevice->EnableTbi = FALSE; break; case PHY_BCM5704_PHY_ID: pDevice->EnableTbi = FALSE; break; case PHY_BCM8002_PHY_ID: pDevice->EnableTbi = TRUE; break; default: if (pAdapterInfo) { pDevice->PhyId = pAdapterInfo->PhyId; pDevice->EnableTbi = pAdapterInfo->Serdes; } else if (EeSigFound) { pDevice->PhyId = EePhyId; pDevice->EnableTbi = EePhyTypeSerdes; } break; } /* Bail out if we don't know the copper PHY id. */ if(UNKNOWN_PHY_ID(pDevice->PhyId) && !pDevice->EnableTbi) { return LM_STATUS_FAILURE; } if(T3_ASIC_REV(pDevice->ChipRevId) == T3_ASIC_REV_5703) { if((pDevice->SavedCacheLineReg & 0xff00) < 0x4000) { pDevice->SavedCacheLineReg &= 0xffff00ff; pDevice->SavedCacheLineReg |= 0x4000; } } /* Change driver parameters. */ Status = MM_GetConfig(pDevice); if(Status != LM_STATUS_SUCCESS) { return Status; }#if INCLUDE_5701_AX_FIX if (pDevice->ChipRevId == T3_CHIP_ID_5701_A0 || pDevice->ChipRevId == T3_CHIP_ID_5701_B0) { pDevice->ResetPhyOnInit = TRUE; }#endif /* Save the current phy link status. */ if(!pDevice->EnableTbi) { LM_ReadPhy(pDevice, PHY_STATUS_REG, &Value32); LM_ReadPhy(pDevice, PHY_STATUS_REG, &Value32); /* If we don't have link reset the PHY. */ if(!(Value32 & PHY_STATUS_LINK_PASS) || pDevice->ResetPhyOnInit) { LM_WritePhy(pDevice, PHY_CTRL_REG, PHY_CTRL_PHY_RESET); for(j = 0; j < 100; j++) { MM_Wait(10); LM_ReadPhy(pDevice, PHY_CTRL_REG, &Value32); if(Value32 && !(Value32 & PHY_CTRL_PHY_RESET)) { MM_Wait(40); break; } }#if INCLUDE_5701_AX_FIX /* 5701_AX_BX bug: only advertises 10mb speed. */ if(pDevice->ChipRevId == T3_CHIP_ID_5701_A0 || pDevice->ChipRevId == T3_CHIP_ID_5701_B0) { Value32 = PHY_AN_AD_PROTOCOL_802_3_CSMA_CD | PHY_AN_AD_10BASET_HALF | PHY_AN_AD_10BASET_FULL | PHY_AN_AD_100BASETX_FULL | PHY_AN_AD_100BASETX_HALF; Value32 |= GetPhyAdFlowCntrlSettings(pDevice); LM_WritePhy(pDevice, PHY_AN_AD_REG, Value32); pDevice->advertising = Value32; Value32 = BCM540X_AN_AD_1000BASET_HALF | BCM540X_AN_AD_1000BASET_FULL | BCM540X_CONFIG_AS_MASTER | BCM540X_ENABLE_CONFIG_AS_MASTER; LM_WritePhy(pDevice, BCM540X_1000BASET_CTRL_REG, Value32); pDevice->advertising1000 = Value32; LM_WritePhy(pDevice, PHY_CTRL_REG, PHY_CTRL_AUTO_NEG_ENABLE | PHY_CTRL_RESTART_AUTO_NEG); }#endif if(T3_ASIC_REV(pDevice->ChipRevId) == T3_ASIC_REV_5703) { LM_WritePhy(pDevice, 0x18, 0x0c00); LM_WritePhy(pDevice, 0x17, 0x201f); LM_WritePhy(pDevice, 0x15, 0x2aaa); } if(pDevice->ChipRevId == T3_CHIP_ID_5704_A0) { LM_WritePhy(pDevice, 0x1c, 0x8d68); LM_WritePhy(pDevice, 0x1c, 0x8d68); } /* Enable Ethernet@WireSpeed. */ if(pDevice->EnableWireSpeed) { LM_WritePhy(pDevice, 0x18, 0x7007); LM_ReadPhy(pDevice, 0x18, &Value32); LM_WritePhy(pDevice, 0x18, Value32 | BIT_15 | BIT_4); } } } /* Turn off tap power management. */ if((pDevice->PhyId & PHY_ID_MASK) == PHY_BCM5401_PHY_ID) { LM_WritePhy(pDevice, BCM5401_AUX_CTRL, 0x0c20); LM_WritePhy(pDevice, BCM540X_DSP_ADDRESS_REG, 0x0012); LM_WritePhy(pDevice, BCM540X_DSP_RW_PORT, 0x1804); LM_WritePhy(pDevice, BCM540X_DSP_ADDRESS_REG, 0x0013); LM_WritePhy(pDevice, BCM540X_DSP_RW_PORT, 0x1204); LM_WritePhy(pDevice, BCM540X_DSP_ADDRESS_REG, 0x8006); LM_WritePhy(pDevice, BCM540X_DSP_RW_PORT, 0x0132); LM_WritePhy(pDevice, BCM540X_DSP_ADDRESS_REG, 0x8006); LM_WritePhy(pDevice, BCM540X_DSP_RW_PORT, 0x0232); LM_WritePhy(pDevice, BCM540X_DSP_ADDRESS_REG, 0x201f); LM_WritePhy(pDevice, BCM540X_DSP_RW_PORT, 0x0a20); MM_Wait(40); }#if INCLUDE_TBI_SUPPORT pDevice->IgnoreTbiLinkChange = FALSE; if(pDevice->EnableTbi) { pDevice->WakeUpModeCap = LM_WAKE_UP_MODE_NONE; pDevice->PhyIntMode = T3_PHY_INT_MODE_LINK_READY; if ((pDevice->PollTbiLink == BAD_DEFAULT_VALUE) || pDevice->DisableAutoNeg) { pDevice->PollTbiLink = FALSE; } } else { pDevice->PollTbiLink = FALSE; }#endif /* INCLUDE_TBI_SUPPORT */ /* UseTaggedStatus is only valid for 5701 and later. */ if (T3_ASIC_REV(pDevice->ChipRevId) == T3_ASIC_REV_5700) { pDevice->UseTaggedStatus = FALSE; pDevice->CoalesceMode = 0; } else { pDevice->CoalesceMode = HOST_COALESCE_CLEAR_TICKS_ON_RX_BD_EVENT |
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -