I'll want to investigate the behavior of my libertas CF card firmware, e.g. to decide if I can use the background scan feature of the card or not. Unfortunately, currently the firmware command execution is spread over several files, e.g. hostcmd.h, host.h, types.h, cmd.c, cmdresp.c and sometimes even other files. Add two very large switch() statements, a structure with a union of about 60 structs and misc functions at other places (do a "grep -l lbs_cmd_ *.c" to find out). It's not really easy to just-write-a-test for a specific firmware command. So I made a new function, lbs_cmd(), that is an easier substitute for subset of possible lbs_prepare_and_send_command(). I know that this might clash with David Woodhouse's cmd-cleanup attempt, but it seems that he didn't start yet, as my patches still apply to his git tree :-) I didn't commit them there, because I'm confused if my patches go upstream via David or John. Usage example ------------- When I want to deal with the CMD_802_11_BG_SCAN_QUERY command, I can now put all the code at one place to test it: // This is from firmware manual, Appendix A #define CMD_802_11_BG_SCAN_QUERY 0x006c // This is from firmware manual, section 5.7.3: struct cmd_scan_query { u8 flush; }; struct cmd_bg_scan_query_rsp { __le32 report_cond; __le16 bss_size; u8 num_sets; u8 bss[0]; }; // Allocate space for command response int rsp_size = sizeof(struct cmd_bg_scan_query_rsp) + 1024; struct cmd_bg_scan_query_rsp *rsp = kzalloc(rsp_size, GFP_KERNEL); // "Allocate" space for the command itself struct cmd_bg_scan_query cmd; cmd.flush = 0; // Send command and use result: res = lbs_cmd(priv, CMD_802_11_BG_SCAN_QUERY, &cmd, sizeof(cmd), rsp, &rsp_size); if (res == 0) printk("num_sets %d, resp_size %d\n", resp->num_sets, resp_size); Some notes: a) the cmd structs no longer need or care for the 4 common fields (command, size, seqnum, result) b) resp_size must be a pointer to an int, because some firmware functions return a variable amount of bytes and we need to know how much bytes that might be c) however, if you just get a fixed response (or the beginning of your response has fixed fields), you can simply use resp->(whatever field you want> to access it d) from 69 calls to lbs_prepare_and_send_command() 56 use CMD_OPTION_WAITFORRSP. So my first stab was using this. However, it would be possible to add a function pointer argument to lbs_cmd(), which could be called asynchronously if the result is there. A lbs_cmd_noop() could the be used for commands where one don't need the callback. The lbs_cmd() function could not only used while prototyping (as I need it), but also to slowly rewrite much of the ugly cmd.c / cmdresp.c code into an simpler way. In this patchset are also some cleanup patches. They depend on a patch that David Woodhouse has in his tree, but that isn't yet in wireless-2.6/everything. I've added this patch to the patch series as well. - To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html