📄 tigon3.c
字号:
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 | HOST_COALESCE_CLEAR_TICKS_ON_TX_BD_EVENT; } /* Set the status block size. */ if(T3_CHIP_REV(pDevice->ChipRevId) != T3_CHIP_REV_5700_AX && T3_CHIP_REV(pDevice->ChipRevId) != T3_CHIP_REV_5700_BX) { pDevice->CoalesceMode |= HOST_COALESCE_32_BYTE_STATUS_MODE; } /* Check the DURING_INT coalescing ticks parameters. */ if(pDevice->UseTaggedStatus) { if(pDevice->RxCoalescingTicksDuringInt == BAD_DEFAULT_VALUE) { pDevice->RxCoalescingTicksDuringInt = DEFAULT_RX_COALESCING_TICKS_DURING_INT; } if(pDevice->TxCoalescingTicksDuringInt == BAD_DEFAULT_VALUE) { pDevice->TxCoalescingTicksDuringInt = DEFAULT_TX_COALESCING_TICKS_DURING_INT; } if(pDevice->RxMaxCoalescedFramesDuringInt == BAD_DEFAULT_VALUE) { pDevice->RxMaxCoalescedFramesDuringInt = DEFAULT_RX_MAX_COALESCED_FRAMES_DURING_INT; } if(pDevice->TxMaxCoalescedFramesDuringInt == BAD_DEFAULT_VALUE) { pDevice->TxMaxCoalescedFramesDuringInt = DEFAULT_TX_MAX_COALESCED_FRAMES_DURING_INT; } } else { if(pDevice->RxCoalescingTicksDuringInt == BAD_DEFAULT_VALUE) { pDevice->RxCoalescingTicksDuringInt = 0; } if(pDevice->TxCoalescingTicksDuringInt == BAD_DEFAULT_VALUE) { pDevice->TxCoalescingTicksDuringInt = 0; } if(pDevice->RxMaxCoalescedFramesDuringInt == BAD_DEFAULT_VALUE) { pDevice->RxMaxCoalescedFramesDuringInt = 0; } if(pDevice->TxMaxCoalescedFramesDuringInt == BAD_DEFAULT_VALUE) { pDevice->TxMaxCoalescedFramesDuringInt = 0; } }#if T3_JUMBO_RCV_RCB_ENTRY_COUNT if(pDevice->RxMtu <= (MAX_STD_RCV_BUFFER_SIZE - 8 /* CRC */)) { pDevice->RxJumboDescCnt = 0; if(pDevice->RxMtu <= MAX_ETHERNET_PACKET_SIZE_NO_CRC) { pDevice->RxMtu = MAX_ETHERNET_PACKET_SIZE_NO_CRC; } } else { pDevice->RxJumboBufferSize = (pDevice->RxMtu + 8 /* CRC + VLAN */ + COMMON_CACHE_LINE_SIZE-1) & ~COMMON_CACHE_LINE_MASK; if(pDevice->RxJumboBufferSize > MAX_JUMBO_RCV_BUFFER_SIZE) { pDevice->RxJumboBufferSize = DEFAULT_JUMBO_RCV_BUFFER_SIZE; pDevice->RxMtu = pDevice->RxJumboBufferSize - 8 /* CRC + VLAN */; } pDevice->TxMtu = pDevice->RxMtu; }#else pDevice->RxMtu = MAX_ETHERNET_PACKET_SIZE_NO_CRC;#endif /* T3_JUMBO_RCV_RCB_ENTRY_COUNT */ pDevice->RxPacketDescCnt = #if T3_JUMBO_RCV_RCB_ENTRY_COUNT pDevice->RxJumboDescCnt +#endif /* T3_JUMBO_RCV_RCB_ENTRY_COUNT */ pDevice->RxStdDescCnt; if(pDevice->TxMtu < MAX_ETHERNET_PACKET_SIZE_NO_CRC) { pDevice->TxMtu = MAX_ETHERNET_PACKET_SIZE_NO_CRC; } if(pDevice->TxMtu > MAX_JUMBO_TX_BUFFER_SIZE) { pDevice->TxMtu = MAX_JUMBO_TX_BUFFER_SIZE; } /* Configure the proper ways to get link change interrupt. */ if(pDevice->PhyIntMode == T3_PHY_INT_MODE_AUTO) { if(T3_ASIC_REV(pDevice->ChipRevId) == T3_ASIC_REV_5700) { pDevice->PhyIntMode = T3_PHY_INT_MODE_MI_INTERRUPT; } else { pDevice->PhyIntMode = T3_PHY_INT_MODE_LINK_READY; } } else if(pDevice->PhyIntMode == T3_PHY_INT_MODE_AUTO_POLLING) { /* Auto-polling does not work on 5700_AX and 5700_BX. */ if(T3_ASIC_REV(pDevice->ChipRevId) == T3_ASIC_REV_5700) { pDevice->PhyIntMode = T3_PHY_INT_MODE_MI_INTERRUPT; } } /* Determine the method to get link change status. */ if(pDevice->LinkChngMode == T3_LINK_CHNG_MODE_AUTO) { /* The link status bit in the status block does not work on 5700_AX */ /* and 5700_BX chips. */ if(T3_ASIC_REV(pDevice->ChipRevId) == T3_ASIC_REV_5700) { pDevice->LinkChngMode = T3_LINK_CHNG_MODE_USE_STATUS_REG; } else { pDevice->LinkChngMode = T3_LINK_CHNG_MODE_USE_STATUS_BLOCK; } } if(pDevice->PhyIntMode == T3_PHY_INT_MODE_MI_INTERRUPT || T3_ASIC_REV(pDevice->ChipRevId) == T3_ASIC_REV_5700) { pDevice->LinkChngMode = T3_LINK_CHNG_MODE_USE_STATUS_REG; } /* Configure PHY led mode. */ if(pDevice->LedMode == LED_MODE_AUTO) { if(T3_ASIC_REV(pDevice->ChipRevId) == T3_ASIC_REV_5700 || T3_ASIC_REV(pDevice->ChipRevId) == T3_ASIC_REV_5701) { if(pDevice->SubsystemVendorId == T3_SVID_DELL) { pDevice->LedMode = LED_MODE_LINK10; } else { pDevice->LedMode = LED_MODE_THREE_LINK; if(EeSigFound && EePhyLedMode != LED_MODE_AUTO) { pDevice->LedMode = EePhyLedMode; } } /* bug? 5701 in LINK10 mode does not seem to work when */ /* PhyIntMode is LINK_READY. */ if(T3_ASIC_REV(pDevice->ChipRevId) != T3_ASIC_REV_5700 &&#if INCLUDE_TBI_SUPPORT pDevice->EnableTbi == FALSE &&#endif pDevice->LedMode == LED_MODE_LINK10) { pDevice->PhyIntMode = T3_PHY_INT_MODE_MI_INTERRUPT; pDevice->LinkChngMode = T3_LINK_CHNG_MODE_USE_STATUS_REG; } if(pDevice->EnableTbi) { pDevice->LedMode = LED_MODE_THREE_LINK; } } else { if(EeSigFound && EePhyLedMode != LED_MODE_AUTO) { pDevice->LedMode = EePhyLedMode; } else { pDevice->LedMode = LED_MODE_OPEN_DRAIN; } } } /* Enable OneDmaAtOnce. */ if(pDevice->OneDmaAtOnce == BAD_DEFAULT_VALUE) { pDevice->OneDmaAtOnce = FALSE; } if (T3_ASIC_REV(pDevice->ChipRevId) == T3_ASIC_REV_5700 || pDevice->ChipRevId == T3_CHIP_ID_5701_A0 || pDevice->ChipRevId == T3_CHIP_ID_5701_B0 || pDevice->ChipRevId == T3_CHIP_ID_5701_B2) { pDevice->WolSpeed = WOL_SPEED_10MB; } else { pDevice->WolSpeed = WOL_SPEED_100MB; } /* Offloadings. */ pDevice->TaskToOffload = LM_TASK_OFFLOAD_NONE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -