diff options
author | Holger Schurig <hs4233@mail.mn-solutions.de> | 2007-11-26 04:07:14 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 18:04:55 -0500 |
commit | 3a1886491710c196656a005fcc693172f5bb4c8a (patch) | |
tree | c33009fb8cacd0fdea6fe7b7fdb7b5269c3063e4 /drivers/net/wireless/libertas/cmd.c | |
parent | 69f9032d9dfeb763b467fdbe8cf5938f5457083a (diff) |
libertas: rework event subscription
This patch moves re-works the implementation of event subscription
via debugfs. For this:
* it tells cmd.c and cmdresp.c about CMD_802_11_SUBSCRIBE_EVENT
* removes lots of low-level cmd stuff from debugfs.c
* create unified functions to read/write snr, rssi, bcnmiss and
failcount
* introduces #define's for subscription event bitmask values
* add a function to search for a specific element in an IE
(a.k.a. TLV)
* add a function to find out the size of the TLV. This is needed
because lbs_prepare_and_send_command() has an argument for a
data buffer, but not for it's lengths and TLVs can be, by
definition, vary in size.
* fix a bug where it was not possible to disable an event
Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Acked-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/libertas/cmd.c')
-rw-r--r-- | drivers/net/wireless/libertas/cmd.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c index dde17c65bccd..d98bec92474b 100644 --- a/drivers/net/wireless/libertas/cmd.c +++ b/drivers/net/wireless/libertas/cmd.c | |||
@@ -246,6 +246,52 @@ static int lbs_cmd_802_11_enable_rsn(struct lbs_private *priv, | |||
246 | } | 246 | } |
247 | 247 | ||
248 | 248 | ||
249 | static ssize_t lbs_tlv_size(const u8 *tlv, u16 size) | ||
250 | { | ||
251 | ssize_t pos = 0; | ||
252 | struct mrvlietypesheader *tlv_h; | ||
253 | while (pos < size) { | ||
254 | u16 length; | ||
255 | tlv_h = (struct mrvlietypesheader *) tlv; | ||
256 | if (tlv_h->len == 0) | ||
257 | return pos; | ||
258 | length = le16_to_cpu(tlv_h->len) + | ||
259 | sizeof(struct mrvlietypesheader); | ||
260 | pos += length; | ||
261 | tlv += length; | ||
262 | } | ||
263 | return pos; | ||
264 | } | ||
265 | |||
266 | |||
267 | static void lbs_cmd_802_11_subscribe_event(struct lbs_private *priv, | ||
268 | struct cmd_ds_command *cmd, u16 cmd_action, | ||
269 | void *pdata_buf) | ||
270 | { | ||
271 | struct cmd_ds_802_11_subscribe_event *events = | ||
272 | (struct cmd_ds_802_11_subscribe_event *) pdata_buf; | ||
273 | |||
274 | /* pdata_buf points to a struct cmd_ds_802_11_subscribe_event and room | ||
275 | * for various Marvell TLVs */ | ||
276 | |||
277 | lbs_deb_enter(LBS_DEB_CMD); | ||
278 | |||
279 | cmd->size = cpu_to_le16(sizeof(*events) | ||
280 | - sizeof(events->tlv) | ||
281 | + S_DS_GEN); | ||
282 | cmd->params.subscribe_event.action = cpu_to_le16(cmd_action); | ||
283 | if (cmd_action == CMD_ACT_GET) { | ||
284 | cmd->params.subscribe_event.events = 0; | ||
285 | } else { | ||
286 | ssize_t sz = lbs_tlv_size(events->tlv, sizeof(events->tlv)); | ||
287 | cmd->size = cpu_to_le16(le16_to_cpu(cmd->size) + sz); | ||
288 | cmd->params.subscribe_event.events = events->events; | ||
289 | memcpy(cmd->params.subscribe_event.tlv, events->tlv, sz); | ||
290 | } | ||
291 | |||
292 | lbs_deb_leave(LBS_DEB_CMD); | ||
293 | } | ||
294 | |||
249 | static void set_one_wpa_key(struct MrvlIEtype_keyParamSet * pkeyparamset, | 295 | static void set_one_wpa_key(struct MrvlIEtype_keyParamSet * pkeyparamset, |
250 | struct enc_key * pkey) | 296 | struct enc_key * pkey) |
251 | { | 297 | { |
@@ -1394,6 +1440,10 @@ int lbs_prepare_and_send_command(struct lbs_private *priv, | |||
1394 | ret = 0; | 1440 | ret = 0; |
1395 | break; | 1441 | break; |
1396 | } | 1442 | } |
1443 | case CMD_802_11_SUBSCRIBE_EVENT: | ||
1444 | lbs_cmd_802_11_subscribe_event(priv, cmdptr, | ||
1445 | cmd_action, pdata_buf); | ||
1446 | break; | ||
1397 | case CMD_802_11_PWR_CFG: | 1447 | case CMD_802_11_PWR_CFG: |
1398 | cmdptr->command = cpu_to_le16(CMD_802_11_PWR_CFG); | 1448 | cmdptr->command = cpu_to_le16(CMD_802_11_PWR_CFG); |
1399 | cmdptr->size = | 1449 | cmdptr->size = |