bnx2x_link.h 10.2 KB
Newer Older
Y
Yaniv Rosner 已提交
1
/* Copyright 2008-2010 Broadcom Corporation
Y
Yaniv Rosner 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
 *
 * Unless you and Broadcom execute a separate written software license
 * agreement governing use of this software, this software is licensed to you
 * under the terms of the GNU General Public License version 2, available
 * at http://www.gnu.org/licenses/old-licenses/gpl-2.0.html (the "GPL").
 *
 * Notwithstanding the above, under no circumstances may you combine this
 * software in any way with any other Broadcom software provided under a
 * license other than the GPL, without Broadcom's express prior written
 * consent.
 *
 * Written by Yaniv Rosner
 *
 */

#ifndef BNX2X_LINK_H
#define BNX2X_LINK_H



/***********************************************************/
/*                         Defines                         */
/***********************************************************/
#define DEFAULT_PHY_DEV_ADDR 3



29 30 31 32 33
#define BNX2X_FLOW_CTRL_AUTO		PORT_FEATURE_FLOW_CONTROL_AUTO
#define BNX2X_FLOW_CTRL_TX		PORT_FEATURE_FLOW_CONTROL_TX
#define BNX2X_FLOW_CTRL_RX		PORT_FEATURE_FLOW_CONTROL_RX
#define BNX2X_FLOW_CTRL_BOTH		PORT_FEATURE_FLOW_CONTROL_BOTH
#define BNX2X_FLOW_CTRL_NONE		PORT_FEATURE_FLOW_CONTROL_NONE
Y
Yaniv Rosner 已提交
34 35 36 37 38 39 40 41

#define SPEED_AUTO_NEG	    0
#define SPEED_12000		12000
#define SPEED_12500		12500
#define SPEED_13000		13000
#define SPEED_15000		15000
#define SPEED_16000		16000

E
Eilon Greenstein 已提交
42 43 44 45 46 47 48
#define SFP_EEPROM_VENDOR_NAME_ADDR		0x14
#define SFP_EEPROM_VENDOR_NAME_SIZE		16
#define SFP_EEPROM_VENDOR_OUI_ADDR		0x25
#define SFP_EEPROM_VENDOR_OUI_SIZE		3
#define SFP_EEPROM_PART_NO_ADDR 		0x28
#define SFP_EEPROM_PART_NO_SIZE		16
#define PWR_FLT_ERR_MSG_LEN			250
Y
Yaniv Rosner 已提交
49 50 51 52 53 54 55 56 57

#define XGXS_EXT_PHY_TYPE(ext_phy_config) \
		((ext_phy_config) & PORT_HW_CFG_XGXS_EXT_PHY_TYPE_MASK)
#define XGXS_EXT_PHY_ADDR(ext_phy_config) \
		(((ext_phy_config) & PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> \
		 PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT)
#define SERDES_EXT_PHY_TYPE(ext_phy_config) \
		((ext_phy_config) & PORT_HW_CFG_SERDES_EXT_PHY_TYPE_MASK)

Y
Yaniv Rosner 已提交
58 59 60 61
/* Single Media Direct board is the plain 577xx board with CX4/RJ45 jacks */
#define SINGLE_MEDIA_DIRECT(params)	(params->num_phys == 1)
/* Single Media board contains single external phy */
#define SINGLE_MEDIA(params)		(params->num_phys == 2)
Y
Yaniv Rosner 已提交
62 63 64
/***********************************************************/
/*                         Structs                         */
/***********************************************************/
Y
Yaniv Rosner 已提交
65 66 67 68 69
#define INT_PHY		0
#define EXT_PHY1	1

#define MAX_PHYS	2

Y
Yaniv Rosner 已提交
70 71 72 73
/* Same configuration is shared between the XGXS and the first external phy */
#define LINK_CONFIG_SIZE (MAX_PHYS - 1)
#define LINK_CONFIG_IDX(_phy_idx) ((_phy_idx == INT_PHY) ? \
					 0 : (_phy_idx - 1))
Y
Yaniv Rosner 已提交
74 75 76 77 78 79 80 81
/***********************************************************/
/*                      bnx2x_phy struct                     */
/*  Defines the required arguments and function per phy    */
/***********************************************************/
struct link_vars;
struct link_params;
struct bnx2x_phy;

