libertas: fix buffer overrun
[safe/jmp/linux-2.6] / drivers / net / wireless / libertas / hostcmd.h
index 6477ce0..d9f9a12 100644 (file)
@@ -65,19 +65,21 @@ struct rxpd {
        u8 reserved[3];
 };
 
+struct cmd_header {
+       __le16 command;
+       __le16 size;
+       __le16 seqnum;
+       __le16 result;
+} __attribute__ ((packed));
+
 struct cmd_ctrl_node {
-       /* CMD link list */
        struct list_head list;
-       u32 status;
-       /* CMD ID */
-       u32 cmd_oid;
-       /*CMD wait option: wait for finish or no wait */
-       u16 wait_option;
-       /* command parameter */
-       void *pdata_buf;
-       /*command data */
-       u8 *bufvirtualaddr;
-       u16 cmdflags;
+       int result;
+       /* command response */
+       int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *);
+       unsigned long callback_arg;
+       /* command data */
+       struct cmd_header *cmdbuf;
        /* wait queue */
        u16 cmdwaitqwoken;
        wait_queue_head_t cmdwait_q;
@@ -104,14 +106,19 @@ struct cmd_ds_gen {
        __le16 size;
        __le16 seqnum;
        __le16 result;
+       void *cmdresp[0];
 };
 
 #define S_DS_GEN sizeof(struct cmd_ds_gen)
