]> 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 3596957f1d5a414367aac3def5f0e92969c9c006..22a69736338197be61026a4cc200f216a16f562d 100644 (file)
@@ -31,7 +31,7 @@ void lbs_mac_event_disconnected(struct lbs_private *priv)
        if (adapter->connect_status != LBS_CONNECTED)
                return;
 
-       lbs_deb_enter(LBS_DEB_CMD);
+       lbs_deb_enter(LBS_DEB_ASSOC);
 
        memset(wrqu.ap_addr.sa_data, 0x00, ETH_ALEN);
        wrqu.ap_addr.sa_family = ARPHRD_ETHER;
@@ -60,11 +60,6 @@ void lbs_mac_event_disconnected(struct lbs_private *priv)
        memset(adapter->rawNF, 0x00, sizeof(adapter->rawNF));
        adapter->nextSNRNF = 0;
        adapter->numSNRNF = 0;
-       lbs_deb_cmd("current SSID '%s', length %u\n",
-                   escape_essid(adapter->curbssparams.ssid,
-                                adapter->curbssparams.ssid_len),
-                   adapter->curbssparams.ssid_len);
-
        adapter->connect_status = LBS_DISCONNECTED;
 
        /* Clear out associated SSID and BSSID since connection is
@@ -554,6 +549,26 @@ static int lbs_ret_802_11_bcn_ctrl(struct lbs_private * priv,
        return 0;
 }
 
+static int lbs_ret_802_11_subscribe_event(struct lbs_private *priv,
+       struct cmd_ds_command *resp)
+{
+       struct lbs_adapter *adapter = priv->adapter;
+       struct cmd_ds_802_11_subscribe_event *cmd_event =
+               &resp->params.subscribe_event;
+       struct cmd_ds_802_11_subscribe_event *dst_event =
+               adapter->cur_cmd->pdata_buf;
+
+       lbs_deb_enter(LBS_DEB_CMD);
+
+       if (dst_event->action == cpu_to_le16(CMD_ACT_GET)) {
+               dst_event->events = le16_to_cpu(cmd_event->events);
+               memcpy(dst_event->tlv, cmd_event->tlv, sizeof(dst_event->tlv));
+       }
+
+       lbs_deb_leave(LBS_DEB_CMD);
+       return 0;
+}
+
 static inline int handle_cmd_response(u16 respcmd,
                                      struct cmd_ds_command *resp,
                                      struct lbs_private *priv)
@@ -689,6 +704,10 @@ static inline int handle_cmd_response(u16 respcmd,
                        sizeof(struct cmd_ds_802_11_led_ctrl));
                spin_unlock_irqrestore(&adapter->driver_lock, flags);
                break;
+       case CMD_RET(CMD_802_11_SUBSCRIBE_EVENT):
+               ret = lbs_ret_802_11_subscribe_event(priv, resp);
+               break;
+
        case CMD_RET(CMD_802_11_PWR_CFG):
                spin_lock_irqsave(&adapter->driver_lock, flags);
                memmove(adapter->cur_cmd->pdata_buf, &resp->params.pwrcfg,
@@ -780,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;
@@ -837,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",
@@ -868,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);
@@ -897,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;
@@ -917,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;
@@ -1011,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;
        }