Commit | Line | Data |
---|---|---|
8ceee660 BH |
1 | /**************************************************************************** |
2 | * Driver for Solarflare Solarstorm network controllers and boards | |
3 | * Copyright 2006-2008 Solarflare Communications Inc. | |
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" | |
20 | #include "boards.h" | |
21 | ||
68e7f45e BH |
22 | static inline unsigned efx_mdio_id_rev(u32 id) { return id & 0xf; } |
23 | static inline unsigned efx_mdio_id_model(u32 id) { return (id >> 4) & 0x3f; } | |
24 | extern unsigned efx_mdio_id_oui(u32 id); | |
8ceee660 | 25 | |
68e7f45e | 26 | static inline int efx_mdio_read(struct efx_nic *efx, int devad, int addr) |
8ceee660 | 27 | { |
68e7f45e | 28 | return efx->mdio.mdio_read(efx->net_dev, efx->mdio.prtad, devad, addr); |
8ceee660 BH |
29 | } |
30 | ||
68e7f45e BH |
31 | static inline void |
32 | efx_mdio_write(struct efx_nic *efx, int devad, int addr, int value) | |
8ceee660 | 33 | { |
68e7f45e | 34 | efx->mdio.mdio_write(efx->net_dev, efx->mdio.prtad, devad, addr, value); |
8ceee660 BH |
35 | } |
36 | ||
68e7f45e | 37 | static inline u32 efx_mdio_read_id(struct efx_nic *efx, int mmd) |
8ceee660 | 38 | { |
68e7f45e BH |
39 | u16 id_low = efx_mdio_read(efx, mmd, MDIO_DEVID2); |
40 | u16 id_hi = efx_mdio_read(efx, mmd, MDIO_DEVID1); | |
8ceee660 BH |
41 | return (id_hi << 16) | (id_low); |
42 | } | |
43 | ||
68e7f45e | 44 | static inline bool efx_mdio_phyxgxs_lane_sync(struct efx_nic *efx) |
8ceee660 | 45 | { |
dc8cfa55 BH |
46 | int i, lane_status; |
47 | bool sync; | |
8ceee660 BH |
48 | |
49 | for (i = 0; i < 2; ++i) | |
68e7f45e BH |
50 | lane_status = efx_mdio_read(efx, MDIO_MMD_PHYXS, |
51 | MDIO_PHYXS_LNSTAT); | |
8ceee660 | 52 | |
68e7f45e | 53 | sync = !!(lane_status & MDIO_PHYXS_LNSTAT_ALIGN); |
8ceee660 | 54 | if (!sync) |
e9713e6f | 55 | EFX_LOG(efx, "XGXS lane status: %x\n", 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 BH |
70 | /* As efx_mdio_check_mmd but for multiple MMDs */ |
71 | int efx_mdio_check_mmds(struct efx_nic *efx, | |
72 | unsigned int mmd_mask, unsigned int fatal_mask); | |
8ceee660 BH |
73 | |
74 | /* Check the link status of specified mmds in bit mask */ | |
68e7f45e | 75 | extern bool efx_mdio_links_ok(struct efx_nic *efx, unsigned int mmd_mask); |
8ceee660 | 76 | |
3273c2e8 | 77 | /* Generic transmit disable support though PMAPMD */ |
68e7f45e | 78 | extern void efx_mdio_transmit_disable(struct efx_nic *efx); |
3273c2e8 BH |
79 | |
80 | /* Generic part of reconfigure: set/clear loopback bits */ | |
68e7f45e | 81 | extern void efx_mdio_phy_reconfigure(struct efx_nic *efx); |
3273c2e8 | 82 | |
3e133c44 | 83 | /* Set the power state of the specified MMDs */ |
68e7f45e BH |
84 | extern void efx_mdio_set_mmds_lpower(struct efx_nic *efx, |
85 | int low_power, unsigned int mmd_mask); | |
04cc8cac | 86 | |
8ceee660 | 87 | /* Set (some of) the PHY settings over MDIO */ |
68e7f45e | 88 | extern int efx_mdio_set_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd); |
8ceee660 | 89 | |
04cc8cac BH |
90 | /* Get pause parameters from AN if available (otherwise return |
91 | * requested pause parameters) | |
92 | */ | |
68e7f45e | 93 | enum efx_fc_type efx_mdio_get_pause(struct efx_nic *efx); |
04cc8cac | 94 | |
8ceee660 | 95 | /* Wait for specified MMDs to exit reset within a timeout */ |
68e7f45e BH |
96 | extern int efx_mdio_wait_reset_mmds(struct efx_nic *efx, |
97 | unsigned int mmd_mask); | |
8ceee660 | 98 | |
356eebb2 | 99 | /* Set or clear flag, debouncing */ |
68e7f45e BH |
100 | static inline void |
101 | efx_mdio_set_flag(struct efx_nic *efx, int devad, int addr, | |
102 | int mask, bool state) | |
103 | { | |
104 | mdio_set_flag(&efx->mdio, efx->mdio.prtad, devad, addr, mask, state); | |
105 | } | |
356eebb2 | 106 | |
8ceee660 | 107 | #endif /* EFX_MDIO_10G_H */ |