]>
Commit | Line | Data |
---|---|---|
8ceee660 BH |
1 | /**************************************************************************** |
2 | * Driver for Solarflare Solarstorm network controllers and boards | |
0a6f40c6 | 3 | * Copyright 2006-2011 Solarflare Communications Inc. |
8ceee660 BH |
4 | * |
5 | * This program is free software; you can redistribute it and/or modify it | |
6 | * under the terms of the GNU General Public License version 2 as published | |
7 | * by the Free Software Foundation, incorporated herein by reference. | |
8 | */ | |
9 | ||
10 | #ifndef EFX_MDIO_10G_H | |
11 | #define EFX_MDIO_10G_H | |
12 | ||
68e7f45e BH |
13 | #include <linux/mdio.h> |
14 | ||
8ceee660 | 15 | /* |
68e7f45e | 16 | * Helper functions for doing 10G MDIO as specified in IEEE 802.3 clause 45. |
8ceee660 BH |
17 | */ |
18 | ||
19 | #include "efx.h" | |
8ceee660 | 20 | |
68e7f45e BH |
21 | static inline unsigned efx_mdio_id_rev(u32 id) { return id & 0xf; } |
22 | static inline unsigned efx_mdio_id_model(u32 id) { return (id >> 4) & 0x3f; } | |
23 | extern unsigned efx_mdio_id_oui(u32 id); | |
8ceee660 | 24 | |
68e7f45e | 25 | static inline int efx_mdio_read(struct efx_nic *efx, int devad, int addr) |
8ceee660 | 26 | { |
68e7f45e | 27 | return efx->mdio.mdio_read(efx->net_dev, efx->mdio.prtad, devad, addr); |
8ceee660 BH |
28 | } |
29 | ||
68e7f45e BH |
30 | static inline void |
31 | efx_mdio_write(struct efx_nic *efx, int devad, int addr, int value) | |
8ceee660 | 32 | { |
68e7f45e | 33 | efx->mdio.mdio_write(efx->net_dev, efx->mdio.prtad, devad, addr, value); |
8ceee660 BH |
34 | } |
35 | ||
68e7f45e | 36 | static inline u32 efx_mdio_read_id(struct efx_nic *efx, int mmd) |
8ceee660 | 37 | { |
68e7f45e BH |
38 | u16 id_low = efx_mdio_read(efx, mmd, MDIO_DEVID2); |
39 | u16 id_hi = efx_mdio_read(efx, mmd, MDIO_DEVID1); | |
8ceee660 BH |
40 | return (id_hi << 16) | (id_low); |
41 | } | |
42 | ||
68e7f45e | 43 | static inline bool efx_mdio_phyxgxs_lane_sync(struct efx_nic *efx) |
8ceee660 | 44 | { |
dc8cfa55 BH |
45 | int i, lane_status; |
46 | bool sync; | |
8ceee660 BH |
47 | |
48 | for (i = 0; i < 2; ++i) | |
68e7f45e BH |
49 | lane_status = efx_mdio_read(efx, MDIO_MMD_PHYXS, |
50 | MDIO_PHYXS_LNSTAT); | |
8ceee660 | 51 | |
68e7f45e | 52 | sync = !!(lane_status & MDIO_PHYXS_LNSTAT_ALIGN); |
8ceee660 | 53 | if (!sync) |
62776d03 BH |
54 | netif_dbg(efx, hw, efx->net_dev, "XGXS lane status: %x\n", |
55 | lane_status); | |
8ceee660 BH |
56 | return sync; |
57 | } | |
58 | ||
68e7f45e | 59 | extern const char *efx_mdio_mmd_name(int mmd); |
8ceee660 BH |
60 | |
61 | /* | |
62 | * Reset a specific MMD and wait for reset to clear. | |
63 | * Return number of spins left (>0) on success, -%ETIMEDOUT on failure. | |
64 | * | |
65 | * This function will sleep | |
66 | */ | |
68e7f45e BH |
67 | extern int efx_mdio_reset_mmd(struct efx_nic *efx, int mmd, |
68 | int spins, int spintime); | |
8ceee660 | 69 | |
68e7f45e | 70 | /* As efx_mdio_check_mmd but for multiple MMDs */ |
a461103b | 71 | int efx_mdio_check_mmds(struct efx_nic *efx, unsigned int mmd_mask); |
8ceee660 BH |
72 | |
73 | /* Check the link status of specified mmds in bit mask */ | |
68e7f45e | 74 | extern bool efx_mdio_links_ok(struct efx_nic *efx, unsigned int mmd_mask); |
8ceee660 | 75 | |
3273c2e8 | 76 | /* Generic transmit disable support though PMAPMD */ |
68e7f45e | 77 | extern void efx_mdio_transmit_disable(struct efx_nic *efx); |
3273c2e8 BH |
78 | |
79 | /* Generic part of reconfigure: set/clear loopback bits */ | |
68e7f45e | 80 | extern void efx_mdio_phy_reconfigure(struct efx_nic *efx); |
3273c2e8 | 81 | |
3e133c44 | 82 | /* Set the power state of the specified MMDs */ |
68e7f45e BH |
83 | extern void efx_mdio_set_mmds_lpower(struct efx_nic *efx, |
84 | int low_power, unsigned int mmd_mask); | |
04cc8cac | 85 | |
8ceee660 | 86 | /* Set (some of) the PHY settings over MDIO */ |
68e7f45e | 87 | extern int efx_mdio_set_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd); |
8ceee660 | 88 | |
d3245b28 BH |
89 | /* Push advertising flags and restart autonegotiation */ |
90 | extern void efx_mdio_an_reconfigure(struct efx_nic *efx); | |
91 | ||
04cc8cac BH |
92 | /* Get pause parameters from AN if available (otherwise return |
93 | * requested pause parameters) | |
94 | */ | |
68e7f45e | 95 | enum efx_fc_type efx_mdio_get_pause(struct efx_nic *efx); |
04cc8cac | 96 | |
8ceee660 | 97 | /* Wait for specified MMDs to exit reset within a timeout */ |
68e7f45e BH |
98 | extern int efx_mdio_wait_reset_mmds(struct efx_nic *efx, |
99 | unsigned int mmd_mask); | |
8ceee660 | 100 | |
356eebb2 | 101 | /* Set or clear flag, debouncing */ |
68e7f45e BH |
102 | static inline void |
103 | efx_mdio_set_flag(struct efx_nic *efx, int devad, int addr, | |
104 | int mask, bool state) | |
105 | { | |
106 | mdio_set_flag(&efx->mdio, efx->mdio.prtad, devad, addr, mask, state); | |
107 | } | |
356eebb2 | 108 | |
4f16c073 BH |
109 | /* Liveness self-test for MDIO PHYs */ |
110 | extern int efx_mdio_test_alive(struct efx_nic *efx); | |
111 | ||
8ceee660 | 112 | #endif /* EFX_MDIO_10G_H */ |