This source file includes following definitions.
- InitLed871x
- DeInitLed871x
- SwLedOn
- SwLedOff
- r8712_InitSwLeds
- r8712_DeInitSwLeds
- SwLedBlink
- SwLedBlink1
- SwLedBlink2
- SwLedBlink3
- SwLedBlink4
- SwLedBlink5
- SwLedBlink6
- BlinkTimerCallback
- BlinkWorkItemCallback
- SwLedControlMode1
- SwLedControlMode2
- SwLedControlMode3
- SwLedControlMode4
- SwLedControlMode5
- SwLedControlMode6
- LedControl871x
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 #include "drv_types.h"
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 #define LED_BLINK_NORMAL_INTERVAL       100
  27 #define LED_BLINK_SLOWLY_INTERVAL       200
  28 #define LED_BLINK_LONG_INTERVAL 400
  29 
  30 #define LED_BLINK_NO_LINK_INTERVAL_ALPHA        1000
  31 #define LED_BLINK_LINK_INTERVAL_ALPHA           500
  32 #define LED_BLINK_SCAN_INTERVAL_ALPHA           180
  33 #define LED_BLINK_FASTER_INTERVAL_ALPHA         50
  34 #define LED_BLINK_WPS_SUCCESS_INTERVAL_ALPHA    5000
  35 
  36 
  37 
  38 
  39 
  40 enum _LED_STATE_871x {
  41         LED_UNKNOWN = 0,
  42         LED_STATE_ON = 1,
  43         LED_STATE_OFF = 2,
  44         LED_BLINK_NORMAL = 3,
  45         LED_BLINK_SLOWLY = 4,
  46         LED_POWER_ON_BLINK = 5,
  47         LED_SCAN_BLINK = 6, 
  48 
  49 
  50 
  51         LED_NO_LINK_BLINK = 7, 
  52         LED_BLINK_StartToBlink = 8,
  53 
  54 
  55         LED_BLINK_WPS = 9,      
  56         LED_TXRX_BLINK = 10,
  57         LED_BLINK_WPS_STOP = 11,        
  58         LED_BLINK_WPS_STOP_OVERLAP = 12,        
  59 };
  60 
  61 
  62 
  63 
  64 
  65 static void BlinkTimerCallback(struct timer_list *t);
  66 
  67 static void BlinkWorkItemCallback(struct work_struct *work);
  68 
  69 
  70 
  71 
  72 
  73 
  74 
  75 
  76 
  77 static void InitLed871x(struct _adapter *padapter, struct LED_871x *pLed,
  78                  enum LED_PIN_871x      LedPin)
  79 {
  80         pLed->padapter = padapter;
  81         pLed->LedPin = LedPin;
  82         pLed->CurrLedState = LED_STATE_OFF;
  83         pLed->bLedOn = false;
  84         pLed->bLedBlinkInProgress = false;
  85         pLed->BlinkTimes = 0;
  86         pLed->BlinkingLedState = LED_UNKNOWN;
  87         timer_setup(&pLed->BlinkTimer, BlinkTimerCallback, 0);
  88         INIT_WORK(&pLed->BlinkWorkItem, BlinkWorkItemCallback);
  89 }
  90 
  91 
  92 
  93 
  94 
  95 static void DeInitLed871x(struct LED_871x *pLed)
  96 {
  97         del_timer_sync(&pLed->BlinkTimer);
  98         
  99 
 100 
 101         pLed->bLedBlinkInProgress = false;
 102 }
 103 
 104 
 105 
 106 
 107 
 108 static void SwLedOn(struct _adapter *padapter, struct LED_871x *pLed)
 109 {
 110         u8      LedCfg;
 111 
 112         if (padapter->surprise_removed || padapter->driver_stopped)
 113                 return;
 114         LedCfg = r8712_read8(padapter, LEDCFG);
 115         switch (pLed->LedPin) {
 116         case LED_PIN_GPIO0:
 117                 break;
 118         case LED_PIN_LED0:
 119                 
 120                 r8712_write8(padapter, LEDCFG, LedCfg & 0xf0);
 121                 break;
 122         case LED_PIN_LED1:
 123                 
 124                 r8712_write8(padapter, LEDCFG, LedCfg & 0x0f);
 125                 break;
 126         default:
 127                 break;
 128         }
 129         pLed->bLedOn = true;
 130 }
 131 
 132 
 133 
 134 
 135 
 136 static void SwLedOff(struct _adapter *padapter, struct LED_871x *pLed)
 137 {
 138         u8      LedCfg;
 139 
 140         if (padapter->surprise_removed || padapter->driver_stopped)
 141                 return;
 142         LedCfg = r8712_read8(padapter, LEDCFG);
 143         switch (pLed->LedPin) {
 144         case LED_PIN_GPIO0:
 145                 break;
 146         case LED_PIN_LED0:
 147                 LedCfg &= 0xf0; 
 148                 r8712_write8(padapter, LEDCFG, (LedCfg | BIT(3)));
 149                 break;
 150         case LED_PIN_LED1:
 151                 LedCfg &= 0x0f; 
 152                 r8712_write8(padapter, LEDCFG, (LedCfg | BIT(7)));
 153                 break;
 154         default:
 155                 break;
 156         }
 157         pLed->bLedOn = false;
 158 }
 159 
 160 
 161 
 162 
 163 
 164 
 165 
 166 
 167 void r8712_InitSwLeds(struct _adapter *padapter)
 168 {
 169         struct led_priv *pledpriv = &padapter->ledpriv;
 170 
 171         pledpriv->LedControlHandler = LedControl871x;
 172         InitLed871x(padapter, &pledpriv->SwLed0, LED_PIN_LED0);
 173         InitLed871x(padapter, &pledpriv->SwLed1, LED_PIN_LED1);
 174 }
 175 
 176 
 177 
 178 
 179 void r8712_DeInitSwLeds(struct _adapter *padapter)
 180 {
 181         struct led_priv *ledpriv = &padapter->ledpriv;
 182 
 183         DeInitLed871x(&ledpriv->SwLed0);
 184         DeInitLed871x(&ledpriv->SwLed1);
 185 }
 186 
 187 
 188 
 189 
 190 
 191 static void SwLedBlink(struct LED_871x *pLed)
 192 {
 193         struct _adapter *padapter = pLed->padapter;
 194         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 195         u8 bStopBlinking = false;
 196 
 197         
 198         if (pLed->BlinkingLedState == LED_STATE_ON)
 199                 SwLedOn(padapter, pLed);
 200         else
 201                 SwLedOff(padapter, pLed);
 202         
 203         pLed->BlinkTimes--;
 204         switch (pLed->CurrLedState) {
 205         case LED_BLINK_NORMAL:
 206                 if (pLed->BlinkTimes == 0)
 207                         bStopBlinking = true;
 208                 break;
 209         case LED_BLINK_StartToBlink:
 210                 if (check_fwstate(pmlmepriv, _FW_LINKED) &&
 211                     (pmlmepriv->fw_state & WIFI_STATION_STATE))
 212                         bStopBlinking = true;
 213                 if (check_fwstate(pmlmepriv, _FW_LINKED) &&
 214                     ((pmlmepriv->fw_state & WIFI_ADHOC_STATE) ||
 215                     (pmlmepriv->fw_state & WIFI_ADHOC_MASTER_STATE)))
 216                         bStopBlinking = true;
 217                 else if (pLed->BlinkTimes == 0)
 218                         bStopBlinking = true;
 219                 break;
 220         case LED_BLINK_WPS:
 221                 if (pLed->BlinkTimes == 0)
 222                         bStopBlinking = true;
 223                 break;
 224         default:
 225                 bStopBlinking = true;
 226                 break;
 227         }
 228         if (bStopBlinking) {
 229                 if (check_fwstate(pmlmepriv, _FW_LINKED) &&
 230                     !pLed->bLedOn)
 231                         SwLedOn(padapter, pLed);
 232                 else if (check_fwstate(pmlmepriv, _FW_LINKED) &&  pLed->bLedOn)
 233                         SwLedOff(padapter, pLed);
 234                 pLed->BlinkTimes = 0;
 235                 pLed->bLedBlinkInProgress = false;
 236         } else {
 237                 
 238                 if (pLed->BlinkingLedState == LED_STATE_ON)
 239                         pLed->BlinkingLedState = LED_STATE_OFF;
 240                 else
 241                         pLed->BlinkingLedState = LED_STATE_ON;
 242 
 243                 
 244                 switch (pLed->CurrLedState) {
 245                 case LED_BLINK_NORMAL:
 246                         mod_timer(&pLed->BlinkTimer, jiffies +
 247                                   msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
 248                         break;
 249                 case LED_BLINK_SLOWLY:
 250                 case LED_BLINK_StartToBlink:
 251                         mod_timer(&pLed->BlinkTimer, jiffies +
 252                                   msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
 253                         break;
 254                 case LED_BLINK_WPS:
 255                         mod_timer(&pLed->BlinkTimer, jiffies +
 256                                   msecs_to_jiffies(LED_BLINK_LONG_INTERVAL));
 257                         break;
 258                 default:
 259                         mod_timer(&pLed->BlinkTimer, jiffies +
 260                                   msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
 261                         break;
 262                 }
 263         }
 264 }
 265 
 266 static void SwLedBlink1(struct LED_871x *pLed)
 267 {
 268         struct _adapter *padapter = pLed->padapter;
 269         struct led_priv *ledpriv = &padapter->ledpriv;
 270         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 271         struct eeprom_priv *peeprompriv = &padapter->eeprompriv;
 272         struct LED_871x *pLed1 = &ledpriv->SwLed1;
 273         u8 bStopBlinking = false;
 274 
 275         if (peeprompriv->CustomerID == RT_CID_819x_CAMEO)
 276                 pLed = &ledpriv->SwLed1;
 277         
 278         if (pLed->BlinkingLedState == LED_STATE_ON)
 279                 SwLedOn(padapter, pLed);
 280         else
 281                 SwLedOff(padapter, pLed);
 282         if (peeprompriv->CustomerID == RT_CID_DEFAULT) {
 283                 if (check_fwstate(pmlmepriv, _FW_LINKED)) {
 284                         if (!pLed1->bSWLedCtrl) {
 285                                 SwLedOn(padapter, pLed1);
 286                                 pLed1->bSWLedCtrl = true;
 287                         } else if (!pLed1->bLedOn) {
 288                                 SwLedOn(padapter, pLed1);
 289                         }
 290                 } else {
 291                         if (!pLed1->bSWLedCtrl) {
 292                                 SwLedOff(padapter, pLed1);
 293                                 pLed1->bSWLedCtrl = true;
 294                         } else if (pLed1->bLedOn) {
 295                                 SwLedOff(padapter, pLed1);
 296                         }
 297                 }
 298         }
 299         switch (pLed->CurrLedState) {
 300         case LED_BLINK_SLOWLY:
 301                 if (pLed->bLedOn)
 302                         pLed->BlinkingLedState = LED_STATE_OFF;
 303                 else
 304                         pLed->BlinkingLedState = LED_STATE_ON;
 305                 mod_timer(&pLed->BlinkTimer, jiffies +
 306                           msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
 307                 break;
 308         case LED_BLINK_NORMAL:
 309                 if (pLed->bLedOn)
 310                         pLed->BlinkingLedState = LED_STATE_OFF;
 311                 else
 312                         pLed->BlinkingLedState = LED_STATE_ON;
 313                 mod_timer(&pLed->BlinkTimer, jiffies +
 314                           msecs_to_jiffies(LED_BLINK_LINK_INTERVAL_ALPHA));
 315                 break;
 316         case LED_SCAN_BLINK:
 317                 pLed->BlinkTimes--;
 318                 if (pLed->BlinkTimes == 0)
 319                         bStopBlinking = true;
 320                 if (bStopBlinking) {
 321                         if (check_fwstate(pmlmepriv, _FW_LINKED)) {
 322                                 pLed->bLedLinkBlinkInProgress = true;
 323                                 pLed->CurrLedState = LED_BLINK_NORMAL;
 324                                 if (pLed->bLedOn)
 325                                         pLed->BlinkingLedState = LED_STATE_OFF;
 326                                 else
 327                                         pLed->BlinkingLedState = LED_STATE_ON;
 328                                 mod_timer(&pLed->BlinkTimer, jiffies +
 329                                           msecs_to_jiffies(LED_BLINK_LINK_INTERVAL_ALPHA));
 330                         } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
 331                                 pLed->bLedNoLinkBlinkInProgress = true;
 332                                 pLed->CurrLedState = LED_BLINK_SLOWLY;
 333                                 if (pLed->bLedOn)
 334                                         pLed->BlinkingLedState = LED_STATE_OFF;
 335                                 else
 336                                         pLed->BlinkingLedState = LED_STATE_ON;
 337                                 mod_timer(&pLed->BlinkTimer, jiffies +
 338                                           msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
 339                         }
 340                         pLed->bLedScanBlinkInProgress = false;
 341                 } else {
 342                         if (pLed->bLedOn)
 343                                 pLed->BlinkingLedState = LED_STATE_OFF;
 344                         else
 345                                 pLed->BlinkingLedState = LED_STATE_ON;
 346                         mod_timer(&pLed->BlinkTimer, jiffies +
 347                                   msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
 348                 }
 349                 break;
 350         case LED_TXRX_BLINK:
 351                 pLed->BlinkTimes--;
 352                 if (pLed->BlinkTimes == 0)
 353                         bStopBlinking = true;
 354                 if (bStopBlinking) {
 355                         if (check_fwstate(pmlmepriv, _FW_LINKED)) {
 356                                 pLed->bLedLinkBlinkInProgress = true;
 357                                 pLed->CurrLedState = LED_BLINK_NORMAL;
 358                                 if (pLed->bLedOn)
 359                                         pLed->BlinkingLedState = LED_STATE_OFF;
 360                                 else
 361                                         pLed->BlinkingLedState = LED_STATE_ON;
 362                                 mod_timer(&pLed->BlinkTimer, jiffies +
 363                                           msecs_to_jiffies(LED_BLINK_LINK_INTERVAL_ALPHA));
 364                         } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
 365                                 pLed->bLedNoLinkBlinkInProgress = true;
 366                                 pLed->CurrLedState = LED_BLINK_SLOWLY;
 367                                 if (pLed->bLedOn)
 368                                         pLed->BlinkingLedState = LED_STATE_OFF;
 369                                 else
 370                                         pLed->BlinkingLedState = LED_STATE_ON;
 371                                 mod_timer(&pLed->BlinkTimer, jiffies +
 372                                           msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
 373                         }
 374                         pLed->BlinkTimes = 0;
 375                         pLed->bLedBlinkInProgress = false;
 376                 } else {
 377                         if (pLed->bLedOn)
 378                                 pLed->BlinkingLedState = LED_STATE_OFF;
 379                         else
 380                                 pLed->BlinkingLedState = LED_STATE_ON;
 381                         mod_timer(&pLed->BlinkTimer, jiffies +
 382                                   msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
 383                 }
 384                 break;
 385         case LED_BLINK_WPS:
 386                 if (pLed->bLedOn)
 387                         pLed->BlinkingLedState = LED_STATE_OFF;
 388                 else
 389                         pLed->BlinkingLedState = LED_STATE_ON;
 390                 mod_timer(&pLed->BlinkTimer, jiffies +
 391                           msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
 392                 break;
 393         case LED_BLINK_WPS_STOP:        
 394                 if (pLed->BlinkingLedState == LED_STATE_ON) {
 395                         pLed->BlinkingLedState = LED_STATE_OFF;
 396                         mod_timer(&pLed->BlinkTimer, jiffies +
 397                                   msecs_to_jiffies(LED_BLINK_WPS_SUCCESS_INTERVAL_ALPHA));
 398                         bStopBlinking = false;
 399                 } else {
 400                         bStopBlinking = true;
 401                 }
 402                 if (bStopBlinking) {
 403                         pLed->bLedLinkBlinkInProgress = true;
 404                         pLed->CurrLedState = LED_BLINK_NORMAL;
 405                         if (pLed->bLedOn)
 406                                 pLed->BlinkingLedState = LED_STATE_OFF;
 407                         else
 408                                 pLed->BlinkingLedState = LED_STATE_ON;
 409                         mod_timer(&pLed->BlinkTimer, jiffies +
 410                                   msecs_to_jiffies(LED_BLINK_LINK_INTERVAL_ALPHA));
 411                 }
 412                 pLed->bLedWPSBlinkInProgress = false;
 413                 break;
 414         default:
 415                 break;
 416         }
 417 }
 418 
 419 static void SwLedBlink2(struct LED_871x *pLed)
 420 {
 421         struct _adapter *padapter = pLed->padapter;
 422         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 423         u8 bStopBlinking = false;
 424 
 425         
 426         if (pLed->BlinkingLedState == LED_STATE_ON)
 427                 SwLedOn(padapter, pLed);
 428         else
 429                 SwLedOff(padapter, pLed);
 430         switch (pLed->CurrLedState) {
 431         case LED_SCAN_BLINK:
 432                 pLed->BlinkTimes--;
 433                 if (pLed->BlinkTimes == 0)
 434                         bStopBlinking = true;
 435                 if (bStopBlinking) {
 436                         if (check_fwstate(pmlmepriv, _FW_LINKED)) {
 437                                 pLed->CurrLedState = LED_STATE_ON;
 438                                 pLed->BlinkingLedState = LED_STATE_ON;
 439                                 SwLedOn(padapter, pLed);
 440                         } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
 441                                 pLed->CurrLedState = LED_STATE_OFF;
 442                                 pLed->BlinkingLedState = LED_STATE_OFF;
 443                                 SwLedOff(padapter, pLed);
 444                         }
 445                         pLed->bLedScanBlinkInProgress = false;
 446                 } else {
 447                         if (pLed->bLedOn)
 448                                 pLed->BlinkingLedState = LED_STATE_OFF;
 449                         else
 450                                 pLed->BlinkingLedState = LED_STATE_ON;
 451                         mod_timer(&pLed->BlinkTimer, jiffies +
 452                                   msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
 453                 }
 454                 break;
 455         case LED_TXRX_BLINK:
 456                 pLed->BlinkTimes--;
 457                 if (pLed->BlinkTimes == 0)
 458                         bStopBlinking = true;
 459                 if (bStopBlinking) {
 460                         if (check_fwstate(pmlmepriv, _FW_LINKED)) {
 461                                 pLed->CurrLedState = LED_STATE_ON;
 462                                 pLed->BlinkingLedState = LED_STATE_ON;
 463                                 SwLedOn(padapter, pLed);
 464                         } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
 465                                 pLed->CurrLedState = LED_STATE_OFF;
 466                                 pLed->BlinkingLedState = LED_STATE_OFF;
 467                                 SwLedOff(padapter, pLed);
 468                         }
 469                         pLed->bLedBlinkInProgress = false;
 470                 } else {
 471                         if (pLed->bLedOn)
 472                                 pLed->BlinkingLedState = LED_STATE_OFF;
 473                         else
 474                                 pLed->BlinkingLedState = LED_STATE_ON;
 475                         mod_timer(&pLed->BlinkTimer, jiffies +
 476                                   msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
 477                 }
 478                 break;
 479         default:
 480                 break;
 481         }
 482 }
 483 
 484 static void SwLedBlink3(struct LED_871x *pLed)
 485 {
 486         struct _adapter *padapter = pLed->padapter;
 487         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 488         u8 bStopBlinking = false;
 489 
 490         
 491         if (pLed->BlinkingLedState == LED_STATE_ON)
 492                 SwLedOn(padapter, pLed);
 493         else
 494                 if (pLed->CurrLedState != LED_BLINK_WPS_STOP)
 495                         SwLedOff(padapter, pLed);
 496         switch (pLed->CurrLedState) {
 497         case LED_SCAN_BLINK:
 498                 pLed->BlinkTimes--;
 499                 if (pLed->BlinkTimes == 0)
 500                         bStopBlinking = true;
 501                 if (bStopBlinking) {
 502                         if (check_fwstate(pmlmepriv, _FW_LINKED)) {
 503                                 pLed->CurrLedState = LED_STATE_ON;
 504                                 pLed->BlinkingLedState = LED_STATE_ON;
 505                                 if (!pLed->bLedOn)
 506                                         SwLedOn(padapter, pLed);
 507                         } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
 508                                 pLed->CurrLedState = LED_STATE_OFF;
 509                                 pLed->BlinkingLedState = LED_STATE_OFF;
 510                                 if (pLed->bLedOn)
 511                                         SwLedOff(padapter, pLed);
 512                         }
 513                         pLed->bLedScanBlinkInProgress = false;
 514                 } else {
 515                         if (pLed->bLedOn)
 516                                 pLed->BlinkingLedState = LED_STATE_OFF;
 517                         else
 518                                 pLed->BlinkingLedState = LED_STATE_ON;
 519                         mod_timer(&pLed->BlinkTimer, jiffies +
 520                                   msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
 521                 }
 522                 break;
 523         case LED_TXRX_BLINK:
 524                 pLed->BlinkTimes--;
 525                 if (pLed->BlinkTimes == 0)
 526                         bStopBlinking = true;
 527                 if (bStopBlinking) {
 528                         if (check_fwstate(pmlmepriv, _FW_LINKED)) {
 529                                 pLed->CurrLedState = LED_STATE_ON;
 530                                 pLed->BlinkingLedState = LED_STATE_ON;
 531                                 if (!pLed->bLedOn)
 532                                         SwLedOn(padapter, pLed);
 533                         } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
 534                                 pLed->CurrLedState = LED_STATE_OFF;
 535                                 pLed->BlinkingLedState = LED_STATE_OFF;
 536                                 if (pLed->bLedOn)
 537                                         SwLedOff(padapter, pLed);
 538                         }
 539                         pLed->bLedBlinkInProgress = false;
 540                 } else {
 541                         if (pLed->bLedOn)
 542                                 pLed->BlinkingLedState = LED_STATE_OFF;
 543                         else
 544                                 pLed->BlinkingLedState = LED_STATE_ON;
 545                         mod_timer(&pLed->BlinkTimer, jiffies +
 546                                   msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
 547                 }
 548                 break;
 549         case LED_BLINK_WPS:
 550                 if (pLed->bLedOn)
 551                         pLed->BlinkingLedState = LED_STATE_OFF;
 552                 else
 553                         pLed->BlinkingLedState = LED_STATE_ON;
 554                 mod_timer(&pLed->BlinkTimer, jiffies +
 555                           msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
 556                 break;
 557         case LED_BLINK_WPS_STOP:        
 558                 if (pLed->BlinkingLedState == LED_STATE_ON) {
 559                         pLed->BlinkingLedState = LED_STATE_OFF;
 560                         mod_timer(&pLed->BlinkTimer, jiffies +
 561                                   msecs_to_jiffies(LED_BLINK_WPS_SUCCESS_INTERVAL_ALPHA));
 562                         bStopBlinking = false;
 563                 } else {
 564                         bStopBlinking = true;
 565                 }
 566                 if (bStopBlinking) {
 567                         pLed->CurrLedState = LED_STATE_ON;
 568                         pLed->BlinkingLedState = LED_STATE_ON;
 569                         SwLedOn(padapter, pLed);
 570                         pLed->bLedWPSBlinkInProgress = false;
 571                 }
 572                 break;
 573         default:
 574                 break;
 575         }
 576 }
 577 
 578 static void SwLedBlink4(struct LED_871x *pLed)
 579 {
 580         struct _adapter *padapter = pLed->padapter;
 581         struct led_priv *ledpriv = &padapter->ledpriv;
 582         struct LED_871x *pLed1 = &ledpriv->SwLed1;
 583         u8 bStopBlinking = false;
 584 
 585         
 586         if (pLed->BlinkingLedState == LED_STATE_ON)
 587                 SwLedOn(padapter, pLed);
 588         else
 589                 SwLedOff(padapter, pLed);
 590         if (!pLed1->bLedWPSBlinkInProgress &&
 591             pLed1->BlinkingLedState == LED_UNKNOWN) {
 592                 pLed1->BlinkingLedState = LED_STATE_OFF;
 593                 pLed1->CurrLedState = LED_STATE_OFF;
 594                 SwLedOff(padapter, pLed1);
 595         }
 596         switch (pLed->CurrLedState) {
 597         case LED_BLINK_SLOWLY:
 598                 if (pLed->bLedOn)
 599                         pLed->BlinkingLedState = LED_STATE_OFF;
 600                 else
 601                         pLed->BlinkingLedState = LED_STATE_ON;
 602                 mod_timer(&pLed->BlinkTimer, jiffies +
 603                           msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
 604                 break;
 605         case LED_BLINK_StartToBlink:
 606                 if (pLed->bLedOn) {
 607                         pLed->BlinkingLedState = LED_STATE_OFF;
 608                         mod_timer(&pLed->BlinkTimer, jiffies +
 609                                   msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
 610                 } else {
 611                         pLed->BlinkingLedState = LED_STATE_ON;
 612                         mod_timer(&pLed->BlinkTimer, jiffies +
 613                                   msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
 614                 }
 615                 break;
 616         case LED_SCAN_BLINK:
 617                 pLed->BlinkTimes--;
 618                 if (pLed->BlinkTimes == 0)
 619                         bStopBlinking = true;
 620                 if (bStopBlinking) {
 621                         pLed->bLedNoLinkBlinkInProgress = true;
 622                         pLed->CurrLedState = LED_BLINK_SLOWLY;
 623                         if (pLed->bLedOn)
 624                                 pLed->BlinkingLedState = LED_STATE_OFF;
 625                         else
 626                                 pLed->BlinkingLedState = LED_STATE_ON;
 627                         mod_timer(&pLed->BlinkTimer, jiffies +
 628                                   msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
 629                         pLed->bLedScanBlinkInProgress = false;
 630                 } else {
 631                         if (pLed->bLedOn)
 632                                 pLed->BlinkingLedState = LED_STATE_OFF;
 633                         else
 634                                 pLed->BlinkingLedState = LED_STATE_ON;
 635                         mod_timer(&pLed->BlinkTimer, jiffies +
 636                                   msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
 637                 }
 638                 break;
 639         case LED_TXRX_BLINK:
 640                 pLed->BlinkTimes--;
 641                 if (pLed->BlinkTimes == 0)
 642                         bStopBlinking = true;
 643                 if (bStopBlinking) {
 644                         pLed->bLedNoLinkBlinkInProgress = true;
 645                         pLed->CurrLedState = LED_BLINK_SLOWLY;
 646                         if (pLed->bLedOn)
 647                                 pLed->BlinkingLedState = LED_STATE_OFF;
 648                         else
 649                                 pLed->BlinkingLedState = LED_STATE_ON;
 650                         mod_timer(&pLed->BlinkTimer, jiffies +
 651                                   msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
 652                         pLed->bLedBlinkInProgress = false;
 653                 } else {
 654                         if (pLed->bLedOn)
 655                                 pLed->BlinkingLedState = LED_STATE_OFF;
 656                         else
 657                                 pLed->BlinkingLedState = LED_STATE_ON;
 658                         mod_timer(&pLed->BlinkTimer, jiffies +
 659                                   msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
 660                 }
 661                 break;
 662         case LED_BLINK_WPS:
 663                 if (pLed->bLedOn) {
 664                         pLed->BlinkingLedState = LED_STATE_OFF;
 665                         mod_timer(&pLed->BlinkTimer, jiffies +
 666                                   msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
 667                 } else {
 668                         pLed->BlinkingLedState = LED_STATE_ON;
 669                         mod_timer(&pLed->BlinkTimer, jiffies +
 670                                   msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
 671                 }
 672                 break;
 673         case LED_BLINK_WPS_STOP:        
 674                 if (pLed->bLedOn)
 675                         pLed->BlinkingLedState = LED_STATE_OFF;
 676                 else
 677                         pLed->BlinkingLedState = LED_STATE_ON;
 678                 mod_timer(&pLed->BlinkTimer, jiffies +
 679                           msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
 680                 break;
 681         case LED_BLINK_WPS_STOP_OVERLAP:        
 682                 pLed->BlinkTimes--;
 683                 if (pLed->BlinkTimes == 0) {
 684                         if (pLed->bLedOn)
 685                                 pLed->BlinkTimes = 1;
 686                         else
 687                                 bStopBlinking = true;
 688                 }
 689                 if (bStopBlinking) {
 690                         pLed->BlinkTimes = 10;
 691                         pLed->BlinkingLedState = LED_STATE_ON;
 692                         mod_timer(&pLed->BlinkTimer, jiffies +
 693                                   msecs_to_jiffies(LED_BLINK_LINK_INTERVAL_ALPHA));
 694                 } else {
 695                         if (pLed->bLedOn)
 696                                 pLed->BlinkingLedState = LED_STATE_OFF;
 697                         else
 698                                 pLed->BlinkingLedState = LED_STATE_ON;
 699                         mod_timer(&pLed->BlinkTimer, jiffies +
 700                                   msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
 701                 }
 702                 break;
 703         default:
 704                 break;
 705         }
 706 }
 707 
 708 static void SwLedBlink5(struct LED_871x *pLed)
 709 {
 710         struct _adapter *padapter = pLed->padapter;
 711         u8 bStopBlinking = false;
 712 
 713         
 714         if (pLed->BlinkingLedState == LED_STATE_ON)
 715                 SwLedOn(padapter, pLed);
 716         else
 717                 SwLedOff(padapter, pLed);
 718         switch (pLed->CurrLedState) {
 719         case LED_SCAN_BLINK:
 720                 pLed->BlinkTimes--;
 721                 if (pLed->BlinkTimes == 0)
 722                         bStopBlinking = true;
 723                 if (bStopBlinking) {
 724                         pLed->CurrLedState = LED_STATE_ON;
 725                         pLed->BlinkingLedState = LED_STATE_ON;
 726                         if (!pLed->bLedOn)
 727                                 mod_timer(&pLed->BlinkTimer, jiffies +
 728                                           msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
 729                         pLed->bLedScanBlinkInProgress = false;
 730                 } else {
 731                         if (pLed->bLedOn)
 732                                 pLed->BlinkingLedState = LED_STATE_OFF;
 733                         else
 734                                 pLed->BlinkingLedState = LED_STATE_ON;
 735                         mod_timer(&pLed->BlinkTimer, jiffies +
 736                                   msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
 737                 }
 738                 break;
 739         case LED_TXRX_BLINK:
 740                 pLed->BlinkTimes--;
 741                 if (pLed->BlinkTimes == 0)
 742                         bStopBlinking = true;
 743                 if (bStopBlinking) {
 744                         pLed->CurrLedState = LED_STATE_ON;
 745                         pLed->BlinkingLedState = LED_STATE_ON;
 746                         if (!pLed->bLedOn)
 747                                 mod_timer(&pLed->BlinkTimer, jiffies +
 748                                           msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
 749                         pLed->bLedBlinkInProgress = false;
 750                 } else {
 751                         if (pLed->bLedOn)
 752                                 pLed->BlinkingLedState = LED_STATE_OFF;
 753                         else
 754                                 pLed->BlinkingLedState = LED_STATE_ON;
 755                         mod_timer(&pLed->BlinkTimer, jiffies +
 756                                   msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
 757                 }
 758                 break;
 759         default:
 760                 break;
 761         }
 762 }
 763 
 764 static void SwLedBlink6(struct LED_871x *pLed)
 765 {
 766         struct _adapter *padapter = pLed->padapter;
 767         u8 bStopBlinking = false;
 768 
 769         
 770         if (pLed->BlinkingLedState == LED_STATE_ON)
 771                 SwLedOn(padapter, pLed);
 772         else
 773                 SwLedOff(padapter, pLed);
 774         switch (pLed->CurrLedState) {
 775         case LED_TXRX_BLINK:
 776                 pLed->BlinkTimes--;
 777                 if (pLed->BlinkTimes == 0)
 778                         bStopBlinking = true;
 779                 if (bStopBlinking) {
 780                         pLed->CurrLedState = LED_STATE_ON;
 781                         pLed->BlinkingLedState = LED_STATE_ON;
 782                         if (!pLed->bLedOn)
 783                                 SwLedOn(padapter, pLed);
 784                         pLed->bLedBlinkInProgress = false;
 785                 } else {
 786                         if (pLed->bLedOn)
 787                                 pLed->BlinkingLedState = LED_STATE_OFF;
 788                         else
 789                                 pLed->BlinkingLedState = LED_STATE_ON;
 790                         mod_timer(&pLed->BlinkTimer, jiffies +
 791                                   msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
 792                 }
 793                 break;
 794         case LED_BLINK_WPS:
 795                 if (pLed->bLedOn)
 796                         pLed->BlinkingLedState = LED_STATE_OFF;
 797                 else
 798                         pLed->BlinkingLedState = LED_STATE_ON;
 799                 mod_timer(&pLed->BlinkTimer, jiffies +
 800                           msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
 801                 break;
 802 
 803         default:
 804                 break;
 805         }
 806 }
 807 
 808 
 809 
 810 
 811 
 812 static void BlinkTimerCallback(struct timer_list *t)
 813 {
 814         struct LED_871x  *pLed = from_timer(pLed, t, BlinkTimer);
 815 
 816         
 817 
 818 
 819         if (pLed->padapter->surprise_removed || pLed->padapter->driver_stopped)
 820                 return;
 821         schedule_work(&pLed->BlinkWorkItem);
 822 }
 823 
 824 
 825 
 826 
 827 
 828 static void BlinkWorkItemCallback(struct work_struct *work)
 829 {
 830         struct LED_871x *pLed = container_of(work, struct LED_871x,
 831                                 BlinkWorkItem);
 832         struct led_priv *ledpriv = &pLed->padapter->ledpriv;
 833 
 834         switch (ledpriv->LedStrategy) {
 835         case SW_LED_MODE0:
 836                 SwLedBlink(pLed);
 837                 break;
 838         case SW_LED_MODE1:
 839                 SwLedBlink1(pLed);
 840                 break;
 841         case SW_LED_MODE2:
 842                 SwLedBlink2(pLed);
 843                 break;
 844         case SW_LED_MODE3:
 845                 SwLedBlink3(pLed);
 846                 break;
 847         case SW_LED_MODE4:
 848                 SwLedBlink4(pLed);
 849                 break;
 850         case SW_LED_MODE5:
 851                 SwLedBlink5(pLed);
 852                 break;
 853         case SW_LED_MODE6:
 854                 SwLedBlink6(pLed);
 855                 break;
 856         default:
 857                 SwLedBlink(pLed);
 858                 break;
 859         }
 860 }
 861 
 862 
 863 
 864 
 865 
 866 
 867 
 868 
 869 
 870 
 871 static void SwLedControlMode1(struct _adapter *padapter,
 872                               enum LED_CTL_MODE LedAction)
 873 {
 874         struct led_priv *ledpriv = &padapter->ledpriv;
 875         struct LED_871x *pLed = &ledpriv->SwLed0;
 876         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 877         struct sitesurvey_ctrl *psitesurveyctrl = &pmlmepriv->sitesurveyctrl;
 878 
 879         if (padapter->eeprompriv.CustomerID == RT_CID_819x_CAMEO)
 880                 pLed = &ledpriv->SwLed1;
 881         switch (LedAction) {
 882         case LED_CTL_START_TO_LINK:
 883         case LED_CTL_NO_LINK:
 884                 if (!pLed->bLedNoLinkBlinkInProgress) {
 885                         if (pLed->CurrLedState == LED_SCAN_BLINK ||
 886                             IS_LED_WPS_BLINKING(pLed))
 887                                 return;
 888                         if (pLed->bLedLinkBlinkInProgress) {
 889                                 del_timer(&pLed->BlinkTimer);
 890                                 pLed->bLedLinkBlinkInProgress = false;
 891                         }
 892                         if (pLed->bLedBlinkInProgress) {
 893                                 del_timer(&pLed->BlinkTimer);
 894                                 pLed->bLedBlinkInProgress = false;
 895                         }
 896                         pLed->bLedNoLinkBlinkInProgress = true;
 897                         pLed->CurrLedState = LED_BLINK_SLOWLY;
 898                         if (pLed->bLedOn)
 899                                 pLed->BlinkingLedState = LED_STATE_OFF;
 900                         else
 901                                 pLed->BlinkingLedState = LED_STATE_ON;
 902                         mod_timer(&pLed->BlinkTimer, jiffies +
 903                                   msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
 904                 }
 905                 break;
 906         case LED_CTL_LINK:
 907                 if (!pLed->bLedLinkBlinkInProgress) {
 908                         if (pLed->CurrLedState == LED_SCAN_BLINK ||
 909                             IS_LED_WPS_BLINKING(pLed))
 910                                 return;
 911                         if (pLed->bLedNoLinkBlinkInProgress) {
 912                                 del_timer(&pLed->BlinkTimer);
 913                                 pLed->bLedNoLinkBlinkInProgress = false;
 914                         }
 915                         if (pLed->bLedBlinkInProgress) {
 916                                 del_timer(&pLed->BlinkTimer);
 917                                 pLed->bLedBlinkInProgress = false;
 918                         }
 919                         pLed->bLedLinkBlinkInProgress = true;
 920                         pLed->CurrLedState = LED_BLINK_NORMAL;
 921                         if (pLed->bLedOn)
 922                                 pLed->BlinkingLedState = LED_STATE_OFF;
 923                         else
 924                                 pLed->BlinkingLedState = LED_STATE_ON;
 925                         mod_timer(&pLed->BlinkTimer, jiffies +
 926                                   msecs_to_jiffies(LED_BLINK_LINK_INTERVAL_ALPHA));
 927                 }
 928                 break;
 929         case LED_CTL_SITE_SURVEY:
 930                 if (psitesurveyctrl->traffic_busy &&
 931                     check_fwstate(pmlmepriv, _FW_LINKED))
 932                         ; 
 933                 else if (!pLed->bLedScanBlinkInProgress) {
 934                         if (IS_LED_WPS_BLINKING(pLed))
 935                                 return;
 936                         if (pLed->bLedNoLinkBlinkInProgress) {
 937                                 del_timer(&pLed->BlinkTimer);
 938                                 pLed->bLedNoLinkBlinkInProgress = false;
 939                         }
 940                         if (pLed->bLedLinkBlinkInProgress) {
 941                                 del_timer(&pLed->BlinkTimer);
 942                                 pLed->bLedLinkBlinkInProgress = false;
 943                         }
 944                         if (pLed->bLedBlinkInProgress) {
 945                                 del_timer(&pLed->BlinkTimer);
 946                                 pLed->bLedBlinkInProgress = false;
 947                         }
 948                         pLed->bLedScanBlinkInProgress = true;
 949                         pLed->CurrLedState = LED_SCAN_BLINK;
 950                         pLed->BlinkTimes = 24;
 951                         if (pLed->bLedOn)
 952                                 pLed->BlinkingLedState = LED_STATE_OFF;
 953                         else
 954                                 pLed->BlinkingLedState = LED_STATE_ON;
 955                         mod_timer(&pLed->BlinkTimer, jiffies +
 956                                   msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
 957                 }
 958                 break;
 959         case LED_CTL_TX:
 960         case LED_CTL_RX:
 961                 if (!pLed->bLedBlinkInProgress) {
 962                         if (pLed->CurrLedState == LED_SCAN_BLINK ||
 963                             IS_LED_WPS_BLINKING(pLed))
 964                                 return;
 965                         if (pLed->bLedNoLinkBlinkInProgress) {
 966                                 del_timer(&pLed->BlinkTimer);
 967                                 pLed->bLedNoLinkBlinkInProgress = false;
 968                         }
 969                         if (pLed->bLedLinkBlinkInProgress) {
 970                                 del_timer(&pLed->BlinkTimer);
 971                                 pLed->bLedLinkBlinkInProgress = false;
 972                         }
 973                         pLed->bLedBlinkInProgress = true;
 974                         pLed->CurrLedState = LED_TXRX_BLINK;
 975                         pLed->BlinkTimes = 2;
 976                         if (pLed->bLedOn)
 977                                 pLed->BlinkingLedState = LED_STATE_OFF;
 978                         else
 979                                 pLed->BlinkingLedState = LED_STATE_ON;
 980                         mod_timer(&pLed->BlinkTimer, jiffies +
 981                                   msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
 982                 }
 983                 break;
 984 
 985         case LED_CTL_START_WPS: 
 986         case LED_CTL_START_WPS_BOTTON:
 987                 if (!pLed->bLedWPSBlinkInProgress) {
 988                         if (pLed->bLedNoLinkBlinkInProgress) {
 989                                 del_timer(&pLed->BlinkTimer);
 990                                 pLed->bLedNoLinkBlinkInProgress = false;
 991                         }
 992                         if (pLed->bLedLinkBlinkInProgress) {
 993                                 del_timer(&pLed->BlinkTimer);
 994                                 pLed->bLedLinkBlinkInProgress = false;
 995                         }
 996                         if (pLed->bLedBlinkInProgress) {
 997                                 del_timer(&pLed->BlinkTimer);
 998                                 pLed->bLedBlinkInProgress = false;
 999                         }
1000                         if (pLed->bLedScanBlinkInProgress) {
1001                                 del_timer(&pLed->BlinkTimer);
1002                                 pLed->bLedScanBlinkInProgress = false;
1003                         }
1004                         pLed->bLedWPSBlinkInProgress = true;
1005                         pLed->CurrLedState = LED_BLINK_WPS;
1006                         if (pLed->bLedOn)
1007                                 pLed->BlinkingLedState = LED_STATE_OFF;
1008                         else
1009                                 pLed->BlinkingLedState = LED_STATE_ON;
1010                         mod_timer(&pLed->BlinkTimer, jiffies +
1011                                   msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
1012                 }
1013                 break;
1014         case LED_CTL_STOP_WPS:
1015                 if (pLed->bLedNoLinkBlinkInProgress) {
1016                         del_timer(&pLed->BlinkTimer);
1017                         pLed->bLedNoLinkBlinkInProgress = false;
1018                 }
1019                 if (pLed->bLedLinkBlinkInProgress) {
1020                         del_timer(&pLed->BlinkTimer);
1021                         pLed->bLedLinkBlinkInProgress = false;
1022                 }
1023                 if (pLed->bLedBlinkInProgress) {
1024                         del_timer(&pLed->BlinkTimer);
1025                         pLed->bLedBlinkInProgress = false;
1026                 }
1027                 if (pLed->bLedScanBlinkInProgress) {
1028                         del_timer(&pLed->BlinkTimer);
1029                         pLed->bLedScanBlinkInProgress = false;
1030                 }
1031                 if (pLed->bLedWPSBlinkInProgress)
1032                         del_timer(&pLed->BlinkTimer);
1033                 else
1034                         pLed->bLedWPSBlinkInProgress = true;
1035                 pLed->CurrLedState = LED_BLINK_WPS_STOP;
1036                 if (pLed->bLedOn) {
1037                         pLed->BlinkingLedState = LED_STATE_OFF;
1038                         mod_timer(&pLed->BlinkTimer, jiffies +
1039                                   msecs_to_jiffies(LED_BLINK_WPS_SUCCESS_INTERVAL_ALPHA));
1040                 } else {
1041                         pLed->BlinkingLedState = LED_STATE_ON;
1042                         mod_timer(&pLed->BlinkTimer,
1043                                   jiffies + msecs_to_jiffies(0));
1044                 }
1045                 break;
1046         case LED_CTL_STOP_WPS_FAIL:
1047                 if (pLed->bLedWPSBlinkInProgress) {
1048                         del_timer(&pLed->BlinkTimer);
1049                         pLed->bLedWPSBlinkInProgress = false;
1050                 }
1051                 pLed->bLedNoLinkBlinkInProgress = true;
1052                 pLed->CurrLedState = LED_BLINK_SLOWLY;
1053                 if (pLed->bLedOn)
1054                         pLed->BlinkingLedState = LED_STATE_OFF;
1055                 else
1056                         pLed->BlinkingLedState = LED_STATE_ON;
1057                 mod_timer(&pLed->BlinkTimer, jiffies +
1058                           msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
1059                 break;
1060         case LED_CTL_POWER_OFF:
1061                 pLed->CurrLedState = LED_STATE_OFF;
1062                 pLed->BlinkingLedState = LED_STATE_OFF;
1063                 if (pLed->bLedNoLinkBlinkInProgress) {
1064                         del_timer(&pLed->BlinkTimer);
1065                         pLed->bLedNoLinkBlinkInProgress = false;
1066                 }
1067                 if (pLed->bLedLinkBlinkInProgress) {
1068                         del_timer(&pLed->BlinkTimer);
1069                         pLed->bLedLinkBlinkInProgress = false;
1070                 }
1071                 if (pLed->bLedBlinkInProgress) {
1072                         del_timer(&pLed->BlinkTimer);
1073                         pLed->bLedBlinkInProgress = false;
1074                 }
1075                 if (pLed->bLedWPSBlinkInProgress) {
1076                         del_timer(&pLed->BlinkTimer);
1077                         pLed->bLedWPSBlinkInProgress = false;
1078                 }
1079                 if (pLed->bLedScanBlinkInProgress) {
1080                         del_timer(&pLed->BlinkTimer);
1081                         pLed->bLedScanBlinkInProgress = false;
1082                 }
1083                 mod_timer(&pLed->BlinkTimer,
1084                           jiffies + msecs_to_jiffies(0));
1085                 break;
1086         default:
1087                 break;
1088         }
1089 }
1090 
1091 static void SwLedControlMode2(struct _adapter *padapter,
1092                               enum LED_CTL_MODE LedAction)
1093 {
1094         struct led_priv  *ledpriv = &padapter->ledpriv;
1095         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1096         struct LED_871x *pLed = &ledpriv->SwLed0;
1097 
1098         switch (LedAction) {
1099         case LED_CTL_SITE_SURVEY:
1100                 if (pmlmepriv->sitesurveyctrl.traffic_busy)
1101                         ; 
1102                 else if (!pLed->bLedScanBlinkInProgress) {
1103                         if (IS_LED_WPS_BLINKING(pLed))
1104                                 return;
1105 
1106                         if (pLed->bLedBlinkInProgress) {
1107                                 del_timer(&pLed->BlinkTimer);
1108                                 pLed->bLedBlinkInProgress = false;
1109                         }
1110                         pLed->bLedScanBlinkInProgress = true;
1111                         pLed->CurrLedState = LED_SCAN_BLINK;
1112                         pLed->BlinkTimes = 24;
1113                         if (pLed->bLedOn)
1114                                 pLed->BlinkingLedState = LED_STATE_OFF;
1115                         else
1116                                 pLed->BlinkingLedState = LED_STATE_ON;
1117                         mod_timer(&pLed->BlinkTimer, jiffies +
1118                                   msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
1119                 }
1120                 break;
1121 
1122         case LED_CTL_TX:
1123         case LED_CTL_RX:
1124                 if (!pLed->bLedBlinkInProgress &&
1125                     check_fwstate(pmlmepriv, _FW_LINKED)) {
1126                         if (pLed->CurrLedState == LED_SCAN_BLINK ||
1127                             IS_LED_WPS_BLINKING(pLed))
1128                                 return;
1129                         pLed->bLedBlinkInProgress = true;
1130                         pLed->CurrLedState = LED_TXRX_BLINK;
1131                         pLed->BlinkTimes = 2;
1132                         if (pLed->bLedOn)
1133                                 pLed->BlinkingLedState = LED_STATE_OFF;
1134                         else
1135                                 pLed->BlinkingLedState = LED_STATE_ON;
1136                         mod_timer(&pLed->BlinkTimer, jiffies +
1137                                   msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
1138                 }
1139                 break;
1140 
1141         case LED_CTL_LINK:
1142                 pLed->CurrLedState = LED_STATE_ON;
1143                 pLed->BlinkingLedState = LED_STATE_ON;
1144                 if (pLed->bLedBlinkInProgress) {
1145                         del_timer(&pLed->BlinkTimer);
1146                         pLed->bLedBlinkInProgress = false;
1147                 }
1148                 if (pLed->bLedScanBlinkInProgress) {
1149                         del_timer(&pLed->BlinkTimer);
1150                         pLed->bLedScanBlinkInProgress = false;
1151                 }
1152 
1153                 mod_timer(&pLed->BlinkTimer,
1154                           jiffies + msecs_to_jiffies(0));
1155                 break;
1156 
1157         case LED_CTL_START_WPS: 
1158         case LED_CTL_START_WPS_BOTTON:
1159                 if (!pLed->bLedWPSBlinkInProgress) {
1160                         if (pLed->bLedBlinkInProgress) {
1161                                 del_timer(&pLed->BlinkTimer);
1162                                 pLed->bLedBlinkInProgress = false;
1163                         }
1164                         if (pLed->bLedScanBlinkInProgress) {
1165                                 del_timer(&pLed->BlinkTimer);
1166                                 pLed->bLedScanBlinkInProgress = false;
1167                         }
1168                         pLed->bLedWPSBlinkInProgress = true;
1169                         pLed->CurrLedState = LED_STATE_ON;
1170                         pLed->BlinkingLedState = LED_STATE_ON;
1171                         mod_timer(&pLed->BlinkTimer,
1172                                   jiffies + msecs_to_jiffies(0));
1173                 }
1174                 break;
1175 
1176         case LED_CTL_STOP_WPS:
1177                 pLed->bLedWPSBlinkInProgress = false;
1178                 pLed->CurrLedState = LED_STATE_ON;
1179                 pLed->BlinkingLedState = LED_STATE_ON;
1180                 mod_timer(&pLed->BlinkTimer,
1181                           jiffies + msecs_to_jiffies(0));
1182                 break;
1183 
1184         case LED_CTL_STOP_WPS_FAIL:
1185                 pLed->bLedWPSBlinkInProgress = false;
1186                 pLed->CurrLedState = LED_STATE_OFF;
1187                 pLed->BlinkingLedState = LED_STATE_OFF;
1188                 mod_timer(&pLed->BlinkTimer,
1189                           jiffies + msecs_to_jiffies(0));
1190                 break;
1191 
1192         case LED_CTL_START_TO_LINK:
1193         case LED_CTL_NO_LINK:
1194                 if (!IS_LED_BLINKING(pLed)) {
1195                         pLed->CurrLedState = LED_STATE_OFF;
1196                         pLed->BlinkingLedState = LED_STATE_OFF;
1197                         mod_timer(&pLed->BlinkTimer,
1198                                   jiffies + msecs_to_jiffies(0));
1199                 }
1200                 break;
1201         case LED_CTL_POWER_OFF:
1202                 pLed->CurrLedState = LED_STATE_OFF;
1203                 pLed->BlinkingLedState = LED_STATE_OFF;
1204                 if (pLed->bLedBlinkInProgress) {
1205                         del_timer(&pLed->BlinkTimer);
1206                         pLed->bLedBlinkInProgress = false;
1207                 }
1208                 if (pLed->bLedScanBlinkInProgress) {
1209                         del_timer(&pLed->BlinkTimer);
1210                         pLed->bLedScanBlinkInProgress = false;
1211                 }
1212                 if (pLed->bLedWPSBlinkInProgress) {
1213                         del_timer(&pLed->BlinkTimer);
1214                         pLed->bLedWPSBlinkInProgress = false;
1215                 }
1216                 mod_timer(&pLed->BlinkTimer,
1217                           jiffies + msecs_to_jiffies(0));
1218                 break;
1219         default:
1220                 break;
1221         }
1222 }
1223 
1224 static void SwLedControlMode3(struct _adapter *padapter,
1225                               enum LED_CTL_MODE LedAction)
1226 {
1227         struct led_priv *ledpriv = &padapter->ledpriv;
1228         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1229         struct LED_871x *pLed = &ledpriv->SwLed0;
1230 
1231         switch (LedAction) {
1232         case LED_CTL_SITE_SURVEY:
1233                 if (pmlmepriv->sitesurveyctrl.traffic_busy)
1234                         ; 
1235                 else if (!pLed->bLedScanBlinkInProgress) {
1236                         if (IS_LED_WPS_BLINKING(pLed))
1237                                 return;
1238                         if (pLed->bLedBlinkInProgress) {
1239                                 del_timer(&pLed->BlinkTimer);
1240                                 pLed->bLedBlinkInProgress = false;
1241                         }
1242                         pLed->bLedScanBlinkInProgress = true;
1243                         pLed->CurrLedState = LED_SCAN_BLINK;
1244                         pLed->BlinkTimes = 24;
1245                         if (pLed->bLedOn)
1246                                 pLed->BlinkingLedState = LED_STATE_OFF;
1247                         else
1248                                 pLed->BlinkingLedState = LED_STATE_ON;
1249                         mod_timer(&pLed->BlinkTimer, jiffies +
1250                                   msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
1251                 }
1252                 break;
1253         case LED_CTL_TX:
1254         case LED_CTL_RX:
1255                 if (!pLed->bLedBlinkInProgress &&
1256                     check_fwstate(pmlmepriv, _FW_LINKED)) {
1257                         if (pLed->CurrLedState == LED_SCAN_BLINK ||
1258                             IS_LED_WPS_BLINKING(pLed))
1259                                 return;
1260                         pLed->bLedBlinkInProgress = true;
1261                         pLed->CurrLedState = LED_TXRX_BLINK;
1262                         pLed->BlinkTimes = 2;
1263                         if (pLed->bLedOn)
1264                                 pLed->BlinkingLedState = LED_STATE_OFF;
1265                         else
1266                                 pLed->BlinkingLedState = LED_STATE_ON;
1267                         mod_timer(&pLed->BlinkTimer, jiffies +
1268                                   msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
1269                 }
1270                 break;
1271         case LED_CTL_LINK:
1272                 if (IS_LED_WPS_BLINKING(pLed))
1273                         return;
1274                 pLed->CurrLedState = LED_STATE_ON;
1275                 pLed->BlinkingLedState = LED_STATE_ON;
1276                 if (pLed->bLedBlinkInProgress) {
1277                         del_timer(&pLed->BlinkTimer);
1278                         pLed->bLedBlinkInProgress = false;
1279                 }
1280                 if (pLed->bLedScanBlinkInProgress) {
1281                         del_timer(&pLed->BlinkTimer);
1282                         pLed->bLedScanBlinkInProgress = false;
1283                 }
1284                 mod_timer(&pLed->BlinkTimer,
1285                           jiffies + msecs_to_jiffies(0));
1286                 break;
1287         case LED_CTL_START_WPS: 
1288         case LED_CTL_START_WPS_BOTTON:
1289                 if (!pLed->bLedWPSBlinkInProgress) {
1290                         if (pLed->bLedBlinkInProgress) {
1291                                 del_timer(&pLed->BlinkTimer);
1292                                 pLed->bLedBlinkInProgress = false;
1293                         }
1294                         if (pLed->bLedScanBlinkInProgress) {
1295                                 del_timer(&pLed->BlinkTimer);
1296                                 pLed->bLedScanBlinkInProgress = false;
1297                         }
1298                         pLed->bLedWPSBlinkInProgress = true;
1299                         pLed->CurrLedState = LED_BLINK_WPS;
1300                         if (pLed->bLedOn)
1301                                 pLed->BlinkingLedState = LED_STATE_OFF;
1302                         else
1303                                 pLed->BlinkingLedState = LED_STATE_ON;
1304                         mod_timer(&pLed->BlinkTimer, jiffies +
1305                                   msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
1306                 }
1307                 break;
1308         case LED_CTL_STOP_WPS:
1309                 if (pLed->bLedWPSBlinkInProgress) {
1310                         del_timer(&pLed->BlinkTimer);
1311                         pLed->bLedWPSBlinkInProgress = false;
1312                 } else {
1313                         pLed->bLedWPSBlinkInProgress = true;
1314                 }
1315                 pLed->CurrLedState = LED_BLINK_WPS_STOP;
1316                 if (pLed->bLedOn) {
1317                         pLed->BlinkingLedState = LED_STATE_OFF;
1318                         mod_timer(&pLed->BlinkTimer, jiffies +
1319                                   msecs_to_jiffies(LED_BLINK_WPS_SUCCESS_INTERVAL_ALPHA));
1320                 } else {
1321                         pLed->BlinkingLedState = LED_STATE_ON;
1322                         mod_timer(&pLed->BlinkTimer,
1323                                   jiffies + msecs_to_jiffies(0));
1324                 }
1325                 break;
1326         case LED_CTL_STOP_WPS_FAIL:
1327                 if (pLed->bLedWPSBlinkInProgress) {
1328                         del_timer(&pLed->BlinkTimer);
1329                         pLed->bLedWPSBlinkInProgress = false;
1330                 }
1331                 pLed->CurrLedState = LED_STATE_OFF;
1332                 pLed->BlinkingLedState = LED_STATE_OFF;
1333                 mod_timer(&pLed->BlinkTimer,
1334                           jiffies + msecs_to_jiffies(0));
1335                 break;
1336         case LED_CTL_START_TO_LINK:
1337         case LED_CTL_NO_LINK:
1338                 if (!IS_LED_BLINKING(pLed)) {
1339                         pLed->CurrLedState = LED_STATE_OFF;
1340                         pLed->BlinkingLedState = LED_STATE_OFF;
1341                         mod_timer(&pLed->BlinkTimer,
1342                                   jiffies + msecs_to_jiffies(0));
1343                 }
1344                 break;
1345         case LED_CTL_POWER_OFF:
1346                 pLed->CurrLedState = LED_STATE_OFF;
1347                 pLed->BlinkingLedState = LED_STATE_OFF;
1348                 if (pLed->bLedBlinkInProgress) {
1349                         del_timer(&pLed->BlinkTimer);
1350                         pLed->bLedBlinkInProgress = false;
1351                 }
1352                 if (pLed->bLedScanBlinkInProgress) {
1353                         del_timer(&pLed->BlinkTimer);
1354                         pLed->bLedScanBlinkInProgress = false;
1355                 }
1356                 if (pLed->bLedWPSBlinkInProgress) {
1357                         del_timer(&pLed->BlinkTimer);
1358                         pLed->bLedWPSBlinkInProgress = false;
1359                 }
1360                 mod_timer(&pLed->BlinkTimer,
1361                           jiffies + msecs_to_jiffies(0));
1362                 break;
1363         default:
1364                 break;
1365         }
1366 }
1367 
1368 static void SwLedControlMode4(struct _adapter *padapter,
1369                               enum LED_CTL_MODE LedAction)
1370 {
1371         struct led_priv *ledpriv = &padapter->ledpriv;
1372         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1373         struct LED_871x *pLed = &ledpriv->SwLed0;
1374         struct LED_871x *pLed1 = &ledpriv->SwLed1;
1375 
1376         switch (LedAction) {
1377         case LED_CTL_START_TO_LINK:
1378                 if (pLed1->bLedWPSBlinkInProgress) {
1379                         pLed1->bLedWPSBlinkInProgress = false;
1380                         del_timer(&pLed1->BlinkTimer);
1381                         pLed1->BlinkingLedState = LED_STATE_OFF;
1382                         pLed1->CurrLedState = LED_STATE_OFF;
1383                         if (pLed1->bLedOn)
1384                                 mod_timer(&pLed->BlinkTimer,
1385                                           jiffies + msecs_to_jiffies(0));
1386                 }
1387                 if (!pLed->bLedStartToLinkBlinkInProgress) {
1388                         if (pLed->CurrLedState == LED_SCAN_BLINK ||
1389                             IS_LED_WPS_BLINKING(pLed))
1390                                 return;
1391                         if (pLed->bLedBlinkInProgress) {
1392                                 del_timer(&pLed->BlinkTimer);
1393                                 pLed->bLedBlinkInProgress = false;
1394                         }
1395                         if (pLed->bLedNoLinkBlinkInProgress) {
1396                                 del_timer(&pLed->BlinkTimer);
1397                                 pLed->bLedNoLinkBlinkInProgress = false;
1398                         }
1399                         pLed->bLedStartToLinkBlinkInProgress = true;
1400                         pLed->CurrLedState = LED_BLINK_StartToBlink;
1401                         if (pLed->bLedOn) {
1402                                 pLed->BlinkingLedState = LED_STATE_OFF;
1403                                 mod_timer(&pLed->BlinkTimer, jiffies +
1404                                           msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
1405                         } else {
1406                                 pLed->BlinkingLedState = LED_STATE_ON;
1407                                 mod_timer(&pLed->BlinkTimer, jiffies +
1408                                           msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
1409                         }
1410                 }
1411                 break;
1412         case LED_CTL_LINK:
1413         case LED_CTL_NO_LINK:
1414                 
1415                 if (LedAction == LED_CTL_LINK) {
1416                         if (pLed1->bLedWPSBlinkInProgress) {
1417                                 pLed1->bLedWPSBlinkInProgress = false;
1418                                 del_timer(&pLed1->BlinkTimer);
1419                                 pLed1->BlinkingLedState = LED_STATE_OFF;
1420                                 pLed1->CurrLedState = LED_STATE_OFF;
1421                                 if (pLed1->bLedOn)
1422                                         mod_timer(&pLed->BlinkTimer,
1423                                                   jiffies + msecs_to_jiffies(0));
1424                         }
1425                 }
1426                 if (!pLed->bLedNoLinkBlinkInProgress) {
1427                         if (pLed->CurrLedState == LED_SCAN_BLINK ||
1428                             IS_LED_WPS_BLINKING(pLed))
1429                                 return;
1430                         if (pLed->bLedBlinkInProgress) {
1431                                 del_timer(&pLed->BlinkTimer);
1432                                 pLed->bLedBlinkInProgress = false;
1433                         }
1434                         pLed->bLedNoLinkBlinkInProgress = true;
1435                         pLed->CurrLedState = LED_BLINK_SLOWLY;
1436                         if (pLed->bLedOn)
1437                                 pLed->BlinkingLedState = LED_STATE_OFF;
1438                         else
1439                                 pLed->BlinkingLedState = LED_STATE_ON;
1440                         mod_timer(&pLed->BlinkTimer, jiffies +
1441                                   msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
1442                 }
1443                 break;
1444         case LED_CTL_SITE_SURVEY:
1445                 if (pmlmepriv->sitesurveyctrl.traffic_busy &&
1446                     check_fwstate(pmlmepriv, _FW_LINKED))
1447                         ;
1448                 else if (!pLed->bLedScanBlinkInProgress) {
1449                         if (IS_LED_WPS_BLINKING(pLed))
1450                                 return;
1451                         if (pLed->bLedNoLinkBlinkInProgress) {
1452                                 del_timer(&pLed->BlinkTimer);
1453                                 pLed->bLedNoLinkBlinkInProgress = false;
1454                         }
1455                         if (pLed->bLedBlinkInProgress) {
1456                                 del_timer(&pLed->BlinkTimer);
1457                                 pLed->bLedBlinkInProgress = false;
1458                         }
1459                         pLed->bLedScanBlinkInProgress = true;
1460                         pLed->CurrLedState = LED_SCAN_BLINK;
1461                         pLed->BlinkTimes = 24;
1462                         if (pLed->bLedOn)
1463                                 pLed->BlinkingLedState = LED_STATE_OFF;
1464                         else
1465                                 pLed->BlinkingLedState = LED_STATE_ON;
1466                         mod_timer(&pLed->BlinkTimer, jiffies +
1467                                   msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
1468                 }
1469                 break;
1470         case LED_CTL_TX:
1471         case LED_CTL_RX:
1472                 if (!pLed->bLedBlinkInProgress) {
1473                         if (pLed->CurrLedState == LED_SCAN_BLINK ||
1474                             IS_LED_WPS_BLINKING(pLed))
1475                                 return;
1476                         if (pLed->bLedNoLinkBlinkInProgress) {
1477                                 del_timer(&pLed->BlinkTimer);
1478                                 pLed->bLedNoLinkBlinkInProgress = false;
1479                         }
1480                         pLed->bLedBlinkInProgress = true;
1481                         pLed->CurrLedState = LED_TXRX_BLINK;
1482                         pLed->BlinkTimes = 2;
1483                         if (pLed->bLedOn)
1484                                 pLed->BlinkingLedState = LED_STATE_OFF;
1485                         else
1486                                 pLed->BlinkingLedState = LED_STATE_ON;
1487                         mod_timer(&pLed->BlinkTimer, jiffies +
1488                                   msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
1489                 }
1490                 break;
1491         case LED_CTL_START_WPS: 
1492         case LED_CTL_START_WPS_BOTTON:
1493                 if (pLed1->bLedWPSBlinkInProgress) {
1494                         pLed1->bLedWPSBlinkInProgress = false;
1495                         del_timer(&pLed1->BlinkTimer);
1496                         pLed1->BlinkingLedState = LED_STATE_OFF;
1497                         pLed1->CurrLedState = LED_STATE_OFF;
1498                         if (pLed1->bLedOn)
1499                                 mod_timer(&pLed->BlinkTimer,
1500                                           jiffies + msecs_to_jiffies(0));
1501                 }
1502                 if (!pLed->bLedWPSBlinkInProgress) {
1503                         if (pLed->bLedNoLinkBlinkInProgress) {
1504                                 del_timer(&pLed->BlinkTimer);
1505                                 pLed->bLedNoLinkBlinkInProgress = false;
1506                         }
1507                         if (pLed->bLedBlinkInProgress) {
1508                                 del_timer(&pLed->BlinkTimer);
1509                                 pLed->bLedBlinkInProgress = false;
1510                         }
1511                         if (pLed->bLedScanBlinkInProgress) {
1512                                 del_timer(&pLed->BlinkTimer);
1513                                 pLed->bLedScanBlinkInProgress = false;
1514                         }
1515                         pLed->bLedWPSBlinkInProgress = true;
1516                         pLed->CurrLedState = LED_BLINK_WPS;
1517                         if (pLed->bLedOn) {
1518                                 pLed->BlinkingLedState = LED_STATE_OFF;
1519                                 mod_timer(&pLed->BlinkTimer, jiffies +
1520                                           msecs_to_jiffies(LED_BLINK_SLOWLY_INTERVAL));
1521                         } else {
1522                                 pLed->BlinkingLedState = LED_STATE_ON;
1523                                 mod_timer(&pLed->BlinkTimer, jiffies +
1524                                           msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
1525                         }
1526                 }
1527                 break;
1528         case LED_CTL_STOP_WPS:  
1529                 if (pLed->bLedWPSBlinkInProgress) {
1530                         del_timer(&pLed->BlinkTimer);
1531                         pLed->bLedWPSBlinkInProgress = false;
1532                 }
1533                 pLed->bLedNoLinkBlinkInProgress = true;
1534                 pLed->CurrLedState = LED_BLINK_SLOWLY;
1535                 if (pLed->bLedOn)
1536                         pLed->BlinkingLedState = LED_STATE_OFF;
1537                 else
1538                         pLed->BlinkingLedState = LED_STATE_ON;
1539                 mod_timer(&pLed->BlinkTimer, jiffies +
1540                           msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
1541                 break;
1542         case LED_CTL_STOP_WPS_FAIL:     
1543                 if (pLed->bLedWPSBlinkInProgress) {
1544                         del_timer(&pLed->BlinkTimer);
1545                         pLed->bLedWPSBlinkInProgress = false;
1546                 }
1547                 pLed->bLedNoLinkBlinkInProgress = true;
1548                 pLed->CurrLedState = LED_BLINK_SLOWLY;
1549                 if (pLed->bLedOn)
1550                         pLed->BlinkingLedState = LED_STATE_OFF;
1551                 else
1552                         pLed->BlinkingLedState = LED_STATE_ON;
1553                 mod_timer(&pLed->BlinkTimer, jiffies +
1554                           msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
1555                 
1556                 if (pLed1->bLedWPSBlinkInProgress)
1557                         del_timer(&pLed1->BlinkTimer);
1558                 else
1559                         pLed1->bLedWPSBlinkInProgress = true;
1560                 pLed1->CurrLedState = LED_BLINK_WPS_STOP;
1561                 if (pLed1->bLedOn)
1562                         pLed1->BlinkingLedState = LED_STATE_OFF;
1563                 else
1564                         pLed1->BlinkingLedState = LED_STATE_ON;
1565                 mod_timer(&pLed->BlinkTimer, jiffies +
1566                           msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
1567                 break;
1568         case LED_CTL_STOP_WPS_FAIL_OVERLAP:     
1569                 if (pLed->bLedWPSBlinkInProgress) {
1570                         del_timer(&pLed->BlinkTimer);
1571                         pLed->bLedWPSBlinkInProgress = false;
1572                 }
1573                 pLed->bLedNoLinkBlinkInProgress = true;
1574                 pLed->CurrLedState = LED_BLINK_SLOWLY;
1575                 if (pLed->bLedOn)
1576                         pLed->BlinkingLedState = LED_STATE_OFF;
1577                 else
1578                         pLed->BlinkingLedState = LED_STATE_ON;
1579                 mod_timer(&pLed->BlinkTimer, jiffies +
1580                           msecs_to_jiffies(LED_BLINK_NO_LINK_INTERVAL_ALPHA));
1581                 
1582                 if (pLed1->bLedWPSBlinkInProgress)
1583                         del_timer(&pLed1->BlinkTimer);
1584                 else
1585                         pLed1->bLedWPSBlinkInProgress = true;
1586                 pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP;
1587                 pLed1->BlinkTimes = 10;
1588                 if (pLed1->bLedOn)
1589                         pLed1->BlinkingLedState = LED_STATE_OFF;
1590                 else
1591                         pLed1->BlinkingLedState = LED_STATE_ON;
1592                 mod_timer(&pLed->BlinkTimer, jiffies +
1593                           msecs_to_jiffies(LED_BLINK_NORMAL_INTERVAL));
1594                 break;
1595         case LED_CTL_POWER_OFF:
1596                 pLed->CurrLedState = LED_STATE_OFF;
1597                 pLed->BlinkingLedState = LED_STATE_OFF;
1598                 if (pLed->bLedNoLinkBlinkInProgress) {
1599                         del_timer(&pLed->BlinkTimer);
1600                         pLed->bLedNoLinkBlinkInProgress = false;
1601                 }
1602                 if (pLed->bLedLinkBlinkInProgress) {
1603                         del_timer(&pLed->BlinkTimer);
1604                         pLed->bLedLinkBlinkInProgress = false;
1605                 }
1606                 if (pLed->bLedBlinkInProgress) {
1607                         del_timer(&pLed->BlinkTimer);
1608                         pLed->bLedBlinkInProgress = false;
1609                 }
1610                 if (pLed->bLedWPSBlinkInProgress) {
1611                         del_timer(&pLed->BlinkTimer);
1612                         pLed->bLedWPSBlinkInProgress = false;
1613                 }
1614                 if (pLed->bLedScanBlinkInProgress) {
1615                         del_timer(&pLed->BlinkTimer);
1616                         pLed->bLedScanBlinkInProgress = false;
1617                 }
1618                 if (pLed->bLedStartToLinkBlinkInProgress) {
1619                         del_timer(&pLed->BlinkTimer);
1620                         pLed->bLedStartToLinkBlinkInProgress = false;
1621                 }
1622                 if (pLed1->bLedWPSBlinkInProgress) {
1623                         del_timer(&pLed1->BlinkTimer);
1624                         pLed1->bLedWPSBlinkInProgress = false;
1625                 }
1626                 pLed1->BlinkingLedState = LED_UNKNOWN;
1627                 SwLedOff(padapter, pLed);
1628                 SwLedOff(padapter, pLed1);
1629                 break;
1630         default:
1631                 break;
1632         }
1633 }
1634 
1635 static void SwLedControlMode5(struct _adapter *padapter,
1636                               enum LED_CTL_MODE LedAction)
1637 {
1638         struct led_priv *ledpriv = &padapter->ledpriv;
1639         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1640         struct LED_871x *pLed = &ledpriv->SwLed0;
1641 
1642         if (padapter->eeprompriv.CustomerID == RT_CID_819x_CAMEO)
1643                 pLed = &ledpriv->SwLed1;
1644 
1645         switch (LedAction) {
1646         case LED_CTL_POWER_ON:
1647         case LED_CTL_NO_LINK:
1648         case LED_CTL_LINK:      
1649                 if (pLed->CurrLedState == LED_SCAN_BLINK)
1650                         return;
1651                 pLed->CurrLedState = LED_STATE_ON;
1652                 pLed->BlinkingLedState = LED_STATE_ON;
1653                 pLed->bLedBlinkInProgress = false;
1654                 mod_timer(&pLed->BlinkTimer,
1655                           jiffies + msecs_to_jiffies(0));
1656                 break;
1657         case LED_CTL_SITE_SURVEY:
1658                 if (pmlmepriv->sitesurveyctrl.traffic_busy &&
1659                     check_fwstate(pmlmepriv, _FW_LINKED))
1660                         ; 
1661                 else if (!pLed->bLedScanBlinkInProgress) {
1662                         if (pLed->bLedBlinkInProgress) {
1663                                 del_timer(&pLed->BlinkTimer);
1664                                 pLed->bLedBlinkInProgress = false;
1665                         }
1666                         pLed->bLedScanBlinkInProgress = true;
1667                         pLed->CurrLedState = LED_SCAN_BLINK;
1668                         pLed->BlinkTimes = 24;
1669                         if (pLed->bLedOn)
1670                                 pLed->BlinkingLedState = LED_STATE_OFF;
1671                         else
1672                                 pLed->BlinkingLedState = LED_STATE_ON;
1673                         mod_timer(&pLed->BlinkTimer, jiffies +
1674                                   msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
1675                 }
1676                 break;
1677         case LED_CTL_TX:
1678         case LED_CTL_RX:
1679                 if (!pLed->bLedBlinkInProgress) {
1680                         if (pLed->CurrLedState == LED_SCAN_BLINK)
1681                                 return;
1682                         pLed->bLedBlinkInProgress = true;
1683                         pLed->CurrLedState = LED_TXRX_BLINK;
1684                         pLed->BlinkTimes = 2;
1685                         if (pLed->bLedOn)
1686                                 pLed->BlinkingLedState = LED_STATE_OFF;
1687                         else
1688                                 pLed->BlinkingLedState = LED_STATE_ON;
1689                         mod_timer(&pLed->BlinkTimer, jiffies +
1690                                   msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
1691                 }
1692                 break;
1693         case LED_CTL_POWER_OFF:
1694                 pLed->CurrLedState = LED_STATE_OFF;
1695                 pLed->BlinkingLedState = LED_STATE_OFF;
1696                 if (pLed->bLedBlinkInProgress) {
1697                         del_timer(&pLed->BlinkTimer);
1698                         pLed->bLedBlinkInProgress = false;
1699                 }
1700                 SwLedOff(padapter, pLed);
1701                 break;
1702         default:
1703                 break;
1704         }
1705 }
1706 
1707 static void SwLedControlMode6(struct _adapter *padapter,
1708                               enum LED_CTL_MODE LedAction)
1709 {
1710         struct led_priv *ledpriv = &padapter->ledpriv;
1711         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1712         struct LED_871x *pLed = &ledpriv->SwLed0;
1713 
1714         switch (LedAction) {
1715         case LED_CTL_POWER_ON:
1716         case LED_CTL_NO_LINK:
1717         case LED_CTL_LINK:      
1718         case LED_CTL_SITE_SURVEY:
1719                 if (IS_LED_WPS_BLINKING(pLed))
1720                         return;
1721                 pLed->CurrLedState = LED_STATE_ON;
1722                 pLed->BlinkingLedState = LED_STATE_ON;
1723                 pLed->bLedBlinkInProgress = false;
1724                 mod_timer(&pLed->BlinkTimer, jiffies + msecs_to_jiffies(0));
1725                 break;
1726         case LED_CTL_TX:
1727         case LED_CTL_RX:
1728                 if (!pLed->bLedBlinkInProgress &&
1729                     check_fwstate(pmlmepriv, _FW_LINKED)) {
1730                         if (IS_LED_WPS_BLINKING(pLed))
1731                                 return;
1732                         pLed->bLedBlinkInProgress = true;
1733                         pLed->CurrLedState = LED_TXRX_BLINK;
1734                         pLed->BlinkTimes = 2;
1735                         if (pLed->bLedOn)
1736                                 pLed->BlinkingLedState = LED_STATE_OFF;
1737                         else
1738                                 pLed->BlinkingLedState = LED_STATE_ON;
1739                         mod_timer(&pLed->BlinkTimer, jiffies +
1740                                   msecs_to_jiffies(LED_BLINK_FASTER_INTERVAL_ALPHA));
1741                 }
1742                 break;
1743         case LED_CTL_START_WPS: 
1744         case LED_CTL_START_WPS_BOTTON:
1745                 if (!pLed->bLedWPSBlinkInProgress) {
1746                         if (pLed->bLedBlinkInProgress) {
1747                                 del_timer(&pLed->BlinkTimer);
1748                                 pLed->bLedBlinkInProgress = false;
1749                         }
1750                         pLed->bLedWPSBlinkInProgress = true;
1751                         pLed->CurrLedState = LED_BLINK_WPS;
1752                         if (pLed->bLedOn)
1753                                 pLed->BlinkingLedState = LED_STATE_OFF;
1754                         else
1755                                 pLed->BlinkingLedState = LED_STATE_ON;
1756                         mod_timer(&pLed->BlinkTimer, jiffies +
1757                                   msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
1758                 }
1759                 break;
1760         case LED_CTL_STOP_WPS_FAIL:
1761         case LED_CTL_STOP_WPS:
1762                 if (pLed->bLedWPSBlinkInProgress) {
1763                         del_timer(&pLed->BlinkTimer);
1764                         pLed->bLedWPSBlinkInProgress = false;
1765                 }
1766                 pLed->CurrLedState = LED_STATE_ON;
1767                 pLed->BlinkingLedState = LED_STATE_ON;
1768                 mod_timer(&pLed->BlinkTimer,
1769                           jiffies + msecs_to_jiffies(0));
1770                 break;
1771         case LED_CTL_POWER_OFF:
1772                 pLed->CurrLedState = LED_STATE_OFF;
1773                 pLed->BlinkingLedState = LED_STATE_OFF;
1774                 if (pLed->bLedBlinkInProgress) {
1775                         del_timer(&pLed->BlinkTimer);
1776                         pLed->bLedBlinkInProgress = false;
1777                 }
1778                 if (pLed->bLedWPSBlinkInProgress) {
1779                         del_timer(&pLed->BlinkTimer);
1780                         pLed->bLedWPSBlinkInProgress = false;
1781                 }
1782                 SwLedOff(padapter, pLed);
1783                 break;
1784         default:
1785                 break;
1786         }
1787 }
1788 
1789 
1790 
1791 
1792 void LedControl871x(struct _adapter *padapter, enum LED_CTL_MODE LedAction)
1793 {
1794         struct led_priv *ledpriv = &padapter->ledpriv;
1795 
1796         if (!ledpriv->bRegUseLed)
1797                 return;
1798         switch (ledpriv->LedStrategy) {
1799         case SW_LED_MODE0:
1800                 break;
1801         case SW_LED_MODE1:
1802                 SwLedControlMode1(padapter, LedAction);
1803                 break;
1804         case SW_LED_MODE2:
1805                 SwLedControlMode2(padapter, LedAction);
1806                 break;
1807         case SW_LED_MODE3:
1808                 SwLedControlMode3(padapter, LedAction);
1809                 break;
1810         case SW_LED_MODE4:
1811                 SwLedControlMode4(padapter, LedAction);
1812                 break;
1813         case SW_LED_MODE5:
1814                 SwLedControlMode5(padapter, LedAction);
1815                 break;
1816         case SW_LED_MODE6:
1817                 SwLedControlMode6(padapter, LedAction);
1818                 break;
1819         default:
1820                 break;
1821         }
1822 }