]> err.no Git - linux-2.6/blobdiff - drivers/net/wireless/libertas/cmdresp.c
libertas: implement new scanning logic
[linux-2.6] / drivers / net / wireless / libertas / cmdresp.c
index 5165c91897a42251094b79c8c5ae2a5edc4a91e2..22a69736338197be61026a4cc200f216a16f562d 100644 (file)
@@ -799,7 +799,7 @@ int lbs_process_rx_command(struct lbs_private *priv)
        }
 
        /* Store the response code to cur_cmd_retcode. */
-       adapter->cur_cmd_retcode = result;;
+       adapter->cur_cmd_retcode = result;
 
        if (respcmd == CMD_RET(CMD_802_11_PS_MODE)) {
                struct cmd_ds_802_11_ps_mode *psmode = &resp->params.psmode;
@@ -856,13 +856,6 @@ int lbs_process_rx_command(struct lbs_private *priv)
                goto done;
        }
 
-       if (adapter->cur_cmd->cmdflags & CMD_F_HOSTCMD) {
-               /* Copy the response back to response buffer */
-               memcpy(adapter->cur_cmd->pdata_buf, resp,
-                      le16_to_cpu(resp->size));
-               adapter->cur_cmd->cmdflags &= ~CMD_F_HOSTCMD;
-       }
-
        /* If the command is not successful, cleanup and return failure */
        if ((result != 0 || !(respcmd & 0x8000))) {
                lbs_deb_host("CMD_RESP: error 0x%04x in command reply 0x%04x\n",
@@ -887,11 +880,22 @@ int lbs_process_rx_command(struct lbs_private *priv)
                goto done;
        }
 
-       spin_unlock_irqrestore(&adapter->driver_lock, flags);
-
-       ret = handle_cmd_response(respcmd, resp, priv);
-
-       spin_lock_irqsave(&adapter->driver_lock, flags);
+       if (adapter->cur_cmd->pdata_size) {
+               struct cmd_ds_gen *r = (struct cmd_ds_gen *)resp;
+               u16 sz = cpu_to_le16(resp->size) - S_DS_GEN;
+               if (sz > *adapter->cur_cmd->pdata_size) {
+                       lbs_pr_err("response 0x%04x doesn't fit into "
+                               "buffer (%d > %d)\n", respcmd,
+                               sz, *adapter->cur_cmd->pdata_size);
+                       sz = *adapter->cur_cmd->pdata_size;
+               }
+               memcpy(adapter->cur_cmd->pdata_buf, r->cmdresp, sz);
+               *adapter->cur_cmd->pdata_size = sz;
+       } else {
+               spin_unlock_irqrestore(&adapter->driver_lock, flags);
+               ret = handle_cmd_response(respcmd, resp, priv);
+               spin_lock_irqsave(&adapter->driver_lock, flags);
+       }
        if (adapter->cur_cmd) {
                /* Clean up and Put current command back to cmdfreeq */
                __lbs_cleanup_and_insert_cmd(priv, adapter->cur_cmd);
@@ -916,12 +920,12 @@ int lbs_process_event(struct lbs_private *priv)
        lbs_deb_enter(LBS_DEB_CMD);
 
        spin_lock_irq(&adapter->driver_lock);
-       eventcause = adapter->eventcause;
+       eventcause = adapter->eventcause >> SBI_EVENT_CAUSE_SHIFT;
        spin_unlock_irq(&adapter->driver_lock);
 
-       lbs_deb_cmd("event cause 0x%x\n", eventcause);
+       lbs_deb_cmd("event cause %d\n", eventcause);
 
-       switch (eventcause >> SBI_EVENT_CAUSE_SHIFT) {
+       switch (eventcause) {
        case MACREG_INT_CODE_LINK_SENSED:
                lbs_deb_cmd("EVENT: MACREG_INT_CODE_LINK_SENSED\n");
                break;
@@ -936,7 +940,7 @@ int lbs_process_event(struct lbs_private *priv)
                lbs_mac_event_disconnected(priv);
                break;
 
-       case MACREG_INT_CODE_LINK_LOSE_NO_SCAN:
+       case MACREG_INT_CODE_LINK_LOST_NO_SCAN:
                lbs_deb_cmd("EVENT: link lost\n");
                lbs_mac_event_disconnected(priv);
                break;
@@ -1030,8 +1034,7 @@ int lbs_process_event(struct lbs_private *priv)
                break;
 
        default:
-               lbs_pr_alert("EVENT: unknown event id 0x%04x\n",
-                      eventcause >> SBI_EVENT_CAUSE_SHIFT);
+               lbs_pr_alert("EVENT: unknown event id %d\n", eventcause);
                break;
        }