01 Nov, 2008

1 commit

  • Add of software-based sanity to rfkill and rfkill-input so that it can
    reproduce what hardware-based EPO switches do, blocking all transmitters
    and locking down any further attempts to unblock them until the switch is
    deactivated.

    rfkill-input is responsible for issuing the EPO control requests, like
    before.

    While an rfkill EPO is active, all transmitters are locked to one of the
    BLOCKED states and all attempts to change that through the rfkill API
    (userspace and kernel) will be either ignored or return -EPERM errors.

    The lock will be released upon receipt of EV_SW SW_RFKILL_ALL ON by
    rfkill-input, or should modular rfkill-input be unloaded.

    This makes rfkill and rfkill-input extend the operation of an existing
    wireless master kill switch to all wireless devices in the system, even
    those that are not under hardware or firmware control.

    Since the above is the expected operational behavior for the master rfkill
    switch, the EPO lock functionality is not optional.

    Also, extend rfkill-input to allow for three different behaviors when it
    receives an EV_SW SW_RFKILL_ALL ON input event. The user can set which
    behavior he wants through the master_switch_mode parameter:

    master_switch_mode = 0: EV_SW SW_RFKILL_ALL ON just unlocks rfkill
    controller state changes (so that the rfkill userspace and kernel APIs can
    now be used to change rfkill controller states again), but doesn't change
    any of their states (so they will all remain blocked). This is the safest
    mode of operation, as it requires explicit operator action to re-enable a
    transmitter.

    master_switch_mode = 1: EV_SW SW_RFKILL_ALL ON causes rfkill-input to
    attempt to restore the system to the state before the last EV_SW
    SW_RFKILL_ALL OFF event, or to the default global states if no EV_SW
    SW_RFKILL_ALL OFF ever happened. This is the recommended mode of
    operation for laptops.

    master_switch_mode = 2: tries to unblock all rfkill controllers (i.e.
    enable all transmitters) when an EV_SW SW_RFKILL_ALL ON event is received.
    This is the default mode of operation, as it mimics the previous behavior
    of rfkill-input.

    In order to implement these features in a clean way, the entire event
    handling of rfkill-input was refactored into a single worker function.

    Protection against input event DoS (repeatedly firing rfkill events for
    rfkill-input to process) was removed during the code refactoring. It will
    be added back in a future patch.

    Note that with these changes, rfkill-input doesn't need to explicitly
    handle any radio types for which KEY_ or SW_ events
    do not exist yet.

    Code to handle EV_SW SW_{WLAN,WWAN,BLUETOOTH,WIMAX,...} was added as it
    might be needed in the future (and its implementation is not that obvious),
    but is currently #ifdef'd out to avoid wasting resources.

    Signed-off-by: Henrique de Moraes Holschuh
    Cc: Ivo van Doorn
    Cc: Dmitry Torokhov
    Signed-off-by: John W. Linville

    Henrique de Moraes Holschuh
     

16 Sep, 2008

1 commit

  • Currently, rfkill would stand in the way of properly supporting wireless
    devices that are capable of waking the system up from sleep or hibernation
    when they receive a special wireless message. It would also get in the way
    of mesh devices that need to remain operational even during platform
    suspend.

    To avoid that, stop trying to block the transmitters on the rfkill class
    suspend handler.

    Drivers that need rfkill's older behaviour will have to implement it by
    themselves in their own suspend handling.

    Do note that rfkill *will* attempt to restore the transmitter state on
    resume in any situation. This happens after the driver's resume method is
    called by the suspend core (class devices resume after the devices they are
    attached to have been resumed).

    The following drivers need to check if they need to explicitly block
    their transmitters in their own suspend handlers (maintainers Cc'd):
    arch/arm/mach-pxa/tosa-bt.c
    drivers/net/usb/hso.c
    drivers/net/wireless/rt2x00/* (USB might need it?)
    drivers/net/wireless/b43/ (SSB over USB might need it?)
    drivers/misc/hp-wmi.c
    eeepc-laptop w/rfkill support (not in mainline yet)
    Compal laptop w/rfkill support (not in mainline yet)
    toshiba-acpi w/rfkill support (not in mainline yet)

    Signed-off-by: Henrique de Moraes Holschuh
    Cc: Ivo van Doorn
    Cc: Matthew Garrett
    Cc: Andrew Bird
    Cc: Greg Kroah-Hartman
    Cc: Cezary Jackiewicz
    Cc: Philip Langdale
    Signed-off-by: John W. Linville

    Henrique de Moraes Holschuh
     

18 Aug, 2008

1 commit


30 Jul, 2008

1 commit


27 Jun, 2008

4 commits

  • Improve the documentation of how to use the rfkill class in kernel drivers,
    based on the doubts that came up in a thread in linux-wireless.

    Signed-off-by: Henrique de Moraes Holschuh
    Acked-by: Ivo van Doorn
    Signed-off-by: John W. Linville

    Henrique de Moraes Holschuh
     
  • The current naming of rfkill_state causes a lot of confusion: not only the
    "kill" in rfkill suggests negative logic, but also the fact that rfkill cannot
    turn anything on (it can just force something off or stop forcing something
    off) is often forgotten.

    Rename RFKILL_STATE_OFF to RFKILL_STATE_SOFT_BLOCKED (transmitter is blocked
    and will not operate; state can be changed by a toggle_radio request), and
    RFKILL_STATE_ON to RFKILL_STATE_UNBLOCKED (transmitter is not blocked, and may
    operate).

    Also, add a new third state, RFKILL_STATE_HARD_BLOCKED (transmitter is blocked
    and will not operate; state cannot be changed through a toggle_radio request),
    which is used by drivers to indicate a wireless transmiter was blocked by a
    hardware rfkill line that accepts no overrides.

    Keep the old names as #defines, but document them as deprecated. This way,
    drivers can be converted to the new names *and* verified to actually use rfkill
    correctly one by one.

    Signed-off-by: Henrique de Moraes Holschuh
    Acked-by: Ivo van Doorn
    Signed-off-by: John W. Linville

    Henrique de Moraes Holschuh
     
  • Rework the documentation so as to make sure driver writers understand
    exactly where the boundaries are for input drivers related to rfkill
    switches, buttons and keys, and rfkill class drivers.

    Also fix a small error in the documentation: setting the state of a normal
    instance of the rfkill class does not affect the state of any other devices
    (unless they are tied by firmware/hardware somehow).

    Signed-off-by: Henrique de Moraes Holschuh
    Acked-by: Ivo van Doorn
    Cc: Dmitry Torokhov
    Signed-off-by: John W. Linville

    Henrique de Moraes Holschuh
     
  • rfkill really should have been named rfswitch. As it is, one can get
    confused whether RFKILL_STATE_ON means the KILL switch is on (and
    therefore, the radio is being *blocked* from operating), or whether it
    means the RADIO rf output is on.

    Clearly state that RFKILL_STATE_ON means the radio is *unblocked* from
    operating (i.e. there is no rf killing going on).

    Signed-off-by: Henrique de Moraes Holschuh
    Acked-by: Ivo van Doorn
    Cc: Dmitry Torokhov
    Signed-off-by: John W. Linville

    Henrique de Moraes Holschuh
     

11 Oct, 2007

1 commit

  • Add a documentation file which contains
    a short description about rfkill with some
    notes about drivers and the userspace interface.

    Changes since v1 and v2:
    - Spellchecking

    Signed-off-by: Ivo van Doorn
    Acked-by: Dmitry Torokhov
    Acked-by: Randy Dunlap

    Ivo van Doorn