• Jon Nettleton's avatar
    sfp: add high power module support · 3bb35261
    Jon Nettleton authored
    This patch is the result of work by both Jon Nettleton and Russell King.
    Jon wrote the original patch, adding support for SFP modules which
    require a power level greater than '1'.
    
    Russell's changes:
    - Fix the power levels for big-endian, and make the code flow better.
    - Convert to use device_property_read_u8()
    - Warn for power levels exceeding host level
      SFF-8431 says:
    
      "To avoid exceeding system power supply limits and cooling capacity,
       all modules at power up by default shall operate with up to 1.0 W.
       Hosts supporting Power Level II or III operation may enable a Power
       Level II or III module through the 2-wire interface. Power Level II
       or III modules shall assert the power level declaration bit of
       SFF-8472."
    
      Print a warning for modules that exceed the host power level, and
      leave them operating in power level 1.
    
    - Fix i2c write
      The first byte of any write after the bus address is always the
      device address.  In order to write a value to device D, address I,
      value V, we need to generate on the bus:
    
        S DDDDDDDD A IIIIIIII A VVVVVVVV A P
    
      where S = start, R = restart, A = ack, P = stop.  Splitting this
      as two:
    
        S DDDDDDDD A IIIIIIII A R DDDDDDDD A VVVVVVVV A P
    
      results in the device's address register being written first by I
      and then by V - the addressed register within the device is not
      written.
    
    - Avoid power mode switching if 0xa2 is not implemented
      Some modules indicate that they support power level II or power level
      III, but do not implement address 0xa2, meaning that the bit to set
      them to high power mode is not accessible.
    
      These modules appear to have the sff8472_compliance field set to zero,
      and also do not implement diagnostics.  Detect this, but also ensure
      that the module does not require the address switching mode, which we
      do not implement.
    
    - Use mW for power level rather than power level number.
    
    - Fix high power mode transition
      We must not switch to SFP_MOD_PRESENT state until we have finished
      initialising, because the remaining state machines check for that
      state.  Add SFP_MOD_HPOWER as an intermediate state.
    
    - Use definition for I2C register address rather than constant.
    Signed-off-by: default avatarJon Nettleton <jon@solid-run.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    3bb35261
sfp.c 24.7 KB