亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ixgbe_phy.c

?? linux 內核源代碼
?? C
字號:
/*******************************************************************************  Intel 10 Gigabit PCI Express Linux driver  Copyright(c) 1999 - 2007 Intel Corporation.  This program is free software; you can redistribute it and/or modify it  under the terms and conditions of the GNU General Public License,  version 2, as published by the Free Software Foundation.  This program is distributed in the hope it will be useful, but WITHOUT  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for  more details.  You should have received a copy of the GNU General Public License along with  this program; if not, write to the Free Software Foundation, Inc.,  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.  The full GNU General Public License is included in this distribution in  the file called "COPYING".  Contact Information:  Linux NICS <linux.nics@intel.com>  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497*******************************************************************************/#include <linux/pci.h>#include <linux/delay.h>#include <linux/sched.h>#include "ixgbe_common.h"#include "ixgbe_phy.h"static enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id);static s32 ixgbe_get_phy_id(struct ixgbe_hw *hw);static bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr);static s32 ixgbe_write_phy_reg(struct ixgbe_hw *hw, u32 reg_addr,			       u32 device_type, u16 phy_data);/** *  ixgbe_identify_phy - Get physical layer module *  @hw: pointer to hardware structure * *  Determines the physical layer module found on the current adapter. **/s32 ixgbe_identify_phy(struct ixgbe_hw *hw){	s32 status = IXGBE_ERR_PHY_ADDR_INVALID;	u32 phy_addr;	for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) {		if (ixgbe_validate_phy_addr(hw, phy_addr)) {			hw->phy.addr = phy_addr;			ixgbe_get_phy_id(hw);			hw->phy.type = ixgbe_get_phy_type_from_id(hw->phy.id);			status = 0;			break;		}	}	return status;}/** *  ixgbe_validate_phy_addr - Determines phy address is valid *  @hw: pointer to hardware structure * **/static bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr){	u16 phy_id = 0;	bool valid = false;	hw->phy.addr = phy_addr;	ixgbe_read_phy_reg(hw,			   IXGBE_MDIO_PHY_ID_HIGH,			   IXGBE_MDIO_PMA_PMD_DEV_TYPE,			   &phy_id);	if (phy_id != 0xFFFF && phy_id != 0x0)		valid = true;	return valid;}/** *  ixgbe_get_phy_id - Get the phy type *  @hw: pointer to hardware structure * **/static s32 ixgbe_get_phy_id(struct ixgbe_hw *hw){	u32 status;	u16 phy_id_high = 0;	u16 phy_id_low = 0;	status = ixgbe_read_phy_reg(hw,				   IXGBE_MDIO_PHY_ID_HIGH,				   IXGBE_MDIO_PMA_PMD_DEV_TYPE,				   &phy_id_high);	if (status == 0) {		hw->phy.id = (u32)(phy_id_high << 16);		status = ixgbe_read_phy_reg(hw,					   IXGBE_MDIO_PHY_ID_LOW,					   IXGBE_MDIO_PMA_PMD_DEV_TYPE,					   &phy_id_low);		hw->phy.id |= (u32)(phy_id_low & IXGBE_PHY_REVISION_MASK);		hw->phy.revision = (u32)(phy_id_low & ~IXGBE_PHY_REVISION_MASK);	}	return status;}/** *  ixgbe_get_phy_type_from_id - Get the phy type *  @hw: pointer to hardware structure * **/static enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id){	enum ixgbe_phy_type phy_type;	switch (phy_id) {	case TN1010_PHY_ID:		phy_type = ixgbe_phy_tn;		break;	case QT2022_PHY_ID:		phy_type = ixgbe_phy_qt;		break;	default:		phy_type = ixgbe_phy_unknown;		break;	}	return phy_type;}/** *  ixgbe_reset_phy - Performs a PHY reset *  @hw: pointer to hardware structure **/s32 ixgbe_reset_phy(struct ixgbe_hw *hw){	/*	 * Perform soft PHY reset to the PHY_XS.	 * This will cause a soft reset to the PHY	 */	return ixgbe_write_phy_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,				   IXGBE_MDIO_PHY_XS_DEV_TYPE,				   IXGBE_MDIO_PHY_XS_RESET);}/** *  ixgbe_read_phy_reg - Reads a value from a specified PHY register *  @hw: pointer to hardware structure *  @reg_addr: 32 bit address of PHY register to read *  @phy_data: Pointer to read data from PHY register **/s32 ixgbe_read_phy_reg(struct ixgbe_hw *hw, u32 reg_addr,		       u32 device_type, u16 *phy_data){	u32 command;	u32 i;	u32 timeout = 10;	u32 data;	s32 status = 0;	u16 gssr;	if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)		gssr = IXGBE_GSSR_PHY1_SM;	else		gssr = IXGBE_GSSR_PHY0_SM;	if (ixgbe_acquire_swfw_sync(hw, gssr) != 0)		status = IXGBE_ERR_SWFW_SYNC;	if (status == 0) {		/* Setup and write the address cycle command */		command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT)  |			   (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |			   (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |			   (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND));		IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);		/*		 * Check every 10 usec to see if the address cycle completed.		 * The MDI Command bit will clear when the operation is		 * complete		 */		for (i = 0; i < timeout; i++) {			udelay(10);			command = IXGBE_READ_REG(hw, IXGBE_MSCA);			if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)				break;		}		if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {			hw_dbg(hw, "PHY address command did not complete.\n");			status = IXGBE_ERR_PHY;		}		if (status == 0) {			/*			 * Address cycle complete, setup and write the read			 * command			 */			command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT)  |				   (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |				   (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |				   (IXGBE_MSCA_READ | IXGBE_MSCA_MDI_COMMAND));			IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);			/*			 * Check every 10 usec to see if the address cycle			 * completed. The MDI Command bit will clear when the			 * operation is complete			 */			for (i = 0; i < timeout; i++) {				udelay(10);				command = IXGBE_READ_REG(hw, IXGBE_MSCA);				if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)					break;			}			if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {				hw_dbg(hw,				       "PHY read command didn't complete\n");				status = IXGBE_ERR_PHY;			} else {				/*				 * Read operation is complete.  Get the data				 * from MSRWD				 */				data = IXGBE_READ_REG(hw, IXGBE_MSRWD);				data >>= IXGBE_MSRWD_READ_DATA_SHIFT;				*phy_data = (u16)(data);			}		}		ixgbe_release_swfw_sync(hw, gssr);	}	return status;}/** *  ixgbe_write_phy_reg - Writes a value to specified PHY register *  @hw: pointer to hardware structure *  @reg_addr: 32 bit PHY register to write *  @device_type: 5 bit device type *  @phy_data: Data to write to the PHY register **/static s32 ixgbe_write_phy_reg(struct ixgbe_hw *hw, u32 reg_addr,			       u32 device_type, u16 phy_data){	u32 command;	u32 i;	u32 timeout = 10;	s32 status = 0;	u16 gssr;	if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)		gssr = IXGBE_GSSR_PHY1_SM;	else		gssr = IXGBE_GSSR_PHY0_SM;	if (ixgbe_acquire_swfw_sync(hw, gssr) != 0)		status = IXGBE_ERR_SWFW_SYNC;	if (status == 0) {		/* Put the data in the MDI single read and write data register*/		IXGBE_WRITE_REG(hw, IXGBE_MSRWD, (u32)phy_data);		/* Setup and write the address cycle command */		command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT)  |			   (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |			   (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |			   (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND));		IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);		/*		 * Check every 10 usec to see if the address cycle completed.		 * The MDI Command bit will clear when the operation is		 * complete		 */		for (i = 0; i < timeout; i++) {			udelay(10);			command = IXGBE_READ_REG(hw, IXGBE_MSCA);			if ((command & IXGBE_MSCA_MDI_COMMAND) == 0) {				hw_dbg(hw, "PHY address cmd didn't complete\n");				break;			}		}		if ((command & IXGBE_MSCA_MDI_COMMAND) != 0)			status = IXGBE_ERR_PHY;		if (status == 0) {			/*			 * Address cycle complete, setup and write the write			 * command			 */			command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT)  |				   (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |				   (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |				   (IXGBE_MSCA_WRITE | IXGBE_MSCA_MDI_COMMAND));			IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);			/*			 * Check every 10 usec to see if the address cycle			 * completed. The MDI Command bit will clear when the			 * operation is complete			 */			for (i = 0; i < timeout; i++) {				udelay(10);				command = IXGBE_READ_REG(hw, IXGBE_MSCA);				if ((command & IXGBE_MSCA_MDI_COMMAND) == 0) {					hw_dbg(hw, "PHY write command did not "						  "complete.\n");					break;				}			}			if ((command & IXGBE_MSCA_MDI_COMMAND) != 0)				status = IXGBE_ERR_PHY;		}		ixgbe_release_swfw_sync(hw, gssr);	}	return status;}/** *  ixgbe_setup_tnx_phy_link - Set and restart autoneg *  @hw: pointer to hardware structure * *  Restart autonegotiation and PHY and waits for completion. **/s32 ixgbe_setup_tnx_phy_link(struct ixgbe_hw *hw){	s32 status = IXGBE_NOT_IMPLEMENTED;	u32 time_out;	u32 max_time_out = 10;	u16 autoneg_speed_selection_register = 0x10;	u16 autoneg_restart_mask = 0x0200;	u16 autoneg_complete_mask = 0x0020;	u16 autoneg_reg = 0;	/*	 * Set advertisement settings in PHY based on autoneg_advertised	 * settings. If autoneg_advertised = 0, then advertise default values	 * txn devices cannot be "forced" to a autoneg 10G and fail.  But can	 * for a 1G.	 */	ixgbe_read_phy_reg(hw,		  autoneg_speed_selection_register,		  IXGBE_MDIO_AUTO_NEG_DEV_TYPE,		  &autoneg_reg);	if (hw->phy.autoneg_advertised == IXGBE_LINK_SPEED_1GB_FULL)		autoneg_reg &= 0xEFFF; /* 0 in bit 12 is 1G operation */	else		autoneg_reg |= 0x1000; /* 1 in bit 12 is 10G/1G operation */	ixgbe_write_phy_reg(hw,		  autoneg_speed_selection_register,		  IXGBE_MDIO_AUTO_NEG_DEV_TYPE,		  autoneg_reg);	/* Restart PHY autonegotiation and wait for completion */	ixgbe_read_phy_reg(hw,		  IXGBE_MDIO_AUTO_NEG_CONTROL,		  IXGBE_MDIO_AUTO_NEG_DEV_TYPE,		  &autoneg_reg);	autoneg_reg |= autoneg_restart_mask;	ixgbe_write_phy_reg(hw,		  IXGBE_MDIO_AUTO_NEG_CONTROL,		  IXGBE_MDIO_AUTO_NEG_DEV_TYPE,		  autoneg_reg);	/* Wait for autonegotiation to finish */	for (time_out = 0; time_out < max_time_out; time_out++) {		udelay(10);		/* Restart PHY autonegotiation and wait for completion */		status = ixgbe_read_phy_reg(hw,					    IXGBE_MDIO_AUTO_NEG_STATUS,					    IXGBE_MDIO_AUTO_NEG_DEV_TYPE,					    &autoneg_reg);		autoneg_reg &= autoneg_complete_mask;		if (autoneg_reg == autoneg_complete_mask) {			status = 0;			break;		}	}	if (time_out == max_time_out)		status = IXGBE_ERR_LINK_SETUP;	return status;}/** *  ixgbe_check_tnx_phy_link - Determine link and speed status *  @hw: pointer to hardware structure * *  Reads the VS1 register to determine if link is up and the current speed for *  the PHY. **/s32 ixgbe_check_tnx_phy_link(struct ixgbe_hw *hw, u32 *speed,			     bool *link_up){	s32 status = 0;	u32 time_out;	u32 max_time_out = 10;	u16 phy_link = 0;	u16 phy_speed = 0;	u16 phy_data = 0;	/* Initialize speed and link to default case */	*link_up = false;	*speed = IXGBE_LINK_SPEED_10GB_FULL;	/*	 * Check current speed and link status of the PHY register.	 * This is a vendor specific register and may have to	 * be changed for other copper PHYs.	 */	for (time_out = 0; time_out < max_time_out; time_out++) {		udelay(10);		if (phy_link == IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS) {			*link_up = true;			if (phy_speed ==			    IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS)				*speed = IXGBE_LINK_SPEED_1GB_FULL;			break;		} else {			status = ixgbe_read_phy_reg(hw,				     IXGBE_MDIO_VENDOR_SPECIFIC_1_STATUS,				     IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,				     &phy_data);			phy_link = phy_data &				IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS;			phy_speed = phy_data &				IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS;		}	}	return status;}/** *  ixgbe_setup_tnx_phy_link_speed - Sets the auto advertised capabilities *  @hw: pointer to hardware structure *  @speed: new link speed *  @autoneg: true if autonegotiation enabled **/s32 ixgbe_setup_tnx_phy_link_speed(struct ixgbe_hw *hw, u32 speed,				   bool autoneg,				   bool autoneg_wait_to_complete){	/*	 * Clear autoneg_advertised and set new values based on input link	 * speed.	 */	hw->phy.autoneg_advertised = 0;	if (speed & IXGBE_LINK_SPEED_10GB_FULL)		hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL;	if (speed & IXGBE_LINK_SPEED_1GB_FULL)		hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL;	/* Setup link based on the new speed settings */	ixgbe_setup_tnx_phy_link(hw);	return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合视频在线| 国产精品一区二区你懂的| 久久se精品一区二区| 99久久99久久精品国产片果冻| 91精品国产aⅴ一区二区| 欧美国产精品久久| 久久99日本精品| 欧美日韩国产免费一区二区| 亚洲国产成人午夜在线一区| 美女久久久精品| 7777精品伊人久久久大香线蕉的 | 午夜成人在线视频| 成人激情免费网站| 久久久av毛片精品| 久久精品理论片| 51午夜精品国产| 天天av天天翘天天综合网| 一本久久精品一区二区| 国产精品久久久久久久久免费樱桃| 美国十次了思思久久精品导航| 欧美在线观看一区| 中文字幕日韩精品一区| 国产成人亚洲综合a∨猫咪| 日韩欧美电影一二三| 日韩中文字幕av电影| 欧美日韩国产大片| 亚洲国产色一区| 欧美日韩国产综合草草| 一区二区三国产精华液| 91美女片黄在线观看91美女| 国产精品久久影院| eeuss影院一区二区三区| 国产精品美女久久久久久2018| 国产精品99久久久久| 久久久久久久久久久电影| 美国av一区二区| 久久色在线观看| 国产成人夜色高潮福利影视| 亚洲欧美日韩国产成人精品影院| 国产成人免费xxxxxxxx| 国产精品黄色在线观看| 91视频com| 午夜精品久久久久| 欧美成人在线直播| 国产精品99久久久久久久vr| 中文字幕一区二区三区不卡在线| 成人18视频在线播放| 亚洲伦理在线精品| 欧美日韩一级二级| 激情久久五月天| 中文字幕国产精品一区二区| 91麻豆文化传媒在线观看| 亚洲一区二区三区四区的| 欧美一卡在线观看| 国产成人在线免费观看| 一区二区欧美国产| 日韩欧美一区二区三区在线| 国产成a人亚洲| 一区二区三区国产| 日韩欧美一区电影| 91视频91自| 精品无人区卡一卡二卡三乱码免费卡 | 亚洲无线码一区二区三区| 欧美一区二区三区性视频| 国产一二精品视频| 亚洲精品国产第一综合99久久| 91精品国产91综合久久蜜臀| 风间由美中文字幕在线看视频国产欧美| 中文字幕一区二区三区乱码在线 | 中文字幕va一区二区三区| 欧美影视一区在线| 国内成人自拍视频| 亚洲伊人色欲综合网| 国产丝袜美腿一区二区三区| 在线观看亚洲a| 国产不卡视频在线观看| 日日夜夜一区二区| 国产精品福利一区| 欧美v亚洲v综合ⅴ国产v| 色av一区二区| 国产成人精品综合在线观看 | 一区二区三区日本| 久久久午夜精品| 欧美一级午夜免费电影| 91丨porny丨首页| 精品一区二区精品| 国产美女精品在线| 三级欧美韩日大片在线看| 国产精品毛片久久久久久久| 欧美一级在线视频| 欧美浪妇xxxx高跟鞋交| 成人免费看视频| 精品一二三四区| 日韩激情一二三区| 亚洲福中文字幕伊人影院| 中文字幕在线不卡一区二区三区| 337p粉嫩大胆噜噜噜噜噜91av| 欧美丰满一区二区免费视频| 色综合色综合色综合| 成人免费视频国产在线观看| 精品一区二区精品| 狂野欧美性猛交blacked| 日韩激情中文字幕| 午夜私人影院久久久久| 一区二区成人在线视频| 1区2区3区精品视频| 国产精品色眯眯| 国产亚洲欧美日韩在线一区| 日韩一级高清毛片| 欧美电视剧免费观看| 制服丝袜亚洲网站| 6080午夜不卡| 欧美一区二区三区日韩| 欧美一区二区在线看| 7777精品伊人久久久大香线蕉的 | 蜜臀av性久久久久av蜜臀妖精| 亚洲福利一二三区| 日韩av在线发布| 美女视频网站久久| 国产乱对白刺激视频不卡| 国产麻豆视频一区二区| 国产69精品久久久久777| 国产乱码字幕精品高清av| 国产一区二区免费看| 国产成人精品亚洲777人妖 | 制服.丝袜.亚洲.另类.中文| 欧美日韩一区精品| 欧美一区二视频| 精品国产乱码久久久久久牛牛| 欧美成人a在线| 国产日韩av一区二区| 国产精品伦一区二区三级视频| 亚洲欧美日韩国产综合| 亚洲va韩国va欧美va| 另类的小说在线视频另类成人小视频在线 | 成人不卡免费av| 色综合激情久久| 欧美日韩国产小视频| 日韩免费一区二区| 国产精品天天看| 亚洲一区二区三区四区不卡| 另类小说视频一区二区| 成人做爰69片免费看网站| 日本福利一区二区| 精品久久久网站| 136国产福利精品导航| 日韩国产欧美视频| 成人av片在线观看| 69堂成人精品免费视频| 欧美国产日韩一二三区| 亚洲成人动漫精品| 琪琪一区二区三区| 91欧美一区二区| 日韩欧美一区二区免费| 亚洲欧美另类小说视频| 久久99久久99| 91视视频在线观看入口直接观看www | 色妞www精品视频| 日韩亚洲欧美一区| ㊣最新国产の精品bt伙计久久| 丝袜亚洲精品中文字幕一区| 国产91丝袜在线播放0| 91福利资源站| 日本一区二区三区视频视频| 天天综合色天天综合色h| 成人国产精品免费观看| 日韩欧美成人激情| 亚洲综合视频在线| 白白色 亚洲乱淫| 欧美va亚洲va国产综合| 亚洲成人综合视频| 99国产精品久久久| 久久久久久久久久久黄色| 日韩国产欧美在线播放| 欧美午夜理伦三级在线观看| 中文字幕乱码一区二区免费| 九色综合国产一区二区三区| 欧美美女喷水视频| 亚洲在线观看免费视频| www.欧美精品一二区| 国产亚洲欧美色| 国产一区二区三区在线看麻豆| 6080日韩午夜伦伦午夜伦| 亚洲自拍偷拍九九九| 91色porny在线视频| 日韩一区在线免费观看| 国产成人免费视频一区| 国产三级久久久| 丰满岳乱妇一区二区三区| 久久久久久久久岛国免费| 国内久久精品视频| 亚洲精品一区二区三区香蕉| 久久激情五月激情| 精品国偷自产国产一区| 日韩av在线发布| 欧美成人a∨高清免费观看| 麻豆国产一区二区| 精品国产一区二区三区久久久蜜月 | 天堂在线亚洲视频| 欧美精品免费视频|