173970055SRussell King #include <linux/delay.h> 254a2fc62SFlorian Fainelli #include <linux/gpio/consumer.h> 373970055SRussell King #include <linux/i2c.h> 473970055SRussell King #include <linux/interrupt.h> 573970055SRussell King #include <linux/jiffies.h> 673970055SRussell King #include <linux/module.h> 773970055SRussell King #include <linux/mutex.h> 873970055SRussell King #include <linux/of.h> 973970055SRussell King #include <linux/phy.h> 1073970055SRussell King #include <linux/platform_device.h> 1173970055SRussell King #include <linux/rtnetlink.h> 1273970055SRussell King #include <linux/slab.h> 1373970055SRussell King #include <linux/workqueue.h> 1473970055SRussell King 1573970055SRussell King #include "mdio-i2c.h" 1673970055SRussell King #include "sfp.h" 1773970055SRussell King #include "swphy.h" 1873970055SRussell King 1973970055SRussell King enum { 2073970055SRussell King GPIO_MODDEF0, 2173970055SRussell King GPIO_LOS, 2273970055SRussell King GPIO_TX_FAULT, 2373970055SRussell King GPIO_TX_DISABLE, 2473970055SRussell King GPIO_RATE_SELECT, 2573970055SRussell King GPIO_MAX, 2673970055SRussell King 2773970055SRussell King SFP_F_PRESENT = BIT(GPIO_MODDEF0), 2873970055SRussell King SFP_F_LOS = BIT(GPIO_LOS), 2973970055SRussell King SFP_F_TX_FAULT = BIT(GPIO_TX_FAULT), 3073970055SRussell King SFP_F_TX_DISABLE = BIT(GPIO_TX_DISABLE), 3173970055SRussell King SFP_F_RATE_SELECT = BIT(GPIO_RATE_SELECT), 3273970055SRussell King 3373970055SRussell King SFP_E_INSERT = 0, 3473970055SRussell King SFP_E_REMOVE, 3573970055SRussell King SFP_E_DEV_DOWN, 3673970055SRussell King SFP_E_DEV_UP, 3773970055SRussell King SFP_E_TX_FAULT, 3873970055SRussell King SFP_E_TX_CLEAR, 3973970055SRussell King SFP_E_LOS_HIGH, 4073970055SRussell King SFP_E_LOS_LOW, 4173970055SRussell King SFP_E_TIMEOUT, 4273970055SRussell King 4373970055SRussell King SFP_MOD_EMPTY = 0, 4473970055SRussell King SFP_MOD_PROBE, 453bb35261SJon Nettleton SFP_MOD_HPOWER, 4673970055SRussell King SFP_MOD_PRESENT, 4773970055SRussell King SFP_MOD_ERROR, 4873970055SRussell King 4973970055SRussell King SFP_DEV_DOWN = 0, 5073970055SRussell King SFP_DEV_UP, 5173970055SRussell King 5273970055SRussell King SFP_S_DOWN = 0, 5373970055SRussell King SFP_S_INIT, 5473970055SRussell King SFP_S_WAIT_LOS, 5573970055SRussell King SFP_S_LINK_UP, 5673970055SRussell King SFP_S_TX_FAULT, 5773970055SRussell King SFP_S_REINIT, 5873970055SRussell King SFP_S_TX_DISABLE, 5973970055SRussell King }; 6073970055SRussell King 6173970055SRussell King static const char *gpio_of_names[] = { 6225ee0793SBaruch Siach "mod-def0", 6373970055SRussell King "los", 6473970055SRussell King "tx-fault", 6573970055SRussell King "tx-disable", 6625ee0793SBaruch Siach "rate-select0", 6773970055SRussell King }; 6873970055SRussell King 6973970055SRussell King static const enum gpiod_flags gpio_flags[] = { 7073970055SRussell King GPIOD_IN, 7173970055SRussell King GPIOD_IN, 7273970055SRussell King GPIOD_IN, 7373970055SRussell King GPIOD_ASIS, 7473970055SRussell King GPIOD_ASIS, 7573970055SRussell King }; 7673970055SRussell King 7773970055SRussell King #define T_INIT_JIFFIES msecs_to_jiffies(300) 7873970055SRussell King #define T_RESET_US 10 7973970055SRussell King #define T_FAULT_RECOVER msecs_to_jiffies(1000) 8073970055SRussell King 8173970055SRussell King /* SFP module presence detection is poor: the three MOD DEF signals are 8273970055SRussell King * the same length on the PCB, which means it's possible for MOD DEF 0 to 8373970055SRussell King * connect before the I2C bus on MOD DEF 1/2. 8473970055SRussell King * 8573970055SRussell King * The SFP MSA specifies 300ms as t_init (the time taken for TX_FAULT to 8673970055SRussell King * be deasserted) but makes no mention of the earliest time before we can 8773970055SRussell King * access the I2C EEPROM. However, Avago modules require 300ms. 8873970055SRussell King */ 8973970055SRussell King #define T_PROBE_INIT msecs_to_jiffies(300) 903bb35261SJon Nettleton #define T_HPOWER_LEVEL msecs_to_jiffies(300) 9173970055SRussell King #define T_PROBE_RETRY msecs_to_jiffies(100) 9273970055SRussell King 93516b29edSFlorian Fainelli /* SFP modules appear to always have their PHY configured for bus address 9473970055SRussell King * 0x56 (which with mdio-i2c, translates to a PHY address of 22). 9573970055SRussell King */ 9673970055SRussell King #define SFP_PHY_ADDR 22 9773970055SRussell King 98516b29edSFlorian Fainelli /* Give this long for the PHY to reset. */ 9973970055SRussell King #define T_PHY_RESET_MS 50 10073970055SRussell King 10173970055SRussell King static DEFINE_MUTEX(sfp_mutex); 10273970055SRussell King 103259c8618SRussell King struct sff_data { 104259c8618SRussell King unsigned int gpios; 105259c8618SRussell King bool (*module_supported)(const struct sfp_eeprom_id *id); 106259c8618SRussell King }; 107259c8618SRussell King 10873970055SRussell King struct sfp { 10973970055SRussell King struct device *dev; 11073970055SRussell King struct i2c_adapter *i2c; 11173970055SRussell King struct mii_bus *i2c_mii; 11273970055SRussell King struct sfp_bus *sfp_bus; 11373970055SRussell King struct phy_device *mod_phy; 114259c8618SRussell King const struct sff_data *type; 1153bb35261SJon Nettleton u32 max_power_mW; 11673970055SRussell King 11773970055SRussell King unsigned int (*get_state)(struct sfp *); 11873970055SRussell King void (*set_state)(struct sfp *, unsigned int); 11973970055SRussell King int (*read)(struct sfp *, bool, u8, void *, size_t); 1203bb35261SJon Nettleton int (*write)(struct sfp *, bool, u8, void *, size_t); 12173970055SRussell King 12273970055SRussell King struct gpio_desc *gpio[GPIO_MAX]; 12373970055SRussell King 12473970055SRussell King unsigned int state; 12573970055SRussell King struct delayed_work poll; 12673970055SRussell King struct delayed_work timeout; 12773970055SRussell King struct mutex sm_mutex; 12873970055SRussell King unsigned char sm_mod_state; 12973970055SRussell King unsigned char sm_dev_state; 13073970055SRussell King unsigned short sm_state; 13173970055SRussell King unsigned int sm_retries; 13273970055SRussell King 13373970055SRussell King struct sfp_eeprom_id id; 13473970055SRussell King }; 13573970055SRussell King 136259c8618SRussell King static bool sff_module_supported(const struct sfp_eeprom_id *id) 137259c8618SRussell King { 138259c8618SRussell King return id->base.phys_id == SFP_PHYS_ID_SFF && 139259c8618SRussell King id->base.phys_ext_id == SFP_PHYS_EXT_ID_SFP; 140259c8618SRussell King } 141259c8618SRussell King 142259c8618SRussell King static const struct sff_data sff_data = { 143259c8618SRussell King .gpios = SFP_F_LOS | SFP_F_TX_FAULT | SFP_F_TX_DISABLE, 144259c8618SRussell King .module_supported = sff_module_supported, 145259c8618SRussell King }; 146259c8618SRussell King 147259c8618SRussell King static bool sfp_module_supported(const struct sfp_eeprom_id *id) 148259c8618SRussell King { 149259c8618SRussell King return id->base.phys_id == SFP_PHYS_ID_SFP && 150259c8618SRussell King id->base.phys_ext_id == SFP_PHYS_EXT_ID_SFP; 151259c8618SRussell King } 152259c8618SRussell King 153259c8618SRussell King static const struct sff_data sfp_data = { 154259c8618SRussell King .gpios = SFP_F_PRESENT | SFP_F_LOS | SFP_F_TX_FAULT | 155259c8618SRussell King SFP_F_TX_DISABLE | SFP_F_RATE_SELECT, 156259c8618SRussell King .module_supported = sfp_module_supported, 157259c8618SRussell King }; 158259c8618SRussell King 159259c8618SRussell King static const struct of_device_id sfp_of_match[] = { 160259c8618SRussell King { .compatible = "sff,sff", .data = &sff_data, }, 161259c8618SRussell King { .compatible = "sff,sfp", .data = &sfp_data, }, 162259c8618SRussell King { }, 163259c8618SRussell King }; 164259c8618SRussell King MODULE_DEVICE_TABLE(of, sfp_of_match); 165259c8618SRussell King 16673970055SRussell King static unsigned long poll_jiffies; 16773970055SRussell King 16873970055SRussell King static unsigned int sfp_gpio_get_state(struct sfp *sfp) 16973970055SRussell King { 17073970055SRussell King unsigned int i, state, v; 17173970055SRussell King 17273970055SRussell King for (i = state = 0; i < GPIO_MAX; i++) { 17373970055SRussell King if (gpio_flags[i] != GPIOD_IN || !sfp->gpio[i]) 17473970055SRussell King continue; 17573970055SRussell King 17673970055SRussell King v = gpiod_get_value_cansleep(sfp->gpio[i]); 17773970055SRussell King if (v) 17873970055SRussell King state |= BIT(i); 17973970055SRussell King } 18073970055SRussell King 18173970055SRussell King return state; 18273970055SRussell King } 18373970055SRussell King 184259c8618SRussell King static unsigned int sff_gpio_get_state(struct sfp *sfp) 185259c8618SRussell King { 186259c8618SRussell King return sfp_gpio_get_state(sfp) | SFP_F_PRESENT; 187259c8618SRussell King } 188259c8618SRussell King 18973970055SRussell King static void sfp_gpio_set_state(struct sfp *sfp, unsigned int state) 19073970055SRussell King { 19173970055SRussell King if (state & SFP_F_PRESENT) { 19273970055SRussell King /* If the module is present, drive the signals */ 19373970055SRussell King if (sfp->gpio[GPIO_TX_DISABLE]) 19473970055SRussell King gpiod_direction_output(sfp->gpio[GPIO_TX_DISABLE], 19573970055SRussell King state & SFP_F_TX_DISABLE); 19673970055SRussell King if (state & SFP_F_RATE_SELECT) 19773970055SRussell King gpiod_direction_output(sfp->gpio[GPIO_RATE_SELECT], 19873970055SRussell King state & SFP_F_RATE_SELECT); 19973970055SRussell King } else { 20073970055SRussell King /* Otherwise, let them float to the pull-ups */ 20173970055SRussell King if (sfp->gpio[GPIO_TX_DISABLE]) 20273970055SRussell King gpiod_direction_input(sfp->gpio[GPIO_TX_DISABLE]); 20373970055SRussell King if (state & SFP_F_RATE_SELECT) 20473970055SRussell King gpiod_direction_input(sfp->gpio[GPIO_RATE_SELECT]); 20573970055SRussell King } 20673970055SRussell King } 20773970055SRussell King 2083bb35261SJon Nettleton static int sfp_i2c_read(struct sfp *sfp, bool a2, u8 dev_addr, void *buf, 2093bb35261SJon Nettleton size_t len) 21073970055SRussell King { 21173970055SRussell King struct i2c_msg msgs[2]; 2123bb35261SJon Nettleton u8 bus_addr = a2 ? 0x51 : 0x50; 21373970055SRussell King int ret; 21473970055SRussell King 21573970055SRussell King msgs[0].addr = bus_addr; 21673970055SRussell King msgs[0].flags = 0; 21773970055SRussell King msgs[0].len = 1; 21873970055SRussell King msgs[0].buf = &dev_addr; 21973970055SRussell King msgs[1].addr = bus_addr; 22073970055SRussell King msgs[1].flags = I2C_M_RD; 22173970055SRussell King msgs[1].len = len; 22273970055SRussell King msgs[1].buf = buf; 22373970055SRussell King 2243bb35261SJon Nettleton ret = i2c_transfer(sfp->i2c, msgs, ARRAY_SIZE(msgs)); 22573970055SRussell King if (ret < 0) 22673970055SRussell King return ret; 22773970055SRussell King 22873970055SRussell King return ret == ARRAY_SIZE(msgs) ? len : 0; 22973970055SRussell King } 23073970055SRussell King 2313bb35261SJon Nettleton static int sfp_i2c_write(struct sfp *sfp, bool a2, u8 dev_addr, void *buf, 23273970055SRussell King size_t len) 23373970055SRussell King { 2343bb35261SJon Nettleton struct i2c_msg msgs[1]; 2353bb35261SJon Nettleton u8 bus_addr = a2 ? 0x51 : 0x50; 2363bb35261SJon Nettleton int ret; 2373bb35261SJon Nettleton 2383bb35261SJon Nettleton msgs[0].addr = bus_addr; 2393bb35261SJon Nettleton msgs[0].flags = 0; 2403bb35261SJon Nettleton msgs[0].len = 1 + len; 2413bb35261SJon Nettleton msgs[0].buf = kmalloc(1 + len, GFP_KERNEL); 2423bb35261SJon Nettleton if (!msgs[0].buf) 2433bb35261SJon Nettleton return -ENOMEM; 2443bb35261SJon Nettleton 2453bb35261SJon Nettleton msgs[0].buf[0] = dev_addr; 2463bb35261SJon Nettleton memcpy(&msgs[0].buf[1], buf, len); 2473bb35261SJon Nettleton 2483bb35261SJon Nettleton ret = i2c_transfer(sfp->i2c, msgs, ARRAY_SIZE(msgs)); 2493bb35261SJon Nettleton 2503bb35261SJon Nettleton kfree(msgs[0].buf); 2513bb35261SJon Nettleton 2523bb35261SJon Nettleton if (ret < 0) 2533bb35261SJon Nettleton return ret; 2543bb35261SJon Nettleton 2553bb35261SJon Nettleton return ret == ARRAY_SIZE(msgs) ? len : 0; 25673970055SRussell King } 25773970055SRussell King 25873970055SRussell King static int sfp_i2c_configure(struct sfp *sfp, struct i2c_adapter *i2c) 25973970055SRussell King { 26073970055SRussell King struct mii_bus *i2c_mii; 26173970055SRussell King int ret; 26273970055SRussell King 26373970055SRussell King if (!i2c_check_functionality(i2c, I2C_FUNC_I2C)) 26473970055SRussell King return -EINVAL; 26573970055SRussell King 26673970055SRussell King sfp->i2c = i2c; 26773970055SRussell King sfp->read = sfp_i2c_read; 2683bb35261SJon Nettleton sfp->write = sfp_i2c_write; 26973970055SRussell King 27073970055SRussell King i2c_mii = mdio_i2c_alloc(sfp->dev, i2c); 27173970055SRussell King if (IS_ERR(i2c_mii)) 27273970055SRussell King return PTR_ERR(i2c_mii); 27373970055SRussell King 27473970055SRussell King i2c_mii->name = "SFP I2C Bus"; 27573970055SRussell King i2c_mii->phy_mask = ~0; 27673970055SRussell King 27773970055SRussell King ret = mdiobus_register(i2c_mii); 27873970055SRussell King if (ret < 0) { 27973970055SRussell King mdiobus_free(i2c_mii); 28073970055SRussell King return ret; 28173970055SRussell King } 28273970055SRussell King 28373970055SRussell King sfp->i2c_mii = i2c_mii; 28473970055SRussell King 28573970055SRussell King return 0; 28673970055SRussell King } 28773970055SRussell King 28873970055SRussell King /* Interface */ 28973970055SRussell King static unsigned int sfp_get_state(struct sfp *sfp) 29073970055SRussell King { 29173970055SRussell King return sfp->get_state(sfp); 29273970055SRussell King } 29373970055SRussell King 29473970055SRussell King static void sfp_set_state(struct sfp *sfp, unsigned int state) 29573970055SRussell King { 29673970055SRussell King sfp->set_state(sfp, state); 29773970055SRussell King } 29873970055SRussell King 29973970055SRussell King static int sfp_read(struct sfp *sfp, bool a2, u8 addr, void *buf, size_t len) 30073970055SRussell King { 30173970055SRussell King return sfp->read(sfp, a2, addr, buf, len); 30273970055SRussell King } 30373970055SRussell King 3043bb35261SJon Nettleton static int sfp_write(struct sfp *sfp, bool a2, u8 addr, void *buf, size_t len) 3053bb35261SJon Nettleton { 3063bb35261SJon Nettleton return sfp->write(sfp, a2, addr, buf, len); 3073bb35261SJon Nettleton } 3083bb35261SJon Nettleton 30973970055SRussell King static unsigned int sfp_check(void *buf, size_t len) 31073970055SRussell King { 31173970055SRussell King u8 *p, check; 31273970055SRussell King 31373970055SRussell King for (p = buf, check = 0; len; p++, len--) 31473970055SRussell King check += *p; 31573970055SRussell King 31673970055SRussell King return check; 31773970055SRussell King } 31873970055SRussell King 31973970055SRussell King /* Helpers */ 32073970055SRussell King static void sfp_module_tx_disable(struct sfp *sfp) 32173970055SRussell King { 32273970055SRussell King dev_dbg(sfp->dev, "tx disable %u -> %u\n", 32373970055SRussell King sfp->state & SFP_F_TX_DISABLE ? 1 : 0, 1); 32473970055SRussell King sfp->state |= SFP_F_TX_DISABLE; 32573970055SRussell King sfp_set_state(sfp, sfp->state); 32673970055SRussell King } 32773970055SRussell King 32873970055SRussell King static void sfp_module_tx_enable(struct sfp *sfp) 32973970055SRussell King { 33073970055SRussell King dev_dbg(sfp->dev, "tx disable %u -> %u\n", 33173970055SRussell King sfp->state & SFP_F_TX_DISABLE ? 1 : 0, 0); 33273970055SRussell King sfp->state &= ~SFP_F_TX_DISABLE; 33373970055SRussell King sfp_set_state(sfp, sfp->state); 33473970055SRussell King } 33573970055SRussell King 33673970055SRussell King static void sfp_module_tx_fault_reset(struct sfp *sfp) 33773970055SRussell King { 33873970055SRussell King unsigned int state = sfp->state; 33973970055SRussell King 34073970055SRussell King if (state & SFP_F_TX_DISABLE) 34173970055SRussell King return; 34273970055SRussell King 34373970055SRussell King sfp_set_state(sfp, state | SFP_F_TX_DISABLE); 34473970055SRussell King 34573970055SRussell King udelay(T_RESET_US); 34673970055SRussell King 34773970055SRussell King sfp_set_state(sfp, state); 34873970055SRussell King } 34973970055SRussell King 35073970055SRussell King /* SFP state machine */ 35173970055SRussell King static void sfp_sm_set_timer(struct sfp *sfp, unsigned int timeout) 35273970055SRussell King { 35373970055SRussell King if (timeout) 35473970055SRussell King mod_delayed_work(system_power_efficient_wq, &sfp->timeout, 35573970055SRussell King timeout); 35673970055SRussell King else 35773970055SRussell King cancel_delayed_work(&sfp->timeout); 35873970055SRussell King } 35973970055SRussell King 36073970055SRussell King static void sfp_sm_next(struct sfp *sfp, unsigned int state, 36173970055SRussell King unsigned int timeout) 36273970055SRussell King { 36373970055SRussell King sfp->sm_state = state; 36473970055SRussell King sfp_sm_set_timer(sfp, timeout); 36573970055SRussell King } 36673970055SRussell King 367516b29edSFlorian Fainelli static void sfp_sm_ins_next(struct sfp *sfp, unsigned int state, 368516b29edSFlorian Fainelli unsigned int timeout) 36973970055SRussell King { 37073970055SRussell King sfp->sm_mod_state = state; 37173970055SRussell King sfp_sm_set_timer(sfp, timeout); 37273970055SRussell King } 37373970055SRussell King 37473970055SRussell King static void sfp_sm_phy_detach(struct sfp *sfp) 37573970055SRussell King { 37673970055SRussell King phy_stop(sfp->mod_phy); 37773970055SRussell King sfp_remove_phy(sfp->sfp_bus); 37873970055SRussell King phy_device_remove(sfp->mod_phy); 37973970055SRussell King phy_device_free(sfp->mod_phy); 38073970055SRussell King sfp->mod_phy = NULL; 38173970055SRussell King } 38273970055SRussell King 38373970055SRussell King static void sfp_sm_probe_phy(struct sfp *sfp) 38473970055SRussell King { 38573970055SRussell King struct phy_device *phy; 38673970055SRussell King int err; 38773970055SRussell King 38873970055SRussell King msleep(T_PHY_RESET_MS); 38973970055SRussell King 39073970055SRussell King phy = mdiobus_scan(sfp->i2c_mii, SFP_PHY_ADDR); 39120b56ed9SRussell King if (phy == ERR_PTR(-ENODEV)) { 39220b56ed9SRussell King dev_info(sfp->dev, "no PHY detected\n"); 39373970055SRussell King return; 39473970055SRussell King } 39520b56ed9SRussell King if (IS_ERR(phy)) { 39620b56ed9SRussell King dev_err(sfp->dev, "mdiobus scan returned %ld\n", PTR_ERR(phy)); 39773970055SRussell King return; 39873970055SRussell King } 39973970055SRussell King 40073970055SRussell King err = sfp_add_phy(sfp->sfp_bus, phy); 40173970055SRussell King if (err) { 40273970055SRussell King phy_device_remove(phy); 40373970055SRussell King phy_device_free(phy); 40473970055SRussell King dev_err(sfp->dev, "sfp_add_phy failed: %d\n", err); 40573970055SRussell King return; 40673970055SRussell King } 40773970055SRussell King 40873970055SRussell King sfp->mod_phy = phy; 40973970055SRussell King phy_start(phy); 41073970055SRussell King } 41173970055SRussell King 41273970055SRussell King static void sfp_sm_link_up(struct sfp *sfp) 41373970055SRussell King { 41473970055SRussell King sfp_link_up(sfp->sfp_bus); 41573970055SRussell King sfp_sm_next(sfp, SFP_S_LINK_UP, 0); 41673970055SRussell King } 41773970055SRussell King 41873970055SRussell King static void sfp_sm_link_down(struct sfp *sfp) 41973970055SRussell King { 42073970055SRussell King sfp_link_down(sfp->sfp_bus); 42173970055SRussell King } 42273970055SRussell King 42373970055SRussell King static void sfp_sm_link_check_los(struct sfp *sfp) 42473970055SRussell King { 42573970055SRussell King unsigned int los = sfp->state & SFP_F_LOS; 42673970055SRussell King 427710dfbb0SRussell King /* If neither SFP_OPTIONS_LOS_INVERTED nor SFP_OPTIONS_LOS_NORMAL 428710dfbb0SRussell King * are set, we assume that no LOS signal is available. 42973970055SRussell King */ 430acf1c02fSRussell King if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_INVERTED)) 43173970055SRussell King los ^= SFP_F_LOS; 432710dfbb0SRussell King else if (!(sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_NORMAL))) 433710dfbb0SRussell King los = 0; 43473970055SRussell King 43573970055SRussell King if (los) 43673970055SRussell King sfp_sm_next(sfp, SFP_S_WAIT_LOS, 0); 43773970055SRussell King else 43873970055SRussell King sfp_sm_link_up(sfp); 43973970055SRussell King } 44073970055SRussell King 441710dfbb0SRussell King static bool sfp_los_event_active(struct sfp *sfp, unsigned int event) 442710dfbb0SRussell King { 443710dfbb0SRussell King return (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_INVERTED) && 444710dfbb0SRussell King event == SFP_E_LOS_LOW) || 445710dfbb0SRussell King (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_NORMAL) && 446710dfbb0SRussell King event == SFP_E_LOS_HIGH); 447710dfbb0SRussell King } 448710dfbb0SRussell King 449710dfbb0SRussell King static bool sfp_los_event_inactive(struct sfp *sfp, unsigned int event) 450710dfbb0SRussell King { 451710dfbb0SRussell King return (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_INVERTED) && 452710dfbb0SRussell King event == SFP_E_LOS_HIGH) || 453710dfbb0SRussell King (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_NORMAL) && 454710dfbb0SRussell King event == SFP_E_LOS_LOW); 455710dfbb0SRussell King } 456710dfbb0SRussell King 45773970055SRussell King static void sfp_sm_fault(struct sfp *sfp, bool warn) 45873970055SRussell King { 45973970055SRussell King if (sfp->sm_retries && !--sfp->sm_retries) { 460516b29edSFlorian Fainelli dev_err(sfp->dev, 461516b29edSFlorian Fainelli "module persistently indicates fault, disabling\n"); 46273970055SRussell King sfp_sm_next(sfp, SFP_S_TX_DISABLE, 0); 46373970055SRussell King } else { 46473970055SRussell King if (warn) 46573970055SRussell King dev_err(sfp->dev, "module transmit fault indicated\n"); 46673970055SRussell King 46773970055SRussell King sfp_sm_next(sfp, SFP_S_TX_FAULT, T_FAULT_RECOVER); 46873970055SRussell King } 46973970055SRussell King } 47073970055SRussell King 47173970055SRussell King static void sfp_sm_mod_init(struct sfp *sfp) 47273970055SRussell King { 47373970055SRussell King sfp_module_tx_enable(sfp); 47473970055SRussell King 47573970055SRussell King /* Wait t_init before indicating that the link is up, provided the 47673970055SRussell King * current state indicates no TX_FAULT. If TX_FAULT clears before 47773970055SRussell King * this time, that's fine too. 47873970055SRussell King */ 47973970055SRussell King sfp_sm_next(sfp, SFP_S_INIT, T_INIT_JIFFIES); 48073970055SRussell King sfp->sm_retries = 5; 48173970055SRussell King 48273970055SRussell King /* Setting the serdes link mode is guesswork: there's no 48373970055SRussell King * field in the EEPROM which indicates what mode should 48473970055SRussell King * be used. 48573970055SRussell King * 48673970055SRussell King * If it's a gigabit-only fiber module, it probably does 48773970055SRussell King * not have a PHY, so switch to 802.3z negotiation mode. 48873970055SRussell King * Otherwise, switch to SGMII mode (which is required to 48973970055SRussell King * support non-gigabit speeds) and probe for a PHY. 49073970055SRussell King */ 49173970055SRussell King if (sfp->id.base.e1000_base_t || 49273970055SRussell King sfp->id.base.e100_base_lx || 49373970055SRussell King sfp->id.base.e100_base_fx) 49473970055SRussell King sfp_sm_probe_phy(sfp); 49573970055SRussell King } 49673970055SRussell King 4973bb35261SJon Nettleton static int sfp_sm_mod_hpower(struct sfp *sfp) 4983bb35261SJon Nettleton { 4993bb35261SJon Nettleton u32 power; 5003bb35261SJon Nettleton u8 val; 5013bb35261SJon Nettleton int err; 5023bb35261SJon Nettleton 5033bb35261SJon Nettleton power = 1000; 5043bb35261SJon Nettleton if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_POWER_DECL)) 5053bb35261SJon Nettleton power = 1500; 5063bb35261SJon Nettleton if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_HIGH_POWER_LEVEL)) 5073bb35261SJon Nettleton power = 2000; 5083bb35261SJon Nettleton 5093bb35261SJon Nettleton if (sfp->id.ext.sff8472_compliance == SFP_SFF8472_COMPLIANCE_NONE && 5103bb35261SJon Nettleton (sfp->id.ext.diagmon & (SFP_DIAGMON_DDM | SFP_DIAGMON_ADDRMODE)) != 5113bb35261SJon Nettleton SFP_DIAGMON_DDM) { 5123bb35261SJon Nettleton /* The module appears not to implement bus address 0xa2, 5133bb35261SJon Nettleton * or requires an address change sequence, so assume that 5143bb35261SJon Nettleton * the module powers up in the indicated power mode. 5153bb35261SJon Nettleton */ 5163bb35261SJon Nettleton if (power > sfp->max_power_mW) { 5173bb35261SJon Nettleton dev_err(sfp->dev, 5183bb35261SJon Nettleton "Host does not support %u.%uW modules\n", 5193bb35261SJon Nettleton power / 1000, (power / 100) % 10); 5203bb35261SJon Nettleton return -EINVAL; 5213bb35261SJon Nettleton } 5223bb35261SJon Nettleton return 0; 5233bb35261SJon Nettleton } 5243bb35261SJon Nettleton 5253bb35261SJon Nettleton if (power > sfp->max_power_mW) { 5263bb35261SJon Nettleton dev_warn(sfp->dev, 5273bb35261SJon Nettleton "Host does not support %u.%uW modules, module left in power mode 1\n", 5283bb35261SJon Nettleton power / 1000, (power / 100) % 10); 5293bb35261SJon Nettleton return 0; 5303bb35261SJon Nettleton } 5313bb35261SJon Nettleton 5323bb35261SJon Nettleton if (power <= 1000) 5333bb35261SJon Nettleton return 0; 5343bb35261SJon Nettleton 5353bb35261SJon Nettleton err = sfp_read(sfp, true, SFP_EXT_STATUS, &val, sizeof(val)); 5363bb35261SJon Nettleton if (err != sizeof(val)) { 5373bb35261SJon Nettleton dev_err(sfp->dev, "Failed to read EEPROM: %d\n", err); 5383bb35261SJon Nettleton err = -EAGAIN; 5393bb35261SJon Nettleton goto err; 5403bb35261SJon Nettleton } 5413bb35261SJon Nettleton 5423bb35261SJon Nettleton val |= BIT(0); 5433bb35261SJon Nettleton 5443bb35261SJon Nettleton err = sfp_write(sfp, true, SFP_EXT_STATUS, &val, sizeof(val)); 5453bb35261SJon Nettleton if (err != sizeof(val)) { 5463bb35261SJon Nettleton dev_err(sfp->dev, "Failed to write EEPROM: %d\n", err); 5473bb35261SJon Nettleton err = -EAGAIN; 5483bb35261SJon Nettleton goto err; 5493bb35261SJon Nettleton } 5503bb35261SJon Nettleton 5513bb35261SJon Nettleton dev_info(sfp->dev, "Module switched to %u.%uW power level\n", 5523bb35261SJon Nettleton power / 1000, (power / 100) % 10); 5533bb35261SJon Nettleton return T_HPOWER_LEVEL; 5543bb35261SJon Nettleton 5553bb35261SJon Nettleton err: 5563bb35261SJon Nettleton return err; 5573bb35261SJon Nettleton } 5583bb35261SJon Nettleton 55973970055SRussell King static int sfp_sm_mod_probe(struct sfp *sfp) 56073970055SRussell King { 56173970055SRussell King /* SFP module inserted - read I2C data */ 56273970055SRussell King struct sfp_eeprom_id id; 563981f1f80SRussell King bool cotsworks; 56473970055SRussell King u8 check; 5653bb35261SJon Nettleton int ret; 56673970055SRussell King 5673bb35261SJon Nettleton ret = sfp_read(sfp, false, 0, &id, sizeof(id)); 5683bb35261SJon Nettleton if (ret < 0) { 5693bb35261SJon Nettleton dev_err(sfp->dev, "failed to read EEPROM: %d\n", ret); 57073970055SRussell King return -EAGAIN; 57173970055SRussell King } 57273970055SRussell King 5733bb35261SJon Nettleton if (ret != sizeof(id)) { 5743bb35261SJon Nettleton dev_err(sfp->dev, "EEPROM short read: %d\n", ret); 57573970055SRussell King return -EAGAIN; 57673970055SRussell King } 57773970055SRussell King 578981f1f80SRussell King /* Cotsworks do not seem to update the checksums when they 579981f1f80SRussell King * do the final programming with the final module part number, 580981f1f80SRussell King * serial number and date code. 581981f1f80SRussell King */ 582981f1f80SRussell King cotsworks = !memcmp(id.base.vendor_name, "COTSWORKS ", 16); 583981f1f80SRussell King 58473970055SRussell King /* Validate the checksum over the base structure */ 58573970055SRussell King check = sfp_check(&id.base, sizeof(id.base) - 1); 58673970055SRussell King if (check != id.base.cc_base) { 587981f1f80SRussell King if (cotsworks) { 588981f1f80SRussell King dev_warn(sfp->dev, 589981f1f80SRussell King "EEPROM base structure checksum failure (0x%02x != 0x%02x)\n", 590981f1f80SRussell King check, id.base.cc_base); 591981f1f80SRussell King } else { 59273970055SRussell King dev_err(sfp->dev, 593981f1f80SRussell King "EEPROM base structure checksum failure: 0x%02x != 0x%02x\n", 594981f1f80SRussell King check, id.base.cc_base); 59573970055SRussell King print_hex_dump(KERN_ERR, "sfp EE: ", DUMP_PREFIX_OFFSET, 596981f1f80SRussell King 16, 1, &id, sizeof(id), true); 59773970055SRussell King return -EINVAL; 59873970055SRussell King } 599981f1f80SRussell King } 60073970055SRussell King 60173970055SRussell King check = sfp_check(&id.ext, sizeof(id.ext) - 1); 60273970055SRussell King if (check != id.ext.cc_ext) { 603981f1f80SRussell King if (cotsworks) { 604981f1f80SRussell King dev_warn(sfp->dev, 605981f1f80SRussell King "EEPROM extended structure checksum failure (0x%02x != 0x%02x)\n", 606981f1f80SRussell King check, id.ext.cc_ext); 607981f1f80SRussell King } else { 60873970055SRussell King dev_err(sfp->dev, 609981f1f80SRussell King "EEPROM extended structure checksum failure: 0x%02x != 0x%02x\n", 610981f1f80SRussell King check, id.ext.cc_ext); 611981f1f80SRussell King print_hex_dump(KERN_ERR, "sfp EE: ", DUMP_PREFIX_OFFSET, 612981f1f80SRussell King 16, 1, &id, sizeof(id), true); 61373970055SRussell King memset(&id.ext, 0, sizeof(id.ext)); 61473970055SRussell King } 615981f1f80SRussell King } 61673970055SRussell King 61773970055SRussell King sfp->id = id; 61873970055SRussell King 619a2f247efSRussell King dev_info(sfp->dev, "module %.*s %.*s rev %.*s sn %.*s dc %.*s\n", 620a2f247efSRussell King (int)sizeof(id.base.vendor_name), id.base.vendor_name, 621a2f247efSRussell King (int)sizeof(id.base.vendor_pn), id.base.vendor_pn, 622a2f247efSRussell King (int)sizeof(id.base.vendor_rev), id.base.vendor_rev, 623a2f247efSRussell King (int)sizeof(id.ext.vendor_sn), id.ext.vendor_sn, 624a2f247efSRussell King (int)sizeof(id.ext.datecode), id.ext.datecode); 62573970055SRussell King 626259c8618SRussell King /* Check whether we support this module */ 627259c8618SRussell King if (!sfp->type->module_supported(&sfp->id)) { 628259c8618SRussell King dev_err(sfp->dev, 629259c8618SRussell King "module is not supported - phys id 0x%02x 0x%02x\n", 63073970055SRussell King sfp->id.base.phys_id, sfp->id.base.phys_ext_id); 63173970055SRussell King return -EINVAL; 63273970055SRussell King } 63373970055SRussell King 634ec7681bdSRussell King /* If the module requires address swap mode, warn about it */ 635ec7681bdSRussell King if (sfp->id.ext.diagmon & SFP_DIAGMON_ADDRMODE) 636ec7681bdSRussell King dev_warn(sfp->dev, 637ec7681bdSRussell King "module address swap to access page 0xA2 is not supported.\n"); 638ec7681bdSRussell King 6393bb35261SJon Nettleton ret = sfp_module_insert(sfp->sfp_bus, &sfp->id); 6403bb35261SJon Nettleton if (ret < 0) 6413bb35261SJon Nettleton return ret; 6423bb35261SJon Nettleton 6433bb35261SJon Nettleton return sfp_sm_mod_hpower(sfp); 64473970055SRussell King } 64573970055SRussell King 64673970055SRussell King static void sfp_sm_mod_remove(struct sfp *sfp) 64773970055SRussell King { 64873970055SRussell King sfp_module_remove(sfp->sfp_bus); 64973970055SRussell King 65073970055SRussell King if (sfp->mod_phy) 65173970055SRussell King sfp_sm_phy_detach(sfp); 65273970055SRussell King 65373970055SRussell King sfp_module_tx_disable(sfp); 65473970055SRussell King 65573970055SRussell King memset(&sfp->id, 0, sizeof(sfp->id)); 65673970055SRussell King 65773970055SRussell King dev_info(sfp->dev, "module removed\n"); 65873970055SRussell King } 65973970055SRussell King 66073970055SRussell King static void sfp_sm_event(struct sfp *sfp, unsigned int event) 66173970055SRussell King { 66273970055SRussell King mutex_lock(&sfp->sm_mutex); 66373970055SRussell King 66473970055SRussell King dev_dbg(sfp->dev, "SM: enter %u:%u:%u event %u\n", 66573970055SRussell King sfp->sm_mod_state, sfp->sm_dev_state, sfp->sm_state, event); 66673970055SRussell King 66773970055SRussell King /* This state machine tracks the insert/remove state of 66873970055SRussell King * the module, and handles probing the on-board EEPROM. 66973970055SRussell King */ 67073970055SRussell King switch (sfp->sm_mod_state) { 67173970055SRussell King default: 67273970055SRussell King if (event == SFP_E_INSERT) { 67373970055SRussell King sfp_module_tx_disable(sfp); 67473970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_PROBE, T_PROBE_INIT); 67573970055SRussell King } 67673970055SRussell King break; 67773970055SRussell King 67873970055SRussell King case SFP_MOD_PROBE: 67973970055SRussell King if (event == SFP_E_REMOVE) { 68073970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_EMPTY, 0); 68173970055SRussell King } else if (event == SFP_E_TIMEOUT) { 6823bb35261SJon Nettleton int val = sfp_sm_mod_probe(sfp); 68373970055SRussell King 6843bb35261SJon Nettleton if (val == 0) 68573970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_PRESENT, 0); 6863bb35261SJon Nettleton else if (val > 0) 6873bb35261SJon Nettleton sfp_sm_ins_next(sfp, SFP_MOD_HPOWER, val); 6883bb35261SJon Nettleton else if (val != -EAGAIN) 68973970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_ERROR, 0); 6903bb35261SJon Nettleton else 6913bb35261SJon Nettleton sfp_sm_set_timer(sfp, T_PROBE_RETRY); 69273970055SRussell King } 69373970055SRussell King break; 69473970055SRussell King 6953bb35261SJon Nettleton case SFP_MOD_HPOWER: 6963bb35261SJon Nettleton if (event == SFP_E_TIMEOUT) { 6973bb35261SJon Nettleton sfp_sm_ins_next(sfp, SFP_MOD_PRESENT, 0); 6983bb35261SJon Nettleton break; 6993bb35261SJon Nettleton } 7003bb35261SJon Nettleton /* fallthrough */ 70173970055SRussell King case SFP_MOD_PRESENT: 70273970055SRussell King case SFP_MOD_ERROR: 70373970055SRussell King if (event == SFP_E_REMOVE) { 70473970055SRussell King sfp_sm_mod_remove(sfp); 70573970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_EMPTY, 0); 70673970055SRussell King } 70773970055SRussell King break; 70873970055SRussell King } 70973970055SRussell King 71073970055SRussell King /* This state machine tracks the netdev up/down state */ 71173970055SRussell King switch (sfp->sm_dev_state) { 71273970055SRussell King default: 71373970055SRussell King if (event == SFP_E_DEV_UP) 71473970055SRussell King sfp->sm_dev_state = SFP_DEV_UP; 71573970055SRussell King break; 71673970055SRussell King 71773970055SRussell King case SFP_DEV_UP: 71873970055SRussell King if (event == SFP_E_DEV_DOWN) { 71973970055SRussell King /* If the module has a PHY, avoid raising TX disable 72073970055SRussell King * as this resets the PHY. Otherwise, raise it to 72173970055SRussell King * turn the laser off. 72273970055SRussell King */ 72373970055SRussell King if (!sfp->mod_phy) 72473970055SRussell King sfp_module_tx_disable(sfp); 72573970055SRussell King sfp->sm_dev_state = SFP_DEV_DOWN; 72673970055SRussell King } 72773970055SRussell King break; 72873970055SRussell King } 72973970055SRussell King 73073970055SRussell King /* Some events are global */ 73173970055SRussell King if (sfp->sm_state != SFP_S_DOWN && 73273970055SRussell King (sfp->sm_mod_state != SFP_MOD_PRESENT || 73373970055SRussell King sfp->sm_dev_state != SFP_DEV_UP)) { 73473970055SRussell King if (sfp->sm_state == SFP_S_LINK_UP && 73573970055SRussell King sfp->sm_dev_state == SFP_DEV_UP) 73673970055SRussell King sfp_sm_link_down(sfp); 73773970055SRussell King if (sfp->mod_phy) 73873970055SRussell King sfp_sm_phy_detach(sfp); 73973970055SRussell King sfp_sm_next(sfp, SFP_S_DOWN, 0); 74073970055SRussell King mutex_unlock(&sfp->sm_mutex); 74173970055SRussell King return; 74273970055SRussell King } 74373970055SRussell King 74473970055SRussell King /* The main state machine */ 74573970055SRussell King switch (sfp->sm_state) { 74673970055SRussell King case SFP_S_DOWN: 74773970055SRussell King if (sfp->sm_mod_state == SFP_MOD_PRESENT && 74873970055SRussell King sfp->sm_dev_state == SFP_DEV_UP) 74973970055SRussell King sfp_sm_mod_init(sfp); 75073970055SRussell King break; 75173970055SRussell King 75273970055SRussell King case SFP_S_INIT: 75373970055SRussell King if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) 75473970055SRussell King sfp_sm_fault(sfp, true); 75573970055SRussell King else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) 75673970055SRussell King sfp_sm_link_check_los(sfp); 75773970055SRussell King break; 75873970055SRussell King 75973970055SRussell King case SFP_S_WAIT_LOS: 76073970055SRussell King if (event == SFP_E_TX_FAULT) 76173970055SRussell King sfp_sm_fault(sfp, true); 762710dfbb0SRussell King else if (sfp_los_event_inactive(sfp, event)) 76373970055SRussell King sfp_sm_link_up(sfp); 76473970055SRussell King break; 76573970055SRussell King 76673970055SRussell King case SFP_S_LINK_UP: 76773970055SRussell King if (event == SFP_E_TX_FAULT) { 76873970055SRussell King sfp_sm_link_down(sfp); 76973970055SRussell King sfp_sm_fault(sfp, true); 770710dfbb0SRussell King } else if (sfp_los_event_active(sfp, event)) { 77173970055SRussell King sfp_sm_link_down(sfp); 77273970055SRussell King sfp_sm_next(sfp, SFP_S_WAIT_LOS, 0); 77373970055SRussell King } 77473970055SRussell King break; 77573970055SRussell King 77673970055SRussell King case SFP_S_TX_FAULT: 77773970055SRussell King if (event == SFP_E_TIMEOUT) { 77873970055SRussell King sfp_module_tx_fault_reset(sfp); 77973970055SRussell King sfp_sm_next(sfp, SFP_S_REINIT, T_INIT_JIFFIES); 78073970055SRussell King } 78173970055SRussell King break; 78273970055SRussell King 78373970055SRussell King case SFP_S_REINIT: 78473970055SRussell King if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) { 78573970055SRussell King sfp_sm_fault(sfp, false); 78673970055SRussell King } else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) { 78773970055SRussell King dev_info(sfp->dev, "module transmit fault recovered\n"); 78873970055SRussell King sfp_sm_link_check_los(sfp); 78973970055SRussell King } 79073970055SRussell King break; 79173970055SRussell King 79273970055SRussell King case SFP_S_TX_DISABLE: 79373970055SRussell King break; 79473970055SRussell King } 79573970055SRussell King 79673970055SRussell King dev_dbg(sfp->dev, "SM: exit %u:%u:%u\n", 79773970055SRussell King sfp->sm_mod_state, sfp->sm_dev_state, sfp->sm_state); 79873970055SRussell King 79973970055SRussell King mutex_unlock(&sfp->sm_mutex); 80073970055SRussell King } 80173970055SRussell King 80273970055SRussell King static void sfp_start(struct sfp *sfp) 80373970055SRussell King { 80473970055SRussell King sfp_sm_event(sfp, SFP_E_DEV_UP); 80573970055SRussell King } 80673970055SRussell King 80773970055SRussell King static void sfp_stop(struct sfp *sfp) 80873970055SRussell King { 80973970055SRussell King sfp_sm_event(sfp, SFP_E_DEV_DOWN); 81073970055SRussell King } 81173970055SRussell King 81273970055SRussell King static int sfp_module_info(struct sfp *sfp, struct ethtool_modinfo *modinfo) 81373970055SRussell King { 81473970055SRussell King /* locking... and check module is present */ 81573970055SRussell King 816ec7681bdSRussell King if (sfp->id.ext.sff8472_compliance && 817ec7681bdSRussell King !(sfp->id.ext.diagmon & SFP_DIAGMON_ADDRMODE)) { 81873970055SRussell King modinfo->type = ETH_MODULE_SFF_8472; 81973970055SRussell King modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; 82073970055SRussell King } else { 82173970055SRussell King modinfo->type = ETH_MODULE_SFF_8079; 82273970055SRussell King modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN; 82373970055SRussell King } 82473970055SRussell King return 0; 82573970055SRussell King } 82673970055SRussell King 82773970055SRussell King static int sfp_module_eeprom(struct sfp *sfp, struct ethtool_eeprom *ee, 82873970055SRussell King u8 *data) 82973970055SRussell King { 83073970055SRussell King unsigned int first, last, len; 83173970055SRussell King int ret; 83273970055SRussell King 83373970055SRussell King if (ee->len == 0) 83473970055SRussell King return -EINVAL; 83573970055SRussell King 83673970055SRussell King first = ee->offset; 83773970055SRussell King last = ee->offset + ee->len; 83873970055SRussell King if (first < ETH_MODULE_SFF_8079_LEN) { 83973970055SRussell King len = min_t(unsigned int, last, ETH_MODULE_SFF_8079_LEN); 84073970055SRussell King len -= first; 84173970055SRussell King 8422794ffc4SRussell King ret = sfp_read(sfp, false, first, data, len); 84373970055SRussell King if (ret < 0) 84473970055SRussell King return ret; 84573970055SRussell King 84673970055SRussell King first += len; 84773970055SRussell King data += len; 84873970055SRussell King } 8492794ffc4SRussell King if (first < ETH_MODULE_SFF_8472_LEN && last > ETH_MODULE_SFF_8079_LEN) { 85073970055SRussell King len = min_t(unsigned int, last, ETH_MODULE_SFF_8472_LEN); 85173970055SRussell King len -= first; 85273970055SRussell King first -= ETH_MODULE_SFF_8079_LEN; 85373970055SRussell King 8542794ffc4SRussell King ret = sfp_read(sfp, true, first, data, len); 85573970055SRussell King if (ret < 0) 85673970055SRussell King return ret; 85773970055SRussell King } 85873970055SRussell King return 0; 85973970055SRussell King } 86073970055SRussell King 86173970055SRussell King static const struct sfp_socket_ops sfp_module_ops = { 86273970055SRussell King .start = sfp_start, 86373970055SRussell King .stop = sfp_stop, 86473970055SRussell King .module_info = sfp_module_info, 86573970055SRussell King .module_eeprom = sfp_module_eeprom, 86673970055SRussell King }; 86773970055SRussell King 86873970055SRussell King static void sfp_timeout(struct work_struct *work) 86973970055SRussell King { 87073970055SRussell King struct sfp *sfp = container_of(work, struct sfp, timeout.work); 87173970055SRussell King 87273970055SRussell King rtnl_lock(); 87373970055SRussell King sfp_sm_event(sfp, SFP_E_TIMEOUT); 87473970055SRussell King rtnl_unlock(); 87573970055SRussell King } 87673970055SRussell King 87773970055SRussell King static void sfp_check_state(struct sfp *sfp) 87873970055SRussell King { 87973970055SRussell King unsigned int state, i, changed; 88073970055SRussell King 88173970055SRussell King state = sfp_get_state(sfp); 88273970055SRussell King changed = state ^ sfp->state; 88373970055SRussell King changed &= SFP_F_PRESENT | SFP_F_LOS | SFP_F_TX_FAULT; 88473970055SRussell King 88573970055SRussell King for (i = 0; i < GPIO_MAX; i++) 88673970055SRussell King if (changed & BIT(i)) 88773970055SRussell King dev_dbg(sfp->dev, "%s %u -> %u\n", gpio_of_names[i], 88873970055SRussell King !!(sfp->state & BIT(i)), !!(state & BIT(i))); 88973970055SRussell King 89073970055SRussell King state |= sfp->state & (SFP_F_TX_DISABLE | SFP_F_RATE_SELECT); 89173970055SRussell King sfp->state = state; 89273970055SRussell King 89373970055SRussell King rtnl_lock(); 89473970055SRussell King if (changed & SFP_F_PRESENT) 89573970055SRussell King sfp_sm_event(sfp, state & SFP_F_PRESENT ? 89673970055SRussell King SFP_E_INSERT : SFP_E_REMOVE); 89773970055SRussell King 89873970055SRussell King if (changed & SFP_F_TX_FAULT) 89973970055SRussell King sfp_sm_event(sfp, state & SFP_F_TX_FAULT ? 90073970055SRussell King SFP_E_TX_FAULT : SFP_E_TX_CLEAR); 90173970055SRussell King 90273970055SRussell King if (changed & SFP_F_LOS) 90373970055SRussell King sfp_sm_event(sfp, state & SFP_F_LOS ? 90473970055SRussell King SFP_E_LOS_HIGH : SFP_E_LOS_LOW); 90573970055SRussell King rtnl_unlock(); 90673970055SRussell King } 90773970055SRussell King 90873970055SRussell King static irqreturn_t sfp_irq(int irq, void *data) 90973970055SRussell King { 91073970055SRussell King struct sfp *sfp = data; 91173970055SRussell King 91273970055SRussell King sfp_check_state(sfp); 91373970055SRussell King 91473970055SRussell King return IRQ_HANDLED; 91573970055SRussell King } 91673970055SRussell King 91773970055SRussell King static void sfp_poll(struct work_struct *work) 91873970055SRussell King { 91973970055SRussell King struct sfp *sfp = container_of(work, struct sfp, poll.work); 92073970055SRussell King 92173970055SRussell King sfp_check_state(sfp); 92273970055SRussell King mod_delayed_work(system_wq, &sfp->poll, poll_jiffies); 92373970055SRussell King } 92473970055SRussell King 92573970055SRussell King static struct sfp *sfp_alloc(struct device *dev) 92673970055SRussell King { 92773970055SRussell King struct sfp *sfp; 92873970055SRussell King 92973970055SRussell King sfp = kzalloc(sizeof(*sfp), GFP_KERNEL); 93073970055SRussell King if (!sfp) 93173970055SRussell King return ERR_PTR(-ENOMEM); 93273970055SRussell King 93373970055SRussell King sfp->dev = dev; 93473970055SRussell King 93573970055SRussell King mutex_init(&sfp->sm_mutex); 93673970055SRussell King INIT_DELAYED_WORK(&sfp->poll, sfp_poll); 93773970055SRussell King INIT_DELAYED_WORK(&sfp->timeout, sfp_timeout); 93873970055SRussell King 93973970055SRussell King return sfp; 94073970055SRussell King } 94173970055SRussell King 94273970055SRussell King static void sfp_cleanup(void *data) 94373970055SRussell King { 94473970055SRussell King struct sfp *sfp = data; 94573970055SRussell King 94673970055SRussell King cancel_delayed_work_sync(&sfp->poll); 94773970055SRussell King cancel_delayed_work_sync(&sfp->timeout); 94873970055SRussell King if (sfp->i2c_mii) { 94973970055SRussell King mdiobus_unregister(sfp->i2c_mii); 95073970055SRussell King mdiobus_free(sfp->i2c_mii); 95173970055SRussell King } 95273970055SRussell King if (sfp->i2c) 95373970055SRussell King i2c_put_adapter(sfp->i2c); 95473970055SRussell King kfree(sfp); 95573970055SRussell King } 95673970055SRussell King 95773970055SRussell King static int sfp_probe(struct platform_device *pdev) 95873970055SRussell King { 959259c8618SRussell King const struct sff_data *sff; 96073970055SRussell King struct sfp *sfp; 96173970055SRussell King bool poll = false; 96273970055SRussell King int irq, err, i; 96373970055SRussell King 96473970055SRussell King sfp = sfp_alloc(&pdev->dev); 96573970055SRussell King if (IS_ERR(sfp)) 96673970055SRussell King return PTR_ERR(sfp); 96773970055SRussell King 96873970055SRussell King platform_set_drvdata(pdev, sfp); 96973970055SRussell King 97073970055SRussell King err = devm_add_action(sfp->dev, sfp_cleanup, sfp); 97173970055SRussell King if (err < 0) 97273970055SRussell King return err; 97373970055SRussell King 974259c8618SRussell King sff = sfp->type = &sfp_data; 975259c8618SRussell King 97673970055SRussell King if (pdev->dev.of_node) { 97773970055SRussell King struct device_node *node = pdev->dev.of_node; 978259c8618SRussell King const struct of_device_id *id; 97973970055SRussell King struct device_node *np; 98073970055SRussell King 981259c8618SRussell King id = of_match_node(sfp_of_match, node); 982259c8618SRussell King if (WARN_ON(!id)) 983259c8618SRussell King return -EINVAL; 984259c8618SRussell King 985259c8618SRussell King sff = sfp->type = id->data; 986259c8618SRussell King 98773970055SRussell King np = of_parse_phandle(node, "i2c-bus", 0); 98873970055SRussell King if (np) { 98973970055SRussell King struct i2c_adapter *i2c; 99073970055SRussell King 99173970055SRussell King i2c = of_find_i2c_adapter_by_node(np); 99273970055SRussell King of_node_put(np); 99373970055SRussell King if (!i2c) 99473970055SRussell King return -EPROBE_DEFER; 99573970055SRussell King 99673970055SRussell King err = sfp_i2c_configure(sfp, i2c); 99773970055SRussell King if (err < 0) { 99873970055SRussell King i2c_put_adapter(i2c); 99973970055SRussell King return err; 100073970055SRussell King } 100173970055SRussell King } 1002259c8618SRussell King } 100373970055SRussell King 1004259c8618SRussell King for (i = 0; i < GPIO_MAX; i++) 1005259c8618SRussell King if (sff->gpios & BIT(i)) { 100673970055SRussell King sfp->gpio[i] = devm_gpiod_get_optional(sfp->dev, 100773970055SRussell King gpio_of_names[i], gpio_flags[i]); 100873970055SRussell King if (IS_ERR(sfp->gpio[i])) 100973970055SRussell King return PTR_ERR(sfp->gpio[i]); 101073970055SRussell King } 101173970055SRussell King 101273970055SRussell King sfp->get_state = sfp_gpio_get_state; 101373970055SRussell King sfp->set_state = sfp_gpio_set_state; 1014259c8618SRussell King 1015259c8618SRussell King /* Modules that have no detect signal are always present */ 1016259c8618SRussell King if (!(sfp->gpio[GPIO_MODDEF0])) 1017259c8618SRussell King sfp->get_state = sff_gpio_get_state; 101873970055SRussell King 10193bb35261SJon Nettleton device_property_read_u32(&pdev->dev, "maximum-power-milliwatt", 10203bb35261SJon Nettleton &sfp->max_power_mW); 10213bb35261SJon Nettleton if (!sfp->max_power_mW) 10223bb35261SJon Nettleton sfp->max_power_mW = 1000; 10233bb35261SJon Nettleton 10243bb35261SJon Nettleton dev_info(sfp->dev, "Host maximum power %u.%uW\n", 10253bb35261SJon Nettleton sfp->max_power_mW / 1000, (sfp->max_power_mW / 100) % 10); 10263bb35261SJon Nettleton 102773970055SRussell King sfp->sfp_bus = sfp_register_socket(sfp->dev, sfp, &sfp_module_ops); 102873970055SRussell King if (!sfp->sfp_bus) 102973970055SRussell King return -ENOMEM; 103073970055SRussell King 103173970055SRussell King /* Get the initial state, and always signal TX disable, 103273970055SRussell King * since the network interface will not be up. 103373970055SRussell King */ 103473970055SRussell King sfp->state = sfp_get_state(sfp) | SFP_F_TX_DISABLE; 103573970055SRussell King 103673970055SRussell King if (sfp->gpio[GPIO_RATE_SELECT] && 103773970055SRussell King gpiod_get_value_cansleep(sfp->gpio[GPIO_RATE_SELECT])) 103873970055SRussell King sfp->state |= SFP_F_RATE_SELECT; 103973970055SRussell King sfp_set_state(sfp, sfp->state); 104073970055SRussell King sfp_module_tx_disable(sfp); 104173970055SRussell King rtnl_lock(); 104273970055SRussell King if (sfp->state & SFP_F_PRESENT) 104373970055SRussell King sfp_sm_event(sfp, SFP_E_INSERT); 104473970055SRussell King rtnl_unlock(); 104573970055SRussell King 104673970055SRussell King for (i = 0; i < GPIO_MAX; i++) { 104773970055SRussell King if (gpio_flags[i] != GPIOD_IN || !sfp->gpio[i]) 104873970055SRussell King continue; 104973970055SRussell King 105073970055SRussell King irq = gpiod_to_irq(sfp->gpio[i]); 105173970055SRussell King if (!irq) { 105273970055SRussell King poll = true; 105373970055SRussell King continue; 105473970055SRussell King } 105573970055SRussell King 105673970055SRussell King err = devm_request_threaded_irq(sfp->dev, irq, NULL, sfp_irq, 105773970055SRussell King IRQF_ONESHOT | 105873970055SRussell King IRQF_TRIGGER_RISING | 105973970055SRussell King IRQF_TRIGGER_FALLING, 106073970055SRussell King dev_name(sfp->dev), sfp); 106173970055SRussell King if (err) 106273970055SRussell King poll = true; 106373970055SRussell King } 106473970055SRussell King 106573970055SRussell King if (poll) 106673970055SRussell King mod_delayed_work(system_wq, &sfp->poll, poll_jiffies); 106773970055SRussell King 106873970055SRussell King return 0; 106973970055SRussell King } 107073970055SRussell King 107173970055SRussell King static int sfp_remove(struct platform_device *pdev) 107273970055SRussell King { 107373970055SRussell King struct sfp *sfp = platform_get_drvdata(pdev); 107473970055SRussell King 107573970055SRussell King sfp_unregister_socket(sfp->sfp_bus); 107673970055SRussell King 107773970055SRussell King return 0; 107873970055SRussell King } 107973970055SRussell King 108073970055SRussell King static struct platform_driver sfp_driver = { 108173970055SRussell King .probe = sfp_probe, 108273970055SRussell King .remove = sfp_remove, 108373970055SRussell King .driver = { 108473970055SRussell King .name = "sfp", 108573970055SRussell King .of_match_table = sfp_of_match, 108673970055SRussell King }, 108773970055SRussell King }; 108873970055SRussell King 108973970055SRussell King static int sfp_init(void) 109073970055SRussell King { 109173970055SRussell King poll_jiffies = msecs_to_jiffies(100); 109273970055SRussell King 109373970055SRussell King return platform_driver_register(&sfp_driver); 109473970055SRussell King } 109573970055SRussell King module_init(sfp_init); 109673970055SRussell King 109773970055SRussell King static void sfp_exit(void) 109873970055SRussell King { 109973970055SRussell King platform_driver_unregister(&sfp_driver); 110073970055SRussell King } 110173970055SRussell King module_exit(sfp_exit); 110273970055SRussell King 110373970055SRussell King MODULE_ALIAS("platform:sfp"); 110473970055SRussell King MODULE_AUTHOR("Russell King"); 110573970055SRussell King MODULE_LICENSE("GPL v2"); 1106