Skip to contentSkip to conversation

bluecard_cs: blink LED during continuous activity

PATCH In review Ondrej Zary 2 participants 2 messages Aug 7, 2017 Bluetooth drivers

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 bluecard_cs: blink LED during continuous activity

Currently the activity LED is solid on during continuous activity. Blink the LED during continuous activity to match Windows driver behavior.

Cards with activity LED:
power LED = solid on when up, off when down activity LED = blinking during activity, off when idle

Cards without activity LED:
power LED = solid on when up, off when down, blinking during activity (don't have such a card so I don't know if Windows driver does the same thing)

---
 drivers/bluetooth/bluecard_cs.c | 33 +++++++++++++++++++--------------
 1 file changed, 19 insertions(+), 14 deletions(-)
drivers/bluetooth/bluecard_cs.c +19 -14
index 61ac48e1aa55..b07ca9565291 100644
@@ -93,6 +93,7 @@ static void bluecard_detach(struct pcmcia_device *p_dev);
 
 /* Hardware states */
 #define CARD_READY             1
+#define CARD_ACTIVITY	       2
 #define CARD_HAS_PCCARD_ID     4
 #define CARD_HAS_POWER_LED     5
 #define CARD_HAS_ACTIVITY_LED  6
@@ -160,13 +161,14 @@ static void bluecard_activity_led_timeout(u_long arg)
 	struct bluecard_info *info = (struct bluecard_info *)arg;
 	unsigned int iobase = info->p_dev->resource[0]->start;
 
-	if (test_bit(CARD_HAS_ACTIVITY_LED, &(info->hw_state))) {
-		/* Disable activity LED, keep power LED enabled */
-		outb(0x08 | 0x20, iobase + 0x30);
-	} else {
-		/* Disable power LED */
-		outb(0x00, iobase + 0x30);
+	if (test_bit(CARD_ACTIVITY, &(info->hw_state))) {
+		/* leave LED in inactive state for HZ/10 for blink effect */
+		clear_bit(CARD_ACTIVITY, &(info->hw_state));
+		mod_timer(&(info->timer), jiffies + HZ / 10);
 	}
+
+	/* Disable activity LED, enable power LED */
+	outb(0x08 | 0x20, iobase + 0x30);
 }
 
 
@@ -174,19 +176,22 @@ static void bluecard_enable_activity_led(struct bluecard_info *info)
 {
 	unsigned int iobase = info->p_dev->resource[0]->start;
 
+	/* don't disturb running blink timer */
+	if (timer_pending(&(info->timer)))
+		return;
+
+	set_bit(CARD_ACTIVITY, &(info->hw_state));
+
 	if (test_bit(CARD_HAS_ACTIVITY_LED, &(info->hw_state))) {
 		/* Enable activity LED, keep power LED enabled */
 		outb(0x18 | 0x60, iobase + 0x30);
-
-		/* Stop the LED after HZ/4 */
-		mod_timer(&(info->timer), jiffies + HZ / 4);
 	} else {
-		/* Enable power LED */
-		outb(0x08 | 0x20, iobase + 0x30);
-
-		/* Stop the LED after HZ/2 */
-		mod_timer(&(info->timer), jiffies + HZ / 2);
+		/* Disable power LED */
+		outb(0x00, iobase + 0x30);
 	}
+
+	/* Stop the LED after HZ/10 */
+	mod_timer(&(info->timer), jiffies + HZ / 10);
 }
 
 
Signature · 1 line
Ondrej Zary
maintainer
#1 lore raw

Hi Ondrej,

Quoted 13 lines

Currently the activity LED is solid on during continuous activity. Blink the LED during continuous activity to match Windows driver behavior.

Cards with activity LED:
power LED = solid on when up, off when down activity LED = blinking during activity, off when idle

Cards without activity LED:
power LED = solid on when up, off when down, blinking during activity (don't have such a card so I don't know if Windows driver does the same thing)

Quoted 4 lines

---
drivers/bluetooth/bluecard_cs.c | 33 +++++++++++++++++++--------------

1 file changed, 19 insertions(+), 14 deletions(-)

patch has been applied to bluetooth-next tree.

Regards

Marcel