Y
Yaniv Rosner 已提交
82 83 84 85 86 87 88 89 90 91 92 93 94
typedef u8 (*config_init_t)(struct bnx2x_phy *phy, struct link_params *params,
			    struct link_vars *vars);
typedef u8 (*read_status_t)(struct bnx2x_phy *phy, struct link_params *params,
			    struct link_vars *vars);
typedef void (*link_reset_t)(struct bnx2x_phy *phy,
			     struct link_params *params);
typedef void (*config_loopback_t)(struct bnx2x_phy *phy,
				  struct link_params *params);
typedef u8 (*format_fw_ver_t)(u32 raw, u8 *str, u16 *len);
typedef void (*hw_reset_t)(struct bnx2x_phy *phy, struct link_params *params);
typedef void (*set_link_led_t)(struct bnx2x_phy *phy,
			       struct link_params *params, u8 mode);

Y
Yaniv Rosner 已提交
95 96 97 98 99 100
struct bnx2x_phy {
	u32 type;

	/* Loaded during init */
	u8 addr;

Y
Yaniv Rosner 已提交
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
	u8 flags;
	/* Require HW lock */
#define FLAGS_HW_LOCK_REQUIRED		(1<<0)
	/* No Over-Current detection */
#define FLAGS_NOC			(1<<1)
	/* Fan failure detection required */
#define FLAGS_FAN_FAILURE_DET_REQ	(1<<2)
	/* Initialize first the XGXS and only then the phy itself */
#define FLAGS_INIT_XGXS_FIRST	(1<<3)

	u8 def_md_devad;
	u8 reserved;
	/* preemphasis values for the rx side */
	u16 rx_preemphasis[4];

	/* preemphasis values for the tx side */
	u16 tx_preemphasis[4];

	/* EMAC address for access MDIO */
Y
Yaniv Rosner 已提交
120
	u32 mdio_ctrl;
Y
Yaniv Rosner 已提交
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163

	u32 supported;

	u32 media_type;
#define	ETH_PHY_UNSPECIFIED 0x0
#define	ETH_PHY_SFP_FIBER   0x1
#define	ETH_PHY_XFP_FIBER   0x2
#define	ETH_PHY_DA_TWINAX   0x3
#define	ETH_PHY_BASE_T      0x4
#define	ETH_PHY_NOT_PRESENT 0xff

	/* The address in which version is located*/
	u32 ver_addr;

	u16 req_flow_ctrl;

	u16 req_line_speed;

	u32 speed_cap_mask;

	u16 req_duplex;
	u16 rsrv;
	/* Called per phy/port init, and it configures LASI, speed, autoneg,
	 duplex, flow control negotiation, etc. */
	config_init_t config_init;

	/* Called due to interrupt. It determines the link, speed */
	read_status_t read_status;

	/* Called when driver is unloading. Should reset the phy */
	link_reset_t link_reset;

	/* Set the loopback configuration for the phy */
	config_loopback_t config_loopback;

	/* Format the given raw number into str up to len */
	format_fw_ver_t format_fw_ver;

	/* Reset the phy (both ports) */
	hw_reset_t hw_reset;

	/* Set link led mode (on/off/oper)*/
	set_link_led_t set_link_led;
Y
Yaniv Rosner 已提交
164 165
};

Y
Yaniv Rosner 已提交
166 167 168 169 170 171 172 173 174 175
/* Inputs parameters to the CLC */
struct link_params {

	u8 port;

	/* Default / User Configuration */
	u8 loopback_mode;
#define LOOPBACK_NONE	0
#define LOOPBACK_EMAC	1
#define LOOPBACK_BMAC	2
Y
Yaniv Rosner 已提交
176
#define LOOPBACK_XGXS		3
Y
Yaniv Rosner 已提交
177
#define LOOPBACK_EXT_PHY	4
Y
Yaniv Rosner 已提交
178
#define LOOPBACK_EXT 	5
Y
Yaniv Rosner 已提交
179 180 181