+
+
 /*
  * Define data structure for CMD_GET_HW_SPEC
  * This structure defines the response for the GET_HW_SPEC command
  */
 struct cmd_ds_get_hw_spec {
+       struct cmd_header hdr;
+
        /* HW Interface version number */
        __le16 hwifversion;
        /* HW version number */
@@ -129,8 +136,8 @@ struct cmd_ds_get_hw_spec {
        /* Number of antenna used */
        __le16 nr_antenna;
 
-       /* FW release number, example 1,2,3,4 = 3.2.1p4 */
-       u8 fwreleasenumber[4];
+       /* FW release number, example 0x01030304 = 2.3.4p1 */
+       __le32 fwrelease;
 
        /* Base Address of TxPD queue */
        __le32 wcb_base;
@@ -144,13 +151,18 @@ struct cmd_ds_get_hw_spec {
        __le32 fwcapinfo;
 } __attribute__ ((packed));
 
-struct cmd_ds_802_11_reset {
-       __le16 action;
-};
-
 struct cmd_ds_802_11_subscribe_event {
+       struct cmd_header hdr;
+
        __le16 action;
        __le16 events;
+
+       /* A TLV to the CMD_802_11_SUBSCRIBE_EVENT command can contain a
+        * number of TLVs. From the v5.1 manual, those TLVs would add up to
+        * 40 bytes. However, future firmware might add additional TLVs, so I
+        * bump this up a bit.
+        */
+       uint8_t tlv[128];
 };
 
 /*
@@ -158,9 +170,11 @@ struct cmd_ds_802_11_subscribe_event {
  * Define data structure for CMD_802_11_SCAN
  */
 struct cmd_ds_802_11_scan {
-       u8 bsstype;
-       u8 bssid[ETH_ALEN];
-       u8 tlvbuffer[1];
+       struct cmd_header hdr;
+
+       uint8_t bsstype;
+       uint8_t bssid[ETH_ALEN];
+       uint8_t tlvbuffer[0];
 #if 0
        mrvlietypes_ssidparamset_t ssidParamSet;
        mrvlietypes_chanlistparamset_t ChanListParamSet;
@@ -169,12 +183,16 @@ struct cmd_ds_802_11_scan {
 };
 
 struct cmd_ds_802_11_scan_rsp {
+       struct cmd_header hdr;
+
        __le16 bssdescriptsize;
-       u8 nr_sets;
-       u8 bssdesc_and_tlvbuffer[1];
+       uint8_t nr_sets;
+       uint8_t bssdesc_and_tlvbuffer[0];
 };
 
 struct cmd_ds_802_11_get_log {
+       struct cmd_header hdr;
+
        __le32 mcasttxframe;
        __le32 failed;
        __le32 retry;
@@ -191,11 +209,13 @@ struct cmd_ds_802_11_get_log {
 };
 
 struct cmd_ds_mac_control {
+       struct cmd_header hdr;
        __le16 action;
-       __le16 reserved;
+       u16 reserved;
 };
 
 struct cmd_ds_mac_multicast_adr {
+       struct cmd_header hdr;
        __le16 action;
        __le16 nr_of_adrs;
        u8 maclist[ETH_ALEN * MRVDRV_MAX_MULTICAST_LIST_SIZE];
@@ -208,7 +228,9 @@ struct cmd_ds_802_11_authenticate {
 };
 
 struct cmd_ds_802_11_deauthenticate {
-       u8 macaddr[6];
+       struct cmd_header hdr;
+
+       u8 macaddr[ETH_ALEN];
        __le16 reasoncode;
 };
 
@@ -227,21 +249,13 @@ struct cmd_ds_802_11_associate {
 #endif
 } __attribute__ ((packed));
 
-struct cmd_ds_802_11_disassociate {
-       u8 destmacaddr[6];
-       __le16 reasoncode;
-};
-
 struct cmd_ds_802_11_associate_rsp {
        struct ieeetypes_assocrsp assocRsp;
 };
 
-struct cmd_ds_802_11_ad_hoc_result {
-       u8 pad[3];
-       u8 bssid[ETH_ALEN];
-};
-
 struct cmd_ds_802_11_set_wep {
+       struct cmd_header hdr;
+
        /* ACT_ADD, ACT_REMOVE or ACT_ENABLE */
        __le16 action;
 
@@ -249,8 +263,8 @@ struct cmd_ds_802_11_set_wep {
        __le16 keyindex;
 
        /* 40, 128bit or TXWEP */
-       u8 keytype[4];
-       u8 keymaterial[4][16];
+       uint8_t keytype[4];
+       uint8_t keymaterial[4][16];
 };
 
 struct cmd_ds_802_3_get_stat {
@@ -283,7 +297,9 @@ struct cmd_ds_802_11_get_stat {
 };
 
 struct cmd_ds_802_11_snmp_mib {
-       __le16 querytype;
+       struct cmd_header hdr;
+
+       __le16 action;
        __le16 oid;
        __le16 bufsize;
        u8 value[128];
@@ -328,11 +344,21 @@ struct cmd_ds_rf_reg_access {
 };
 
 struct cmd_ds_802_11_radio_control {
+       struct cmd_header hdr;
+
        __le16 action;
        __le16 control;
 };
 
+struct cmd_ds_802_11_beacon_control {
+       __le16 action;
+       __le16 beacon_enable;
+       __le16 beacon_period;
+};
+
 struct cmd_ds_802_11_sleep_params {
+       struct cmd_header hdr;
+
        /* ACT_GET/ACT_SET */
        __le16 action;
 
@@ -346,16 +372,18 @@ struct cmd_ds_802_11_sleep_params {
        __le16 stabletime;
 
        /* control periodic calibration */
-       u8 calcontrol;
+       uint8_t calcontrol;
 
        /* control the use of external sleep clock */
-       u8 externalsleepclk;
+       uint8_t externalsleepclk;
 
        /* reserved field, should be set to zero */
        __le16 reserved;
 };
 
 struct cmd_ds_802_11_inactivity_timeout {
+       struct cmd_header hdr;
+
        /* ACT_GET/ACT_SET */
        __le16 action;
 
@@ -364,11 +392,13 @@ struct cmd_ds_802_11_inactivity_timeout {
 };
 
 struct cmd_ds_802_11_rf_channel {
+       struct cmd_header hdr;
+
        __le16 action;
-       __le16 currentchannel;
-       __le16 rftype;
-       __le16 reserved;
-       u8 channellist[32];
+       __le16 channel;
+       __le16 rftype;      /* unused */
+       __le16 reserved;    /* unused */
+       u8 channellist[32]; /* unused */
 };
 
 struct cmd_ds_802_11_rssi {
@@ -388,13 +418,19 @@ struct cmd_ds_802_11_rssi_rsp {
 };
 
 struct cmd_ds_802_11_mac_address {
+       struct cmd_header hdr;
+
        __le16 action;
        u8 macadd[ETH_ALEN];
 };
 
 struct cmd_ds_802_11_rf_tx_power {
+       struct cmd_header hdr;
+
        __le16 action;
-       __le16 currentlevel;
+       __le16 curlevel;
+       s8 maxlevel;
+       s8 minlevel;
 };
 
 struct cmd_ds_802_11_rf_antenna {
@@ -406,13 +442,29 @@ struct cmd_ds_802_11_rf_antenna {
 };
 
 struct cmd_ds_802_11_monitor_mode {
-       u16 action;
-       u16 mode;
+       __le16 action;
+       __le16 mode;
 };
 
 struct cmd_ds_set_boot2_ver {
-       u16 action;
-       u16 version;
+       struct cmd_header hdr;
+
+       __le16 action;
+       __le16 version;
+};
+
+struct cmd_ds_802_11_fw_wake_method {
+       struct cmd_header hdr;
+
+       __le16 action;
+       __le16 method;
+};
+
+struct cmd_ds_802_11_sleep_period {
+       struct cmd_header hdr;
+
+       __le16 action;
+       __le16 period;
 };
 
 struct cmd_ds_802_11_ps_mode {
@@ -423,36 +475,38 @@ struct cmd_ds_802_11_ps_mode {
        __le16 locallisteninterval;
 };
 
-struct PS_CMD_ConfirmSleep {
-       __le16 command;
-       __le16 size;
-       __le16 seqnum;
-       __le16 result;
+struct cmd_confirm_sleep {
+       struct cmd_header hdr;
 
        __le16 action;
-       __le16 reserved1;
+       __le16 nullpktinterval;
        __le16 multipledtim;
        __le16 reserved;
        __le16 locallisteninterval;
 };
 
 struct cmd_ds_802_11_data_rate {
+       struct cmd_header hdr;
+
        __le16 action;
        __le16 reserved;
        u8 rates[MAX_RATES];
 };
 
 struct cmd_ds_802_11_rate_adapt_rateset {
+       struct cmd_header hdr;
        __le16 action;
        __le16 enablehwauto;
        __le16 bitmap;
 };
 
 struct cmd_ds_802_11_ad_hoc_start {
+       struct cmd_header hdr;
+
        u8 ssid[IW_ESSID_MAX_SIZE];
        u8 bsstype;
        __le16 beaconperiod;
-       u8 dtimperiod;
+       u8 dtimperiod;   /* Reserved on v9 and later */
        union IEEEtypes_ssparamset ssparamset;
        union ieeetypes_phyparamset phyparamset;
        __le16 probedelay;
@@ -461,9 +515,16 @@ struct cmd_ds_802_11_ad_hoc_start {
        u8 tlv_memory_size_pad[100];
 } __attribute__ ((packed));
 
+struct cmd_ds_802_11_ad_hoc_result {
+       struct cmd_header hdr;
+
+       u8 pad[3];
+       u8 bssid[ETH_ALEN];
+};
+
 struct adhoc_bssdesc {
-       u8 bssid[6];
-       u8 ssid[32];
+       u8 bssid[ETH_ALEN];
+       u8 ssid[IW_ESSID_MAX_SIZE];
        u8 type;
        __le16 beaconperiod;
        u8 dtimperiod;
@@ -481,13 +542,20 @@ struct adhoc_bssdesc {
 } __attribute__ ((packed));
 
 struct cmd_ds_802_11_ad_hoc_join {
+       struct cmd_header hdr;
+
        struct adhoc_bssdesc bss;
-       __le16 failtimeout;
-       __le16 probedelay;
+       __le16 failtimeout;   /* Reserved on v9 and later */
+       __le16 probedelay;    /* Reserved on v9 and later */
+} __attribute__ ((packed));
 
+struct cmd_ds_802_11_ad_hoc_stop {
+       struct cmd_header hdr;
 } __attribute__ ((packed));
 
 struct cmd_ds_802_11_enable_rsn {
+       struct cmd_header hdr;
+
        __le16 action;
        __le16 enable;
 } __attribute__ ((packed));
@@ -512,41 +580,57 @@ struct MrvlIEtype_keyParamSet {
        u8 key[32];
 };
 
+struct cmd_ds_host_sleep {
+       struct cmd_header hdr;
+       __le32 criteria;
+       uint8_t gpio;
+       uint8_t gap;
+} __attribute__ ((packed));
+
 struct cmd_ds_802_11_key_material {
+       struct cmd_header hdr;
+
        __le16 action;
        struct MrvlIEtype_keyParamSet keyParamSet[2];
 } __attribute__ ((packed));
 
 struct cmd_ds_802_11_eeprom_access {
+       struct cmd_header hdr;
        __le16 action;
-
-       /* multiple 4 */
        __le16 offset;
-       __le16 bytecount;
-       u8 value;
+       __le16 len;
+       /* firmware says it returns a maximum of 20 bytes */
+#define LBS_EEPROM_READ_LEN 20
+       u8 value[LBS_EEPROM_READ_LEN];
 } __attribute__ ((packed));
 
 struct cmd_ds_802_11_tpc_cfg {
+       struct cmd_header hdr;
+
        __le16 action;
-       u8 enable;
-       s8 P0;
-       s8 P1;
-       s8 P2;
-       u8 usesnr;
+       uint8_t enable;
+       int8_t P0;
+       int8_t P1;
+       int8_t P2;
+       uint8_t usesnr;
 } __attribute__ ((packed));
 
-struct cmd_ds_802_11_led_ctrl {
+
+struct cmd_ds_802_11_pa_cfg {
+       struct cmd_header hdr;
+
        __le16 action;
-       __le16 numled;
-       u8 data[256];
+       uint8_t enable;
+       int8_t P0;
+       int8_t P1;
+       int8_t P2;
 } __attribute__ ((packed));
 
-struct cmd_ds_802_11_pwr_cfg {
+
+struct cmd_ds_802_11_led_ctrl {
        __le16 action;
-       u8 enable;
-       s8 PA_P0;
-       s8 PA_P1;
-       s8 PA_P2;
+       __le16 numled;
+       u8 data[256];
 } __attribute__ ((packed));
 
 struct cmd_ds_802_11_afc {
@@ -598,7 +682,21 @@ struct cmd_ds_fwt_access {
        u8 prec[ETH_ALEN];
 } __attribute__ ((packed));
 
+
+struct cmd_ds_mesh_config {
+       struct cmd_header hdr;
+
+        __le16 action;
+        __le16 channel;
+        __le16 type;
+        __le16 length;
+        u8 data[128];   /* last position reserved */
+} __attribute__ ((packed));
+
+
 struct cmd_ds_mesh_access {
+       struct cmd_header hdr;
+
        __le16 action;
        __le32 data[32];        /* last position reserved */
 } __attribute__ ((packed));
@@ -615,59 +713,31 @@ struct cmd_ds_command {
 
        /* command Body */
        union {
-               struct cmd_ds_get_hw_spec hwspec;
                struct cmd_ds_802_11_ps_mode psmode;
-               struct cmd_ds_802_11_scan scan;
-               struct cmd_ds_802_11_scan_rsp scanresp;
-               struct cmd_ds_mac_control macctrl;
                struct cmd_ds_802_11_associate associate;
-               struct cmd_ds_802_11_deauthenticate deauth;
-               struct cmd_ds_802_11_set_wep wep;
-               struct cmd_ds_802_11_ad_hoc_start ads;
-               struct cmd_ds_802_11_reset reset;
-               struct cmd_ds_802_11_ad_hoc_result result;
-               struct cmd_ds_802_11_get_log glog;
                struct cmd_ds_802_11_authenticate auth;
                struct cmd_ds_802_11_get_stat gstat;
                struct cmd_ds_802_3_get_stat gstat_8023;
-               struct cmd_ds_802_11_snmp_mib smib;
-               struct cmd_ds_802_11_rf_tx_power txp;
                struct cmd_ds_802_11_rf_antenna rant;
                struct cmd_ds_802_11_monitor_mode monitor;
-               struct cmd_ds_802_11_data_rate drate;
-               struct cmd_ds_802_11_rate_adapt_rateset rateset;
-               struct cmd_ds_mac_multicast_adr madr;
-               struct cmd_ds_802_11_ad_hoc_join adj;
-               struct cmd_ds_802_11_radio_control radio;
-               struct cmd_ds_802_11_rf_channel rfchannel;
                struct cmd_ds_802_11_rssi rssi;
                struct cmd_ds_802_11_rssi_rsp rssirsp;
-               struct cmd_ds_802_11_disassociate dassociate;
-               struct cmd_ds_802_11_mac_address macadd;
-               struct cmd_ds_802_11_enable_rsn enbrsn;
-               struct cmd_ds_802_11_key_material keymaterial;
                struct cmd_ds_mac_reg_access macreg;
                struct cmd_ds_bbp_reg_access bbpreg;
                struct cmd_ds_rf_reg_access rfreg;
-               struct cmd_ds_802_11_eeprom_access rdeeprom;
 
                struct cmd_ds_802_11d_domain_info domaininfo;
                struct cmd_ds_802_11d_domain_info domaininforesp;
 
-               struct cmd_ds_802_11_sleep_params sleep_params;
-               struct cmd_ds_802_11_inactivity_timeout inactivity_timeout;
                struct cmd_ds_802_11_tpc_cfg tpccfg;
-               struct cmd_ds_802_11_pwr_cfg pwrcfg;
                struct cmd_ds_802_11_afc afc;
                struct cmd_ds_802_11_led_ctrl ledgpio;
 
                struct cmd_tx_rate_query txrate;
                struct cmd_ds_bt_access bt;
                struct cmd_ds_fwt_access fwt;
-               struct cmd_ds_mesh_access mesh;
-               struct cmd_ds_set_boot2_ver boot2_ver;
                struct cmd_ds_get_tsf gettsf;
-               struct cmd_ds_802_11_subscribe_event subscribe_event;
+               struct cmd_ds_802_11_beacon_control bcn_ctrl;
        } params;
 } __attribute__ ((packed));