source: branches/backfire/package/mac80211/patches/510-ath9k_led_cleanup.patch @ 24505

Last change on this file since 24505 was 24505, checked in by nbd, 5 years ago

backport mac80211 and iw from trunk

File size: 8.4 KB
  • drivers/net/wireless/ath/ath9k/ath9k.h

    a b void ath9k_btcoex_timer_pause(struct ath 
    438438 
    439439#define ATH_LED_PIN_DEF                 1 
    440440#define ATH_LED_PIN_9287                8 
    441 #define ATH_LED_ON_DURATION_IDLE        350     /* in msecs */ 
    442 #define ATH_LED_OFF_DURATION_IDLE       250     /* in msecs */ 
    443  
    444 enum ath_led_type { 
    445         ATH_LED_RADIO, 
    446         ATH_LED_ASSOC, 
    447         ATH_LED_TX, 
    448         ATH_LED_RX 
    449 }; 
    450  
    451 struct ath_led { 
    452         struct ath_softc *sc; 
    453         struct led_classdev led_cdev; 
    454         enum ath_led_type led_type; 
    455         char name[32]; 
    456         bool registered; 
    457 }; 
    458441 
     442#ifdef CONFIG_MAC80211_LEDS 
    459443void ath_init_leds(struct ath_softc *sc); 
    460444void ath_deinit_leds(struct ath_softc *sc); 
     445#else 
     446static inline void ath_init_leds(struct ath_softc *sc) 
     447{ 
     448} 
     449 
     450static inline void ath_deinit_leds(struct ath_softc *sc) 
     451{ 
     452} 
     453#endif 
     454 
    461455 
    462456/* Antenna diversity/combining */ 
    463457#define ATH_ANT_RX_CURRENT_SHIFT 4 
    struct ath_softc { 
    608602        struct ath_beacon beacon; 
    609603        struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; 
    610604 
    611         struct ath_led radio_led; 
    612         struct ath_led assoc_led; 
    613         struct ath_led tx_led; 
    614         struct ath_led rx_led; 
    615         struct delayed_work ath_led_blink_work; 
    616         int led_on_duration; 
    617         int led_off_duration; 
    618         int led_on_cnt; 
    619         int led_off_cnt; 
     605#ifdef CONFIG_MAC80211_LEDS 
     606        bool led_registered; 
     607        char led_name[32]; 
     608        struct led_classdev led_cdev; 
     609#endif 
    620610 
    621611        int beacon_interval; 
    622612 
  • drivers/net/wireless/ath/ath9k/gpio.c

    a b  
    2020/*       LED functions          */ 
    2121/********************************/ 
    2222 
    23 static void ath_led_blink_work(struct work_struct *work) 
    24 { 
    25         struct ath_softc *sc = container_of(work, struct ath_softc, 
    26                                             ath_led_blink_work.work); 
    27  
    28         if (!(sc->sc_flags & SC_OP_LED_ASSOCIATED)) 
    29                 return; 
    30  
    31         if ((sc->led_on_duration == ATH_LED_ON_DURATION_IDLE) || 
    32             (sc->led_off_duration == ATH_LED_OFF_DURATION_IDLE)) 
    33                 ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 0); 
    34         else 
    35                 ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 
    36                                   (sc->sc_flags & SC_OP_LED_ON) ? 1 : 0); 
    37  
    38         ieee80211_queue_delayed_work(sc->hw, 
    39                                      &sc->ath_led_blink_work, 
    40                                      (sc->sc_flags & SC_OP_LED_ON) ? 
    41                                         msecs_to_jiffies(sc->led_off_duration) : 
    42                                         msecs_to_jiffies(sc->led_on_duration)); 
    43  
    44         sc->led_on_duration = sc->led_on_cnt ? 
    45                         max((ATH_LED_ON_DURATION_IDLE - sc->led_on_cnt), 25) : 
    46                         ATH_LED_ON_DURATION_IDLE; 
    47         sc->led_off_duration = sc->led_off_cnt ? 
    48                         max((ATH_LED_OFF_DURATION_IDLE - sc->led_off_cnt), 10) : 
    49                         ATH_LED_OFF_DURATION_IDLE; 
    50         sc->led_on_cnt = sc->led_off_cnt = 0; 
    51         if (sc->sc_flags & SC_OP_LED_ON) 
    52                 sc->sc_flags &= ~SC_OP_LED_ON; 
    53         else 
    54                 sc->sc_flags |= SC_OP_LED_ON; 
    55 } 
    56  
     23#ifdef CONFIG_MAC80211_LEDS 
    5724static void ath_led_brightness(struct led_classdev *led_cdev, 
    5825                               enum led_brightness brightness) 
    5926{ 
    60         struct ath_led *led = container_of(led_cdev, struct ath_led, led_cdev); 
    61         struct ath_softc *sc = led->sc; 
    62  
    63         switch (brightness) { 
    64         case LED_OFF: 
    65                 if (led->led_type == ATH_LED_ASSOC || 
    66                     led->led_type == ATH_LED_RADIO) { 
    67                         ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 
    68                                 (led->led_type == ATH_LED_RADIO)); 
    69                         sc->sc_flags &= ~SC_OP_LED_ASSOCIATED; 
    70                         if (led->led_type == ATH_LED_RADIO) 
    71                                 sc->sc_flags &= ~SC_OP_LED_ON; 
    72                 } else { 
    73                         sc->led_off_cnt++; 
    74                 } 
    75                 break; 
    76         case LED_FULL: 
    77                 if (led->led_type == ATH_LED_ASSOC) { 
    78                         sc->sc_flags |= SC_OP_LED_ASSOCIATED; 
    79                         if (led_blink) 
    80                                 ieee80211_queue_delayed_work(sc->hw, 
    81                                                      &sc->ath_led_blink_work, 0); 
    82                 } else if (led->led_type == ATH_LED_RADIO) { 
    83                         ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 0); 
    84                         sc->sc_flags |= SC_OP_LED_ON; 
    85                 } else { 
    86                         sc->led_on_cnt++; 
    87                 } 
    88                 break; 
    89         default: 
    90                 break; 
    91         } 
    92 } 
    93  
    94 static int ath_register_led(struct ath_softc *sc, struct ath_led *led, 
    95                             char *trigger) 
    96 { 
    97         int ret; 
    98  
    99         led->sc = sc; 
    100         led->led_cdev.name = led->name; 
    101         led->led_cdev.default_trigger = trigger; 
    102         led->led_cdev.brightness_set = ath_led_brightness; 
    103  
    104         ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &led->led_cdev); 
    105         if (ret) 
    106                 ath_err(ath9k_hw_common(sc->sc_ah), 
    107                         "Failed to register led:%s", led->name); 
    108         else 
    109                 led->registered = 1; 
    110         return ret; 
    111 } 
    112  
    113 static void ath_unregister_led(struct ath_led *led) 
    114 { 
    115         if (led->registered) { 
    116                 led_classdev_unregister(&led->led_cdev); 
    117                 led->registered = 0; 
    118         } 
     27        struct ath_softc *sc = container_of(led_cdev, struct ath_softc, led_cdev); 
     28        ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, (brightness == LED_OFF)); 
    11929} 
    12030 
    12131void ath_deinit_leds(struct ath_softc *sc) 
    12232{ 
    123         if (AR_SREV_9100(sc->sc_ah)) 
     33        if (!sc->led_registered) 
    12434                return; 
    12535 
    126         ath_unregister_led(&sc->assoc_led); 
    127         sc->sc_flags &= ~SC_OP_LED_ASSOCIATED; 
    128         ath_unregister_led(&sc->tx_led); 
    129         ath_unregister_led(&sc->rx_led); 
    130         ath_unregister_led(&sc->radio_led); 
    131         ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); 
     36        ath_led_brightness(&sc->led_cdev, LED_OFF); 
     37        led_classdev_unregister(&sc->led_cdev); 
    13238} 
    13339 
    13440void ath_init_leds(struct ath_softc *sc) 
    13541{ 
    136         char *trigger; 
    13742        int ret; 
    13843 
    13944        if (AR_SREV_9100(sc->sc_ah)) 
    void ath_init_leds(struct ath_softc *sc) 
    15257        /* LED off, active low */ 
    15358        ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); 
    15459 
    155         if (led_blink) 
    156                 INIT_DELAYED_WORK(&sc->ath_led_blink_work, ath_led_blink_work); 
     60        if (!led_blink) 
     61                sc->led_cdev.default_trigger = 
     62                        ieee80211_get_radio_led_name(sc->hw); 
     63 
     64        snprintf(sc->led_name, sizeof(sc->led_name), 
     65                "ath9k-%s", wiphy_name(sc->hw->wiphy)); 
     66        sc->led_cdev.name = sc->led_name; 
     67        sc->led_cdev.brightness_set = ath_led_brightness; 
     68 
     69        ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &sc->led_cdev); 
     70        if (ret < 0) 
     71                return; 
    15772 
    158         trigger = ieee80211_get_radio_led_name(sc->hw); 
    159         snprintf(sc->radio_led.name, sizeof(sc->radio_led.name), 
    160                 "ath9k-%s::radio", wiphy_name(sc->hw->wiphy)); 
    161         ret = ath_register_led(sc, &sc->radio_led, trigger); 
    162         sc->radio_led.led_type = ATH_LED_RADIO; 
    163         if (ret) 
    164                 goto fail; 
    165  
    166         trigger = ieee80211_get_assoc_led_name(sc->hw); 
    167         snprintf(sc->assoc_led.name, sizeof(sc->assoc_led.name), 
    168                 "ath9k-%s::assoc", wiphy_name(sc->hw->wiphy)); 
    169         ret = ath_register_led(sc, &sc->assoc_led, trigger); 
    170         sc->assoc_led.led_type = ATH_LED_ASSOC; 
    171         if (ret) 
    172                 goto fail; 
    173  
    174         trigger = ieee80211_get_tx_led_name(sc->hw); 
    175         snprintf(sc->tx_led.name, sizeof(sc->tx_led.name), 
    176                 "ath9k-%s::tx", wiphy_name(sc->hw->wiphy)); 
    177         ret = ath_register_led(sc, &sc->tx_led, trigger); 
    178         sc->tx_led.led_type = ATH_LED_TX; 
    179         if (ret) 
    180                 goto fail; 
    181  
    182         trigger = ieee80211_get_rx_led_name(sc->hw); 
    183         snprintf(sc->rx_led.name, sizeof(sc->rx_led.name), 
    184                 "ath9k-%s::rx", wiphy_name(sc->hw->wiphy)); 
    185         ret = ath_register_led(sc, &sc->rx_led, trigger); 
    186         sc->rx_led.led_type = ATH_LED_RX; 
    187         if (ret) 
    188                 goto fail; 
    189  
    190         return; 
    191  
    192 fail: 
    193         if (led_blink) 
    194                 cancel_delayed_work_sync(&sc->ath_led_blink_work); 
    195         ath_deinit_leds(sc); 
     73        sc->led_registered = true; 
    19674} 
     75#endif 
    19776 
    19877/*******************/ 
    19978/*      Rfkill     */ 
  • drivers/net/wireless/ath/ath9k/main.c

    a b static void ath9k_stop(struct ieee80211_ 
    12751275 
    12761276        aphy->state = ATH_WIPHY_INACTIVE; 
    12771277 
    1278         if (led_blink) 
    1279                 cancel_delayed_work_sync(&sc->ath_led_blink_work); 
    1280  
    12811278        cancel_delayed_work_sync(&sc->tx_complete_work); 
    12821279        cancel_work_sync(&sc->paprd_work); 
    12831280        cancel_work_sync(&sc->hw_check_work); 
  • drivers/net/wireless/ath/ath9k/init.c

    a b static struct ieee80211_rate ath9k_legac 
    139139        RATE(540, 0x0c, 0), 
    140140}; 
    141141 
     142#ifdef CONFIG_MAC80211_LEDS 
     143static const struct ieee80211_tpt_blink ath9k_tpt_blink[] = { 
     144        { .throughput = 0 * 1024, .blink_time = 334 }, 
     145        { .throughput = 1 * 1024, .blink_time = 260 }, 
     146        { .throughput = 5 * 1024, .blink_time = 220 }, 
     147        { .throughput = 10 * 1024, .blink_time = 190 }, 
     148        { .throughput = 20 * 1024, .blink_time = 170 }, 
     149        { .throughput = 50 * 1024, .blink_time = 150 }, 
     150        { .throughput = 70 * 1024, .blink_time = 130 }, 
     151        { .throughput = 100 * 1024, .blink_time = 110 }, 
     152        { .throughput = 200 * 1024, .blink_time = 80 }, 
     153        { .throughput = 300 * 1024, .blink_time = 50 }, 
     154}; 
     155#endif 
     156 
    142157static void ath9k_deinit_softc(struct ath_softc *sc); 
    143158 
    144159/* 
    int ath9k_init_device(u16 devid, struct  
    742757 
    743758        ath9k_init_txpower_limits(sc); 
    744759 
     760#ifdef CONFIG_MAC80211_LEDS 
     761        /* must be initialized before ieee80211_register_hw */ 
     762        sc->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(sc->hw, 
     763                ath9k_tpt_blink, ARRAY_SIZE(ath9k_tpt_blink)); 
     764#endif 
     765 
    745766        /* Register with mac80211 */ 
    746767        error = ieee80211_register_hw(hw); 
    747768        if (error) 
Note: See TracBrowser for help on using the repository browser.