	u16 req_duplex;
	u16 req_flow_ctrl;
Y
Yaniv Rosner 已提交
182 183
	u16 req_fc_auto_adv; /* Should be set to TX / BOTH when
	req_flow_ctrl is set to AUTO */
Y
Yaniv Rosner 已提交
184 185 186 187
	u16 req_line_speed; /* Also determine AutoNeg */

	/* Device parameters */
	u8 mac_addr[6];
Y
Yaniv Rosner 已提交
188

Y
Yaniv Rosner 已提交
189 190 191 192 193 194 195 196 197
	/* shmem parameters */
	u32 shmem_base;
	u32 speed_cap_mask;
	u32 switch_cfg;
#define SWITCH_CFG_1G		PORT_FEATURE_CON_SWITCH_1G_SWITCH
#define SWITCH_CFG_10G		PORT_FEATURE_CON_SWITCH_10G_SWITCH
#define SWITCH_CFG_AUTO_DETECT	PORT_FEATURE_CON_SWITCH_AUTO_DETECT

	u32 lane_config;
198

Y
Yaniv Rosner 已提交
199 200 201
	/* Phy register parameter */
	u32 chip_id;

E
Eilon Greenstein 已提交
202 203
	u32 feature_config_flags;
#define FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED (1<<0)
E
Eilon Greenstein 已提交
204
#define FEATURE_CONFIG_BC_SUPPORTS_OPT_MDL_VRFY	(1<<2)
Y
Yaniv Rosner 已提交
205 206 207 208 209
	/* Will be populated during common init */
	struct bnx2x_phy phy[MAX_PHYS];

	/* Will be populated during common init */
	u8 num_phys;
210

Y
Yaniv Rosner 已提交
211 212 213
	u8 rsrv;
	u16 hw_led_mode; /* part of the hw_config read from the shmem */

Y
Yaniv Rosner 已提交
214 215 216 217 218 219
	/* Device pointer passed to all callback functions */
	struct bnx2x *bp;
};

/* Output parameters */
struct link_vars {
220 221 222 223 224 225 226
	u8 phy_flags;

	u8 mac_type;
#define MAC_TYPE_NONE		0
#define MAC_TYPE_EMAC		1
#define MAC_TYPE_BMAC		2

Y
Yaniv Rosner 已提交
227 228
	u8 phy_link_up; /* internal phy link indication */
	u8 link_up;
229 230

	u16 line_speed;
Y
Yaniv Rosner 已提交
231
	u16 duplex;
232

Y
Yaniv Rosner 已提交
233
	u16 flow_ctrl;
234
	u16 ieee_fc;
Y
Yaniv Rosner 已提交
235 236 237 238 239

	u32 autoneg;
#define AUTO_NEG_DISABLED			0x0
#define AUTO_NEG_ENABLED			0x1
#define AUTO_NEG_COMPLETE			0x2
240
#define AUTO_NEG_PARALLEL_DETECTION_USED	0x3
Y
Yaniv Rosner 已提交
241 242 243 244 245 246 247 248 249 250 251 252

	/* The same definitions as the shmem parameter */
	u32 link_status;
};

/***********************************************************/
/*                         Functions                       */
/***********************************************************/

/* Initialize the phy */
u8 bnx2x_phy_init(struct link_params *input, struct link_vars *output);

E
Eilon Greenstein 已提交
253 254 255 256 257
/* Reset the link. Should be called when driver or interface goes down
   Before calling phy firmware upgrade, the reset_ext_phy should be set
   to 0 */
u8 bnx2x_link_reset(struct link_params *params, struct link_vars *vars,
		  u8 reset_ext_phy);
Y
Yaniv Rosner 已提交
258 259 260 261

/* bnx2x_link_update should be called upon link interrupt */
u8 bnx2x_link_update(struct link_params *input, struct link_vars *output);

Y
Yaniv Rosner 已提交
262
/* use the following phy functions to read/write from external_phy
Y
Yaniv Rosner 已提交
263 264 265
  In order to use it to read/write internal phy registers, use
  DEFAULT_PHY_DEV_ADDR as devad, and (_bank + (_addr & 0xf)) as
  the register */
Y
Yaniv Rosner 已提交
266 267
u8 bnx2x_phy_read(struct link_params *params, u8 phy_addr,
		  u8 devad, u16 reg, u16 *ret_val);
Y
Yaniv Rosner 已提交
268

Y
Yaniv Rosner 已提交
269 270
u8 bnx2x_phy_write(struct link_params *params, u8 phy_addr,
		   u8 devad, u16 reg, u16 val);
271

Y
Yaniv Rosner 已提交
272 273
u8 bnx2x_cl45_read(struct bnx2x *bp, struct bnx2x_phy *phy,
		   u8 devad, u16 reg, u16 *ret_val);
Y
Yaniv Rosner 已提交
274

Y
Yaniv Rosner 已提交
275 276
u8 bnx2x_cl45_write(struct bnx2x *bp, struct bnx2x_phy *phy,
		    u8 devad, u16 reg, u16 val);
Y
Yaniv Rosner 已提交
277
/* Reads the link_status from the shmem,
E
Eilon Greenstein 已提交
278
   and update the link vars accordingly */
Y
Yaniv Rosner 已提交
279 280 281 282 283 284 285 286
void bnx2x_link_status_update(struct link_params *input,
			    struct link_vars *output);
/* returns string representing the fw_version of the external phy */
u8 bnx2x_get_ext_phy_fw_version(struct link_params *params, u8 driver_loaded,
			      u8 *version, u16 len);

/* Set/Unset the led
   Basically, the CLC takes care of the led for the link, but in case one needs
E
Eilon Greenstein 已提交
287
   to set/unset the led unnaturally, set the "mode" to LED_MODE_OPER to
Y
Yaniv Rosner 已提交
288
   blink the led, and LED_MODE_OFF to set the led off.*/
Y
Yaniv Rosner 已提交
289
u8 bnx2x_set_led(struct link_params *params, u8 mode, u32 speed);
Y
Yaniv Rosner 已提交
290 291 292 293 294
#define LED_MODE_OFF	0
#define LED_MODE_OPER 	2

u8 bnx2x_override_led_value(struct bnx2x *bp, u8 port, u32 led_idx, u32 value);

E
Eilon Greenstein 已提交
295 296 297 298
/* bnx2x_handle_module_detect_int should be called upon module detection
   interrupt */
void bnx2x_handle_module_detect_int(struct link_params *params);

Y
Yaniv Rosner 已提交
299 300 301 302
/* Get the actual link status. In case it returns 0, link is up,
	otherwise link is down*/
u8 bnx2x_test_link(struct link_params *input, struct link_vars *vars);

Y
Yaniv Rosner 已提交
303 304
/* One-time initialization for external phy after power up */
u8 bnx2x_common_init_phy(struct bnx2x *bp, u32 shmem_base);
Y
Yaniv Rosner 已提交
305

306 307 308
/* Reset the external PHY using GPIO */
void bnx2x_ext_phy_hw_reset(struct bnx2x *bp, u8 port);

Y
Yaniv Rosner 已提交
309 310
/* Reset the external of SFX7101 */
void bnx2x_sfx7101_sp_sw_reset(struct bnx2x *bp, struct bnx2x_phy *phy);
E
Eilon Greenstein 已提交
311

Y
Yaniv Rosner 已提交
312 313
u8 bnx2x_read_sfp_module_eeprom(struct bnx2x_phy *phy,
				struct link_params *params, u16 addr,
E
Eilon Greenstein 已提交
314
			      u8 byte_cnt, u8 *o_buf);
315 316 317 318 319

void bnx2x_hw_reset_phy(struct link_params *params);

/* Checks if HW lock is required for this phy/board type */
u8 bnx2x_hw_lock_required(struct bnx2x *bp, u32 shmem_base);
Y
Yaniv Rosner 已提交
320 321 322 323
/* Returns the aggregative supported attributes of the phys on board */
u32 bnx2x_supported_attr(struct link_params *params, u8 phy_idx);
/* Probe the phys on board, and populate them in "params" */
u8 bnx2x_phy_probe(struct link_params *params);
324 325 326
/* Checks if fan failure detection is required on one of the phys on board */
u8 bnx2x_fan_failure_det_req(struct bnx2x *bp, u32 shmem_base, u8 port);

Y
Yaniv Rosner 已提交
327
#endif /* BNX2X_LINK_H */